el-tree过滤后树形全选问题
el-tree过滤后树形全选问题
vue3、element plus
使用el-tree组件时,如果启用了 复选框 ,通过 filter-node-method 方法过滤后点击一个父节点依旧会把它下面的所有显示或不显示的子节点全部勾选上,我希望只会勾选上当前父节点下显示的子节点。
不能勾选的原因
简单来说就是 filter-node-method方法筛选的原理是控制节点的显示隐藏,所以勾选父级节点时,隐藏的子节点也会被勾选上
解决方法
用户搜索后,重新渲染一次数据
// HTML
<el-tree ref="treeRef" :data="treeList"
:filter-node-method="filterNode"
@check="boxCheck"
show-checkbox
node-key="snowId"
:default-checked-keys="defaultKey"
/>
const defaultKey = ref([]) // 默认勾选值
const threeData = ref([]) // 树数据
const treeParams = ref({
snowId: []
})
function filterNode(value) {
if (value) {
// threeDataCopy -- 深拷贝的原始数据
threeData.value = filterTree(value, threeDataCopy.value);
// defaultKey-- 默认勾选值,若没有此值,用户在搜索前后的勾选框不会被选中
defaultKey.value = treeParams.value.snowId
} else {
threeData.value = threeDataCopy.value
defaultKey.value = treeParams.value.snowId
}
}
// 递归方法
function filterTree(str, data) {
let filteredData = [];
for (let i = 0; i < data.length; i++) {
let node = data[i];
if (node.name.includes(str)) {
filteredData.push(node);
}
if (node.children && node.children.length > 0) {
let filteredChildren = filterTree(str, node.children);
if (filteredChildren.length > 0) {
filteredData.push({
...node,
children: filteredChildren
});
}
}
}
return filteredData;
}
// 左侧复选框点击
function boxCheck(val, data) {
let treeDataId = []
data.checkedNodes.filter(item => !item.children).filter(flag => {
treeDataId.push(flag.snowId)
})
treeParams.value.snowId = treeDataId
}