ant design tree 选择子节点是否关联父节点

选择某个子菜单时,需要将父菜单也发送过去,后端要判断权限,如果只发子菜单,就做不到匹配,导致父菜单都不会显示在菜单栏。

需要解决的问题是antd tree中,父子节点是受控的,默认如果只选择一个子节点,就只把这一个子节点放进数组,如果选择了父节点下的所有子节点,就会将父节点也放进去。现在需要的是,只选择一个子节点的时候,也将父节点放进去。但是antd tree组件没有提供这个属性。于是自己按照后台给的list数组和checkedKeys进行匹配来生成新的数组。

https://ant.design/components/tree-cn/ 

做法如下:

在onCheck事件中进行处理,

 [
     {id:1,name:'xx1',parentId:0},
     {id:2,name:'xx2',parentId:1},
     {id:3,name:'xx3',parentId:1},
     {id:4,name:'xx4',parentId:0},
     {id:5,name:'xx5',parentId:4},
     {id:6,name:'xx6',parentId:0},
     {id:7,name:'xx7',parentId:6},
     {id:8,name:'xx8',parentId:6},
     {id:9,name:'xx9',parentId:6}

]

后台给的这个tree的数据是id parentId这样的格式,不是遍历好的对象。所以在生成tree的时候,前端这边遍历了一下生成treeData需要的数据,。

 treeListData = (data,parentId) => {
        var result = [] , temp;
        for(var i in data){
            if(data[i].parentId==parentId){
                result.push(data[i]);
                temp = this.treeListData(data,data[i].id);           
                if(temp.length>0){
                    data[i].children=temp;
                }           
            }       
        }
        return result;
    }

得到如下数据和tree

[
    {id: 1, name: "xx1", parentId: 0, 
    children:[
        {id: 2, name: "xx2", parentId: 1},
        {id: 3, name: "xx3", parentId: 1}
    ]},
    {id: 4, name: "xx4", parentId: 0,
    children:[
        {id: 5, name: "xx5", parentId: 4}
    ]},
    {id: 6, name: "xx6", parentId: 0,
    children:[
        {id: 7, name: "xx7", parentId: 6},
        {id: 8, name: "xx8", parentId: 6},
        {id: 9, name: "xx9", parentId: 6}
    ]}
]


需要解决的是当选择某一个子节点的时候,父节点也被放在数组中

方法:

onCheck = (checkedKeys) => {
        const result = data.filter(item => {
            for (let i = 0; i<checkedKeys.length; i++ ) {
                if (checkedKeys[i] === item.id) {
                    return true
                } 
            }       
        }).map(item => item.parentId)
        const checkedKeysResult = Array.from(new Set(result.concat(checkedKeys))).filter(item => item>0)
        this.setState({ 
            checkedKeys,
            checkedKeysResult
        });
}

data是指未经处理从后台接口拿过来的那个数组。

其中,checkedKeys是被选择的子节点的集合,如果只选择了某个子节点 ,在这个数组中是没有父节点的。

checkedKeysResult 是经过处理后的数组,会将子节点对应的父节点通过匹配,去重,放入这个数组中,往后台发送也将是这个数组。

 

PS:发现这个做法真的是low爆了,

其实官方文档有很好的解决方法:

Tree组件提供的onCheck方法中带了两个参数,其中info这个参数中有一个叫做halfCheckedKeys的数组,它专门存贮的半勾选状态的节点(比如子节点没有勾选完全时,父节点就会被存储到这里)。
 

    onCheck = (checkedKeys,info) => {
        let checkedKeysResult = [...checkedKeys, ...info.halfCheckedKeys];
        this.setState({ 
            checkedKeys,
            checkedKeysResult
        });
    }

可以参考这个博客:

https://blog.csdn.net/zr15829039341/article/details/82784850 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Ant Design Vue中的Tree组件中,您可以使用异步加载数据来实现选中父节点就展开子节点的功能。以下是实现该功能的步骤: 1. 定义Tree节点的数据源,包括节点的id、名称、父节点id等属性。 2. 在Tree组件中设置show-expand属性为true,这将显示展开和折叠图标。 3. 设置Tree组件的load-data属性,指定异步加载数据的方法,该方法将根据父节点id加载子节点数据。 4. 在Tree组件的节点模板中,使用 @click.native 事件监听节点的点击事件,并在事件处理程序中判断当前节点是否子节点,如果有则展开,否则不展开。 下面是一个示例代码,用于实现选中父节点就展开子节点的功能: ```html <template> <a-tree :show-expand="true" :load-data="loadData" :tree-data="treeData" > <template slot-scope="{ data }"> <span :class="{'tree-node-disabled': data.disabled}" @click.native="handleClick(data)" > {{ data.title }} </span> </template> </a-tree> </template> <script> export default { data() { return { treeData: [], }; }, mounted() { this.loadData(null, (data) => { this.treeData = data; }); }, methods: { loadData(parent, callback) { // 根据父节点id加载子节点数据 // ... }, handleClick(node) { // 判断当前节点是否子节点 if (node.children && node.children.length > 0) { // 展开子节点 node.expanded = !node.expanded; } }, }, }; </script> ``` 在上面的示例代码中,loadData方法用于异步加载节点数据,handleClick方法用于处理节点的点击事件。当用户单击节点时,如果该节点有子节点,则会展开子节点,否则不会展开。请按照您的实际需求进行修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值