el-table tree子节点半选
时间: 2023-11-09 19:07:26 浏览: 174
checktreepanel node级联选中,支持半选
5星 · 资源好评率100%
el-table tree组件的子节点半选可以通过设置`node-key`属性和`check-strictly`属性来实现。其中,`node-key`属性用于指定节点的唯一标识符,`check-strictly`属性用于控制是否严格遵循父子节点选中状态不关联的规则。
具体实现步骤如下:
1. 在 el-table-column 中设置 type 为 'selection',并设置 prop 为 'checked',用于控制节点的选中状态。
2. 在 el-table-column 中设置 type 为 'expand',用于控制节点的展开状态。
3. 在 el-table 中设置 :data 属性为树形数据源。
4. 在 el-table 中设置 :node-key 属性为节点的唯一标识符。
5. 在 el-table 中设置 :check-strictly 属性为 true,表示父子节点选中状态不关联。
6. 在 el-table-column 中设置 scoped-slot="default",并在 slot-scope 中使用 el-checkbox 控制节点的选中状态。
示例代码如下:
```html
<template>
<el-table :data="data" :node-key="nodeKey" :check-strictly="true">
<el-table-column type="selection" prop="checked"></el-table-column>
<el-table-column type="expand"></el-table-column>
<el-table-column label="名称" prop="name">
<template slot-scope="{ row }">
<el-checkbox v-model="row.checked" @change="handleCheckChange(row)">{{ row.name }}</el-checkbox>
</template>
</el-table-column>
</el-table>
</template>
<script>
export default {
data() {
return {
data: [
{
id: 1,
name: '节点1',
children: [
{
id: 2,
name: '子节点1-1',
children: [
{
id: 3,
name: '子节点1-1-1'
},
{
id: 4,
name: '子节点1-1-2'
}
]
},
{
id: 5,
name: '子节点1-2'
}
]
},
{
id: 6,
name: '节点2',
children: [
{
id: 7,
name: '子节点2-1'
},
{
id: 8,
name: '子节点2-2'
}
]
}
],
nodeKey: 'id'
}
},
methods: {
handleCheckChange(row) {
if (row.children) {
row.children.forEach(child => {
child.checked = row.checked
})
}
this.handleParentCheckChange(row)
},
handleParentCheckChange(row) {
const parent = this.getParentNode(row)
if (parent) {
const siblings = parent.children
const checkedCount = siblings.filter(sibling => sibling.checked).length
if (checkedCount === 0) {
parent.checked = false
parent.indeterminate = false
} else if (checkedCount === siblings.length) {
parent.checked = true
parent.indeterminate = false
} else {
parent.checked = false
parent.indeterminate = true
}
this.handleParentCheckChange(parent)
}
},
getParentNode(node) {
const { data, nodeKey } = this
const stack = [data[0]]
while (stack.length) {
const parent = stack.pop()
if (parent[nodeKey] === node.parentId) {
return parent
}
if (parent.children) {
stack.push(...parent.children)
}
}
}
}
}
</script>
```
阅读全文