el-tree-transfer穿梭框踩了的坑

下载

npm install el-tree-transfer --save

多个根节点案例(一个根节点就是官方案例,其实是一样的)

 <tree-transfer
     :from_data="fromData"
     :to_data="toData"
     :defaultProps="{ label: 'label' }"
     @add-btn="add"
     @remove-btn="remove"
     :mode="mode"
     height="540px"
     filter
     openAll
     >
</tree-transfer>
import treeTransfer from "el-tree-transfer"; // 引入
export default {
  data() {
    return {
      mode: "transfer", // transfer addressList
      fromData: [
        {
          id: "1",
          pid: 0,
          label: "一级 1",
          children: [
            {
              id: "1-1",
              pid: "1",
              label: "二级 1-1",
              children: [],
            },
            {
              id: "1-2",
              pid: "1",
              label: "二级 1-2",
              children: [
                {
                  id: "1-2-2",
                  pid: "1-2",
                  children: [],
                  label: "二级 1-2-2",
                },
              ],
            },
          ],
        },
      ],
      toData: [
        {
          id: "1",
          pid: 0,
          label: "一级 1",
          children: [
            {
              id: "1-1",
              pid: "1",
              label: "二级 1-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",
                },
              ],
            },
          ],
        },
        {
          id: "2",
          pid: 0,
          label: "一级 2",
          children: [
            {
              id: "2-1",
              pid: "2",
              label: "二级 2-1",
              children: [],
            },
            {
              id: "2-2",
              pid: "2",
              label: "二级 2-2",
              children: [
                {
                  id: "2-2-1",
                  pid: "2-2",
                  children: [],
                  label: "二级 2-2-1",
                },
                {
                  id: "2-2-2",
                  pid: "2-2",
                  children: [],
                  label: "二级 2-2-2",
                },
              ],
            },
          ],
        },
        {
          id: "3",
          pid: 0,
          label: "一级 3",
          children: [
            {
              id: "3-1",
              pid: "3",
              label: "二级 3-1",
              children: [],
            },
            {
              id: "3-2",
              pid: "3",
              label: "二级 3-2",
              children: [
                {
                  id: "3-2-1",
                  pid: "3-2",
                  children: [],
                  label: "二级 3-2-1",
                },
                {
                  id: "3-2-2",
                  pid: "3-2",
                  children: [],
                  label: "二级 3-2-2",
                },
              ],
            },
          ],
        },
      ],
    };
  },
 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);
    },
     getAddress() {
      this.fromData.forEach((item) => {
        //el-tree-transfer组件的第一个pid必须为0
        item.pid = 0;
      });
      this.toData.forEach((item) => {
        item.pid = 0;
      });

在参考了其他人的文档以后,我知道了根节点的pid必须是为0开头,但是他们没有说,这个必须是数字类型!后面的子节点的pid同父级的id。如果不是数据类型,就会出现大问题!在右侧数据并到左边的时候,会出现数据丢失等情况。所以就会有代码的后面一个getAddress()方法,来调整所有根节点的pid都设置为0,如果是死数据,可以把方法放在create进行调用,如果是通过接口获取数据,可以把方法放在获取到数据后进行调用。我因为一开始 ,没和后端同事协调好,他给的pid的字符串类型,结果出现了数据的移动丢失或多次渲染的情况。。 

 数据发生了丢失!

正是因为会出现如上问题,最好把id和pid的类型设为一致。如果id和pid的类型不一致,还会出现重复渲染并报如下错误

Duplicate keys detected: 'XXX'. This may cause an update error. 

所以~一定要和 后端同事进行协调,给的数据一定要是同一类型~找了半天bug不知道原因呜呜呜

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值