【ant design vue】a-tree树形组件获取数据及回显

1.获取数据

首先,数据自然是tree结构的,这中间自然会有一些对数据的处理,说一下常用处理:

 1.将数据的属性处理为组件要求的属性

 使用组件提供的该属性:replaceFields="{ key:'id',title:'name',children:'children'}"

<a-tree
    :replaceFields="{ key:'id',title:'zhName',children:'children'}"
    v-model="checkedKeys"
/>

2.渲染完a-tree组件的时候,组件为收缩状态,希望为展示状态

渲染组件数据时,组件为收缩状态,如下:

那我们想要渲染完组件是展开的,如下:

解决方法,在组件上使用v-if对渲染的数据(treeData做判断,有数据的时候则渲染):

<a-tree
    v-if="treeData && treeData.length > 0"
    v-model="checkedKeys"
/>

2.将选中的数据回显到a-tree组件上

a-tree的组件很奇怪,获取时,取到所有tree节点的id,回显时却只需要tree节点最深层的子id,很多人应该这个问题都选择了手写tree组件,我找了很久,终于找到了回显的方法

参考该博客(https://blog.csdn.net/sunnyjingqi/article/details/110202457  ,该作者写的是react版本,但逻辑其实一样)进行如下改造: 

明确一点:我们从后端取到的节点数据为tree结构选中的所有节点的id,但实际上,我们只需要获取最深层的子id来进行展示

1.从完整的treeData遍历出最深层的节点(所有子节点及没有子节点的节点)

//methods中的方法
deepList(data){
     data.map((item) => {
     if (item.children && item.children.length > 0) {
           this.deepList(item.children);
        } else {
            //test数组存放  
            this.test.push(item.id);
        }
      });
}


//调用
this.deepList(this.treeData);

2.将后台返回的数据(含父节点的)与该deepList方法遍历出来的结果test数组做一个交集,即取到选中的子节点

//tmpList 后台拿到的结果,为字符串数组,存放的是节点id
const result = [...new Set(this.test)].filter((item) => new Set(eval(this.tmpList)).has(item));

//将结果赋值给v-model绑定的属性
this.checkedKeys = [...result];

3.善后(对a-tree的一些优化处理)

  • 有些从后台拿到的数据不是字符串数组,需进行处理,其次,处理后的结构(比如a数组)可能还需要赋值给别的变量(比如a数组赋值给b数组)可将b数组用于一些判断(比如判断a-tree组件节点是否有被选中等等)
  • 从后台获取选中的节点数据时,对spinning值(ant design vue的Spin组件)进行变化,这样在选中的节点数据渲染上时会有一个蒙层加载的效果,如下:
<a-spin :spinning="spinning">
   <div class="spin-content">
        <a-tree
         v-if="treeData && treeData.length > 0" 
         :tree-data="treeData"
         class="tree"
         :replaceFields="{ key:'id',title:'name',children:'children'}"
         v-model="checkedKeys"
        />
    </div>
</a-spin>

猜你喜欢

转载自blog.csdn.net/THcoding_Cat/article/details/113847898
今日推荐