elementui的tree组件如何实现数据的双向绑定?

发布于 2022-09-06 05:36:35 字数 5270 浏览 11 评论 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也一样..我没办法将更改状态后的效果提现出来

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文