elementUI中el-table配合el-tree制作tree型的表格, 但是又有需求, 选中父元素子元素全被选中, 子元素被全选后, 父元素不被选
HTML代码这样写
<el-table
:data="table.data"
row-key="id"
border
ref="table"
default-expand-all
:tree-props="{ children: 'childlist', hasChildren: 'hasChildren' }"
@selection-change="selectionChange"
@select="tableSelect"
@select-all="tableSelectAll"
>
</el-table>
js的方法
setChildren (children, type) {
// 编辑多个子层级
children.map((j) => {
this.toggleSelection(j, type)
if (j.childlist && j.childlist.length > 0) {
this.setChildren(j.childlist, type)
}
})
},
toggleSelection (row, select) {
if (row) {
this.$nextTick(() => {
this.$refs.table && this.$refs.table.toggleRowSelection(row, select)
})
}
},
tableSelect (selection, row) {
if (selection.some((el) => { return row.id === el.id })) {
if (row.childlist) {
this.setChildren(row.childlist, true)
}
} else {
if (row.childlist) {
this.setChildren(row.childlist, false)
}
}
},
tableSelectAll (selection) {
// tabledata第一层只要有在selection里面就是全选
const isSelect = selection.some((el) => {
const tableDataIds = this.table.data.map((j) => j.id)
return tableDataIds.includes(el.id)
})
// tableDate第一层只要有不在selection里面就是全不选
const isCancel = !this.table.data.every((el) => {
const selectIds = selection.map((j) => j.id)
return selectIds.includes(el.id)
})
if (isSelect) {
selection.map((el) => {
if (el.childlist) {
// 解决子组件没有被勾选到
this.setChildren(el.childlist, true)
}
})
}
if (isCancel) {
this.table.data.map((el) => {
if (el.childlist) {
// 解决子组件没有被勾选到
this.setChildren(el.childlist, false)
}
})
}
},
selectionChange (selection) {
this.$emit('selectionChange', selection)
}