实现代码
html
<template>
<el-tree-v2
:data="treeData"
:props="defaultProps"
node-key="id"
ref="treeRef"
show-checkbox
:check-strictly="true"
:expand-on-click-node="false"
@node-click="handleNodeClick"
@check="handleCheck"
/>
</template>
<script setup>
import { ref } from 'vue';
const treeData = ref([
// ...树形数据
]);
const defaultProps = {
children: 'children',
label: 'label',
};
const treeRef = ref(null);
const handleNodeClick = (nodeData, node) => {
// 如果是叶子节点,则选中它
if (node.isLeaf) {
treeRef.value.setChecked(nodeData, true, true);
}
};
const handleCheck = (data, { checked }) => {
// 处理单选逻辑
if (checked) {
// 清除其他选中的节点
const checkedKeys = treeRef.value.getCheckedKeys();
if (checkedKeys.length > 1) {
treeRef.value.setCheckedKeys([data.id]);
}
}
};
</script>
<style scoped>
/* 样式穿透,隐藏非叶子节点的复选框 */
:deep(.el-tree-node) > .el-tree-node__content .el-checkbox .el-checkbox__inner {
display: none;
}
:deep(.el-tree-node.is-leaf) > .el-tree-node__content .el-checkbox .el-checkbox__inner {
display: inline-block;
}
</style>
实现思路
handleNodeClick
方法用于处理节点点击事件,如果点击的是叶子节点,则将其选中。
handleCheck 方法用于处理复选框的选中事件,确保只有一个叶子节点被选中。
使用 :check-strictly="true"
确保复选框的选择不会影响父子节点。
使用 :expand-on-click-node="false"
确保点击节点不会展开或折叠,这样点击叶子节点时不会触发展开操作。