el-tree-transfer树形穿梭框回显左右节点重复问题

项目开发过程中遇到个问题 

数据进行回显的时候 左右的节点会重复 网上介绍这个问题的特别少

有的说是node-key 其实怎么说呢 配置了好久发现这个根本就是存在的bug

我也不知道为啥很少介绍这个bug的存在的

先贴出问题图

<template>
  <div>
    // 你的代码
    ...
    // 使用树形穿梭框组件
    {{ toData }}
    <tree-transfer
      :title="title"
      :from_data='fromData'
      :to_data='toData'
      :defaultProps="{label:'label'}"
      @add-btn='add'
      @remove-btn='remove'
      :mode='mode'
      height='540px'
      filter
      openAll
    ></tree-transfer>
  </div>
</template>

<script>
import treeTransfer from 'el-tree-transfer' // 引入

export default {
  data () {
    return {
      title: ['源列表', '目标列表'],
      mode: 'transfer', // transfer addressList
      fromData: [
        {
          id: '1',
          pid: 0,
          label: '一级 1',
          children: [
            {
              id: '1-1',
              pid: '1',
              label: '二级 1-1',
              disabled: true,
              children: []
            },
            {
              id: '1-2',
              pid: '1',
              label: '二级 1-2',
              children: [
                {
                  id: '1-2-1',
                  pid: '1-2',
                  children: [],
                  label: '二级 1-2-1'
                },
                {
                  id: '1-2-2',
                  pid: '1-2',
                  children: [],
                  label: '二级 1-2-2'
                }
              ]
            }
          ]
        },
      ],
      toData: [ { "id": "1", "pid": 0, "label": "一级 1", "children": [ { "id": "1-2", "pid": "1", "label": "二级 1-2", "children": [ { "id": "1-2-1", "pid": "1-2", "children": [], "label": "二级 1-2-1" }, { "id": "1-2-2", "pid": "1-2", "children": [], "label": "二级 1-2-2" } ] } ] } ],
      rightIds: [],
    }
  },
  methods: {
    // 切换模式 现有树形穿梭框模式transfer 和通讯录模式addressList
    changeMode () {
      if (this.mode == 'transfer') {
        this.mode = 'addressList'
      } else {
        this.mode = 'transfer'
      }
    },
    // 监听穿梭框组件添加
    add (fromData, toData, obj) {
      // 树形穿梭框模式transfer时,返回参数为左侧树移动后数据、右侧树移动后数据、移动的{keys,nodes,halfKeys,halfNodes}对象
      // 通讯录模式addressList时,返回参数为右侧收件人列表、右侧抄送人列表、右侧密送人列表
      console.log('fromData:', fromData)
      console.log('toData:', toData)
      console.log('obj:', obj)
    },
    // 监听穿梭框组件移除
    remove (fromData, toData, obj) {
      // 树形穿梭框模式transfer时,返回参数为左侧树移动后数据、右侧树移动后数据、移动的{keys,nodes,halfKeys,halfNodes}对象
      // 通讯录模式addressList时,返回参数为右侧收件人列表、右侧抄送人列表、右侧密送人列表
      console.log('fromData:', fromData)
      console.log('toData:', toData)
      console.log('obj:', obj)
    },
    // 获取右侧数据 id
    getRightDataIds(list, rightIds) {
      for (let rightItem of list) {
        rightIds.push(rightItem.id);
        if (rightItem.children && rightItem.children.length) {
          this.getRightDataIds(rightItem.children, rightIds);
        }
      }
      return rightIds;
    },
    // 处理过滤数据
    getFilterLeftData() {
      let rightIds = this.getRightDataIds(this.toData, []);
      this.fromData = this.filterLeftData(this.fromData, rightIds, []);
    },
    filterLeftData(list, rightIds, newList) {
      for (let leftItem of list) {
        if (rightIds.includes(leftItem.id)) {
          if (leftItem.children && leftItem.children.length) {
            let insetBool = false;
            for (let child of leftItem.children) {
              if (!rightIds.includes(child.id)) insetBool = true;
            }
            if (insetBool) {
              let jsonItem = JSON.parse(JSON.stringify(leftItem));
              jsonItem.children = [];
              newList.push(jsonItem);
              this.filterLeftData(leftItem.children, rightIds, jsonItem.children);
            }
          }
        } else {
          let jsonItem = JSON.parse(JSON.stringify(leftItem));
          jsonItem.children = [];
          newList.push(jsonItem);
        }
      }
      return newList;
    },
  },
  components: { treeTransfer }, // 注册
  mounted () {
    this.getFilterLeftData();
  },
}
</script>

<style>
</style>

 解决之后的逻辑

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值