el-tree、a-tree树形组件获取数据及回显

本文介绍了在前端开发中,使用Element UI和Ant Design两个库的树形组件(el-tree和a-tree)来展示和管理后端返回的树形数据。在处理子节点未全选时,如何避免父节点被错误选中。同时展示了如何回显已选中的菜单,并提供了数据获取、节点选择变更的处理函数。文章还涵盖了如何清空选中项和获取半选中的节点。

 

目录

1、el-tree

2、a-tree


树形组件后端返回的数据包含父节点和子节点,但在子节点不全被选中的时候,不能把父节点给勾选上,否则会出现父节点被勾选,里边未被选中的子节点也全部被选中 

1、el-tree

<el-tree
    :data="menuData"
    :props="treeProp"
    show-checkbox
    :default-expand-all="false"
    node-key="id"
    @check="boxCheck"
    ref="treeRef"
    :default-checked-keys="checkedKeys"
>
</el-tree>

const menuData = ref([])
const treeRef = ref([])
const checkedKeys = ref([])
const treeProp = ref({
    children: 'children',
    label: 'lable'
})

const getRoleMenu = (roleId) => {
    let data = {
        roleId
    }
    http.get('/xxx', data).then(res => {
        if (res.data.code === 200) {
            menuData.value = res.data.data.menus
            // 回显选中菜单
            let menuIds=res.data.data.checkedKeys
            //避免获取不到getNode
            setTimeout(()=>{
                menuIds.forEach((item) => {
                    const node = treeRef.value.getNode(item);
                    if (node.isLeaf) {
                        reeRef.value.setChecked(item, true);
                        chooseKeys.value.push(item)
                       }
                    });
                },100)
            }
        })
    }

const boxCheck = () => {
     let checkedKeys=treeRef.value.getCheckedKeys()
     let halfCheckedKeys=treeRef.value.getHalfCheckedKeys()
     chooseKeys.value=checkedKeys.concat(halfCheckedKeys)
}

//清空被选中的项
treeRef.value.setCheckedKeys([], false)

2、a-tree

<a-tree
    v-model:checkedKeys="checkedKeys"
    checkable
    :tree-data="treeData"
    :field-names="fieldNames"
    @check="treeCheck"
>
</a-tree>
const checkedKeys = ref([]);
const newCheckedKeys = ref([])//修改需要的所选keys
const fieldNames = {
    children: 'children',
    title: 'menuName',
    key: 'menuId'
};
const treeData = ref([])
const childNodeId=ref([])//存放所有子节点的数组

//获取后端返回的菜单数据和当前被选中的keys
const getTreeData=()=>{
    httpGet('/xxxx').then(res => {
        if (res.code === 200) {
            treeData.value = res.data.tree
            getDeepNodeId(treeData.value)
            //求交集
            let checkedKeysArr = res.data.checkedKeys
            const result = [...new Set(childNodeId.value)].filter((item) => new Set(eval(checkedKeysArr)).has(item))
            checkedKeys.value = [...result]
        }
    })
}

//循环遍历出最深层子节点(包含所有的子节点及没有子节点的父节点),存放在一个数组中
const getDeepNodeId=(data)=>{
    data.map((item) => {
        if (item.children && item.children.length > 0) {
            getDeepNodeId(item.children);
        } else {
            childNodeId.value.push(item.menuId);
        }
    });
}

const treeCheck = (checkedKeys, info) => {
    //将父节点拼接到子节点,用于修改功能
    //newCheckedKeys.value = checkedKeys.concat(info.halfCheckedKeys);
    newCheckedKeys.value =[...checkedKeys, ...info.halfCheckedKeys]
}

参考1

参考2 

在使用 `el-tree-select` 实现树结构数据回显与选中功能时,需要注意以下几个关键点,以确保组件能够正确渲染并展示期望的节点状态。 ### 回显与默认展开 `el-tree-select` 是 `el-tree` 和 `el-select` 的结合体,它提供了树形结构的选择功能。为了实现数据回显和默认选中,可以使用以下属性: - `node-key="id"`:指定节点的唯一标识字段,通常使用 `id`。 - `:default-expanded-keys="[form4.positionNo]"`:设置默认展开的节点的 key 的数组。 - `:default-checked-keys="[form4.positionNo]"`:设置默认勾选的节点的 key 的数组。 这些属性能够帮助组件在初始化时正确地展开和选中节点。需要注意的是,后端返回的数据类型必须与前端定义的 `positionTypeData` 数组中的 `id` 类型一致。例如,如果一个是 `Number` 类型,而另一个是 `String` 类型,那么回显将不会成功。 ```html <el-tree-select v-model="form4.positionNo" :data="positionTypeData" node-key="id" :default-expanded-keys="[form4.positionNo]" :default-checked-keys="[form4.positionNo]" /> ``` ### 懒加载与回显 如果使用了懒加载(lazy loading)功能,由于树结构数据并不是一次性全部加载,而是按需加载,因此在组件刚渲染时可能只有节点的 `id` 而没有完整的树结构。为了解决这个问题,可以在组件初始化时构造所需的树节点,并利用 `default-expanded-keys` 属性让组件自动调用 `loadNode` 方法,从而获取数据并渲染树节点。 ### 选中父节点与子节点 在某些情况下,可能需要在选中子节点的同时选中父节点,或者在回显时仅选中父节点而不选中所有子节点。可以通过 `el-tree` 提供的方法来处理这种情况: - 选中子节点时,手动获取其父节点并将其加入选中状态。 - 回显时,如果数组中包含父节点,但不希望选中所有子节点,可以通过递归方法找到具体的子节点并单独处理。 ### 箭头显示控制 为了控制树节点箭头的显示(即是否可展开),可以在树的配置信息中添加 `isLeaf` 字段。该字段用于标识节点是否为叶子节点。通过递归方法查找节点的子节点,如果子节点为空数组,则将 `isLeaf` 设置为 `true`,从而隐藏箭头。 ```javascript function markLeafNodes(node) { if (!node.children || node.children.length === 0) { node.isLeaf = true; } else { node.children.forEach(markLeafNodes); node.isLeaf = false; } } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值