Element Plus中el-tree 组件 check-on-click-node 无效问题 预期实现结果:只有在点击复选框时才会选中节点
参考链接:
Element Plus中el-tree-v2组件点击节点勾选问题的分析与解决 - GitCode博客
点击这里-》bug复现
希望结果:
只有在点击复选框时才会选中节点。
点击树节点不应该触发复选框的勾选操作
文档中有这个属性, check-on-click-node , 添加无效怎么解决; check-on-click-leaf 为false 就可以解决了。

【可以在ElementUI的官网上 el-tree 里练习习。。。】

完整代码:
<template> <div class="custom-tree-container"> <p>Using render-content</p> <el-tree style="max-width: 600px" :data="dataSource" show-checkbox node-key="id" default-expand-all :expand-on-click-node="false" :render-content="renderContent" /> <p>Using scoped slot</p> <el-tree style="max-width: 600px" :data="dataSource" show-checkbox node-key="id" default-expand-all :expand-on-click-node="false" :check-on-click-leaf="false" > <template #default="{ node, data }"> <div class="custom-tree-node"> <span>{{ node.label }} </span> <div>
<!--
当节点中有select下拉框的时候
选择下拉框的时候,也会取消节点的选中
当添加上这个属性后 :check-on-click-leaf="false"
效果正确
-->
<el-select v-if="node.key==5&&node.checked" v-model="SelectValue" placeholder="Select" style="width: 140px"> <el-option v-for="item in selectOptions" :key="item.value" :label="item.label" :value="item.value" /> </el-select> <el-button type="primary" link @click="append(data)"> Append </el-button> <el-button style="margin-left: 4px" type="danger" link @click="remove(node, data)" > Delete </el-button> </div> </div> </template> </el-tree> </div> </template> <script lang="ts" setup> import { ref } from 'vue' import { ElButton } from 'element-plus' import type { RenderContentContext, RenderContentFunction } from 'element-plus' interface Tree { id: number label: string children?: Tree[] } type Node = RenderContentContext['node'] type Data = RenderContentContext['data'] let id = 1000 const append = (data: Data) => { const newChild = { id: id++, label: 'testtest', children: [] } if (!data.children) { data.children = [] } data.children.push(newChild) dataSource.value = [...dataSource.value] } const remove = (node: Node, data: Data) => { const parent = node.parent const children: Tree[] = parent?.data.children || parent?.data const index = children.findIndex((d) => d.id === data.id) children.splice(index, 1) dataSource.value = [...dataSource.value] } const renderContent: RenderContentFunction = (h, { node, data }) => { return h( 'div', { class: 'custom-tree-node', }, [ h('span', null, node.label), h('div', null, [ h( ElButton, { type: 'primary', link: true, onClick: () => append(data), }, 'Append ' ), h( ElButton, { type: 'danger', link: true, style: 'margin-left: 4px', onClick: () => remove(node, data), }, 'Delete' ), ]), ] ) } const dataSource = ref<Tree[]>([ { id: 1, label: 'Level one 1', children: [ { id: 4, label: 'Level two 1-1', children: [ { id: 9, label: 'Level three 1-1-1', }, { id: 10, label: 'Level three 1-1-2', }, ], }, ], }, { id: 2, label: 'Level one 2', children: [ { id: 5, label: 'Level two 2-1', }, { id: 6, label: 'Level two 2-2', }, ], }, { id: 3, label: 'Level one 3', children: [ { id: 7, label: 'Level two 3-1', }, { id: 8, label: 'Level two 3-2', }, ], }, ]) const SelectValue = ref('') const selectOptions = [ { value: 'Option1', label: 'Option1', }, { value: 'Option2', label: 'Option2', }, { value: 'Option3', label: 'Option3', }, { value: 'Option4', label: 'Option4', }, { value: 'Option5', label: 'Option5', }, ] </script> <style> .custom-tree-node { flex: 1; display: flex; align-items: center; justify-content: space-between; font-size: 14px; padding-right: 8px; } </style>
效果截图



浙公网安备 33010602011771号