elementui中select搭配tree使用多选,并且实现选中所有子集展示的是父级
在Element UI中,要实现Select多选搭配Tree使用,并且勾选子集时自动勾选父级,可以通过监听Tree组件的节点勾选事件来更新Select的值。以下是实现这一功能的示例代码:
<template>
<el-select
v-model="selectedValues"
multiple
placeholder="请选择"
@remove-tag="removeTag"
@clear="clearSelect">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-tree
:data="treeData"
show-checkbox
node-key="id"
:props="defaultProps"
@check="handleCheck"
ref="tree">
</el-tree>
</template>
<script>
export default {
data() {
return {
selectedValues: [],
options: [],
treeData: [
// 树形数据
],
defaultProps: {
children: 'children',
label: 'label'
}
};
},
methods: {
handleCheck(data, checked, indeterminate) {
const checkedKeys = this.$refs.tree.getCheckedKeys();
const halfCheckedKeys = this.$refs.tree.getHalfCheckedKeys();
const allKeys = checkedKeys.concat(halfCheckedKeys);
const options = this.flattenTree(this.treeData, allKeys);
this.selectedValues = options.map(item => item.value);
},
flattenTree(tree, keys) {
let options = [];
const traverse = (nodes, level = 1) => {
nodes.forEach(node => {
if (keys.includes(node.id)) {
options.push({
label: node.label,
value: node.id,
level: level
});
}
if (node.children && node.children.length) {
traverse(node.children, level + 1);
}
});
};
traverse(tree);
return options;
},
removeTag(value) {
this.$refs.tree.setChecked(value, false, true);
},
clearSelect() {
this.$refs.tree.setCheckedKeys([]);
}
}
};
</script>
在这个例子中,Select组件用于展示已选择的项,Tree组件用于显示可选择的项。Select组件的v-model
绑定了selectedValues
数组,这个数组包含了所有选中的节点的值。在Tree组件中,通过@check
事件处理器handleCheck
来更新selectedValues
,handleCheck
方法会获取所有选中的节点,并通过递归遍历树形数据,将所有相关的父节点加入到options
数组中,然后更新Select的选项。removeTag
和clearSelect
方法用于在Select中移除标签和清除选择时,同步Tree的勾选状态。
评论已关闭