ant design vue 的 a-tree父节点半选的提交及反显问题

文章讲述了在使用Vue的A-Tree组件实现多级权限选择时,如何处理反显和提交时的逻辑,包括处理checkedKeys的变化、半选节点、历史选择记录,以及如何通过遍历获取叶子节点和比较数组元素来实现正确功能。
摘要由CSDN通过智能技术生成

a-tree的@check="onCheck"

onCheck(checkedKeys, e) {
  console.log("onCheck", checkedKeys);
  console.log("halfCheckedKeys",e.halfCheckedKeys)
  this.checkedKeysIsChange=true;//点击选中,checkedKeys已恢复正常
  this.checkedKeys = checkedKeys;//选择部分
  this.halfCheckedKeys=e.halfCheckedKeys;//半选部分
},

data(){}

checkedKeys: [],
halfCheckedKeys:[],//半选父节点
selectedKeys: [],
treeData: null,
leafData:[],//叶子节点
historyCheckedKeys:[],//历史选择节点
checkedKeysIsChange:false,//回显之后,是否有点击变更选中节点(由于反显是通过叶子节点的key列表来反显的,此时checkedKeys不包含父节点(表面选中),只有触发onCheck才会恢复正常,所以当checkedKeysIsChange为false时,应该提交历史缓存数据)

提交时

//由于反显是通过叶子节点的key列表来反显的,此时checkedKeys不包含父节点(表面选中),
//只有触发onCheck才会恢复正常,所以当checkedKeysIsChange为false时,应该提交历史缓存数据historyCheckedKeys
if(this.checkedKeysIsChange){
    this.form.authorityIds = this.checkedKeys.concat(this.halfCheckedKeys).join(",");
}else{
    this.form.authorityIds = this.historyCheckedKeys.join(",");
}

反显时,只需要选中tree节点最深层的叶子节点即可反显成功,但是有个问题此时如果再提交,也只是提交这一些叶子节点的key,除非再触发一次oncheck,就能够恢复正常,所以这里我的解决方案时,保留一份历史选择key,当没有触发oncheck时,提交历史选择的key。

//从完整的treeData遍历出最深层的节点(所有子节点及没有子节点的节点)
    getLeafList(data){
     data.map((item) => {
     if (item.children && item.children.length > 0) {
           this.getLeafList(item.children);
        } else {
            //leafData数组存放  
            this.leafData.push(item.key);
        }
      });
    },
    //获取两个数组中的公共元素
    findCommonElements(arr1, arr2) {
      return arr1.filter(item => arr2.includes(item));
    }
    init() {
      this.checkedKeys = [];
	    this.leafData=[];
      getMgmAuthorityTree({
        roleId: this.form.roleId
      }).then(res => {
        this.treeData = res.data.data;
        //获取叶子节点
        this.getLeafList(res.data.data);
        //反显
        getProjectAuthorityByRole({
          roleId: this.form.roleId,
          projectId: this.projectId
        }).then(res => {
          //由于反显是通过叶子节点的key列表来反显的,此时checkedKeys不包含父节点(表面选中),
          //只有触发onCheck才会恢复正常,所以需要记录历史缓存数据 historyCheckedKeys
          this.checkedKeysIsChange=false;
          this.historyCheckedKeys=res.data.data;
          this.checkedKeys = this.findCommonElements(res.data.data,this.leafData)
        });
      });
    },

          <a-tree
            v-model="checkedKeys"
            checkable
            :expanded-keys="expandedKeys"
            :auto-expand-parent="autoExpandParent"
            :selected-keys="selectedKeys"
            :tree-data="treeData"
            @expand="onExpand"
            @select="onSelect"
            @check="onCheck"
          />

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Ant Design Vue 中的 A-Tree 组件提供了一个 `checkable` 属性来实现全选功能。通过将 `checkable` 属性设置为 true,将会在每个节点旁边显示一个复选框,用户可以通过勾选这些复选框来选择节点。 如果您想要实现全选功能,可以在 A-Tree 的顶层节点上添加一个全选的复选框,并通过监听 `on-check` 事件来控制所有节点的选中状态。具体实现方法如下: 1. 在 A-Tree 的根节点上添加一个全选的复选框: ```html <a-tree :checkable="true" :checked-keys="checkedKeys" @check="handleCheck"> <a-tree-node :title="rootTitle" :key="rootKey"> <!-- 全选复选框 --> <template slot="title"> <a-checkbox v-model="allChecked">全选</a-checkbox> {{ rootTitle }} </template> <!-- 树节点 --> <a-tree-node v-for="node in nodes" :title="node.title" :key="node.key"></a-tree-node> </a-tree-node> </a-tree> ``` 2. 在 Vue 实例中定义 `allChecked` 和 `checkedKeys` 变量,并在 `handleCheck` 方法中更新所有节点的选中状态: ```js data() { return { allChecked: false, // 全选状态 checkedKeys: [], // 选中的节点 key nodes: [...] // 树节点数据 } }, methods: { handleCheck(checkedKeys) { // 更新选中状态 this.checkedKeys = checkedKeys; // 如果全选复选框被勾选,则选中所有节点;否则取消所有节点的选中状态 if (this.allChecked) { this.$refs.tree.setCheckedKeys(this.nodes.map(node => node.key)); } else { this.$refs.tree.setCheckedKeys([]); } } } ``` 3. 在 A-Tree 上添加一个 `ref` 属性,以便在 Vue 实例中引用该组件: ```html <a-tree ref="tree" ...> ``` 现在,您可以通过勾选顶层树节点旁边的全选复选框来实现 A-Tree 的全选功能了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值