账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    elementui的tree组件如何实现数据的双向绑定?
    69
    0

    目前碰到一个非常棘手的问题,当前项目采用的是vue+elemenuUI,有这样一个业务场景:
    页面中有三个视图:
    1,一个tree组件(采用的elementui的tree)

    [{
        Id,
        Name,
        status,
        Type
        Children:
            [{
                Id,
                Name,
                GIS,   // 地图坐标 [lng,lat]
                status,  // 三种状态(未选,半选,全选)
                Type,
            }]
    }]

    2,一个百度地图

    [{
        Id,
        Name,
        GIS,   // 地图坐标 [lng,lat]
        status,  // 三种状态(未选,半选,全选)
        Type
    }]

    3,一个可以分类的列表(采用的elementui的tabs跟table组件)

    [{
        Id,
        Name,
        status,   // 两种状态
        Type
    }]
    

    数据源一次性从后台拉过来之后.三个视图的数据全部同步显示.默认都是未勾选状态.
    要实现的功能就是三种视图的状态同步。

    他们都有选中,未选中状态,(地图还有半选中状态),为什么会有半选中状态..因为我们的业务场景是这样:
    一个设备下绑定了很多个设备
    拉回来的数据可能是这样的:

        [
            {
              id: 1,
              name: "分类一",
              children: [
                {
                  id: 4,
                  name: "综合设备",
                  status: // 未选,全选,半选  
                  children: [
                    {
                      id: 11,
                      name: "子设备1",
                      status: false,
                      type: "class1"
                    },
                    {
                      id: 21,
                      name: "子设备2",
                      status: false,
                      type: "class2"
                    },
                    {
                      id: 31,
                      name: "子设备3",
                      status: false,
                      type: "class3"
                    }
                  ]
               },
               {
              id: 2,
              name: "分类二",
              children: [
                {
                  id: 3,
                  name: "综合设备二",
                  status: // 未选,全选,半选
                  children: [
                    {
                      id: 12,
                      name: "子设备4",
                      status: false,
                      type: "class1"
                    },
                    {
                      id: 22,
                      name: "子设备5",
                      status: false,
                      type: "class2"
                    },
                    {
                      id: 32,
                      name: "子设备6",
                      status: false,
                      type: "class3"
                    }
                  ]
               }
            ]

    也就是说tree组件的某个节点(包括父节点)选中之后。。地图跟分类列表都要状态同步。。反之其它也一样。。table还有全选功能

    table这儿的分类标签实现方式:
    因为数据分类不确定。只能动态循环加载。每个table绑定的数据源是经过过滤的源数据
    tab标签的分类是后台返回的,数据结构大概是这样:

    tabList: [
            {
              label: "设备分类一",
              type: "class1"
            },
            {
              label: "设备分类二",
              type: "class2"
            },
            {
              label: "设备分类二",
              type: "class2"
            }
          ]
    <el-tabs type="border-card">
                <el-tab-pane v-for="(item,index) in tabList" :key="item.label">
                  <span slot="label"><i class="el-icon-date"></i> {{item.label}}</span>
                  <el-table 
                    :data="sortByType(originalData,item.type)" 
                    height="350" 
                    v-loading.body="listLoading"
                    element-loading-text="拼命加载中"
                    @select="handleSelect"
                    @select-all="handleSelectAll(sortByType(originalData,item.type))"
                    :ref="item.type"
                    fit highlight-current-row>
                    <el-table-column type="selection"></el-table-column>
                    <el-table-column :key="item.dataIndex" v-for="(item,index) in columns" :label="item.text">
                      <template slot-scope="scope">
                        {{scope.row[item.dataIndex]}}
                      </template>
                    </el-table-column>
                  </el-table>
                </el-tab-pane>
              </el-tabs>
    // 源数据结构
    originalData: [
            {
              id: 11,
              name: "设备一",
              checked: false,
              type: "class1"
            },
            {
              id: 12,
              name: "设备二"",
              checked: false,
              type: "class1"
            },
            {
              id: 13,
              name: "设备三",
              checked: false,
              type: "class1"
            },
            {
              id: 21,
              name: "LED一",
              checked: false,
              type: "class2"
            },
            {
              id: 22,
              name: "LED二",
              checked: false,
              type: "class2"
            },
            {
              id: 31,
              name: "视频一",
              checked: false,
              type: "class3"
            },
            {
              id: 32,
              name: "视频三",
              checked: false,
              type: "class3"
            }
          ]
          
    // 分类显示数据
    sortByType(data, type) {
      return data.filter(value => {
        return value.type === type;
      });
    }

    也就是通过type来显示分类数据,这儿的实现方式很难看。:data="sortByType(originalData,item.type)" 不知道还有没有其它办法.

    我目前的想法是以tree的数据结构作为源数据绑定,地图数据跟分类的table列表绑定源数据通过computed计算之后的结果.(比如上面的originalData,因为这儿的数据结构不一样,不知道是否可行?)
    地图就只拉取综合设备的所有节点,如果他的叶子节点没有全选中。就返回半选中状态。这儿也是一个难点.

    但现在的难题在于因为tree组件是没办法直接更改他绑定的数据源的数据状态.包括table组件的checkbox也一样..我没办法将更改状态后的效果提现出来

    不知道大家有没有碰到过类似的场景。。我该怎么解决目前的业务场景。。我的想法也很不成熟。。还望大家多多指教。。感谢!

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 京紫的第三人称 普通会员 1楼

      在Element UI的Tree组件中,数据的双向绑定可以通过自定义数据源(Scope)来实现。以下是一个简单的示例:

      ```javascript import { Tree } from 'element-ui';

      // 自定义数据源 const data = [ { path: '部门', children: [ { path: '经理', children: [ { path: '张三', children: [ { path: '李四', children: [] } ] } ] } ] }, { path: '员工', children: [ { path: '张三', children: [] }, { path: '李四', children: [ { path: '王五', children: [] } ] } ] } ];

      // 创建Tree组件 const tree = new Tree({ data, defaultExpandedKeys: ['经理'], showLine: true, lineStyle: { width: '100%' } });

      // 绑定数据源 tree.connect('node', 'value').connect('parent', 'children');

      // 在数据发生变化时触发更新事件 tree.$on('update', () => { console.log(tree.data); });

      // 在数据发生变化时触发渲染事件 tree.$on('render', () => { console.log(tree.$el.innerHTML); }); ```

      在这个示例中,我们首先定义了一个自定义数据源,然后在Tree组件中创建了一个Tree对象。我们还使用connect方法将数据源和Tree组件的属性进行绑定。然后,我们使用$on方法监听数据的变化事件,当数据发生变化时,Tree组件将触发更新事件。最后,我们使用$on方法监听Tree组件的渲染事件,当数据发生变化时,Tree组件将触发渲染事件。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部