vue+elementUI实现级联表格el-table级联多选
<template>
<div id="app">
<el-button type="primary" @click="getAllSelect()">获取选中集合</el-button>
<el-table
:data="renderDynamic"
ref="lendontable"
border
default-expand-all
row-key="id"
:row-class-name="rowClassNameFun"
:header-row-class-name="headerRowClassName"
size="mini"
max-height="500px"
style="width: 100%"
@select="selectFun"
@select-all="selectAllFun"
:header-cell-style="{ background: '#fafafa' }"
>
<el-table-column type="selection" width="55" :selectable="selectable">
</el-table-column>
<el-table-column prop="date" label="日期" sortable width="180">
</el-table-column>
<el-table-column prop="name" label="姓名" sortable width="180">
</el-table-column>
<el-table-column prop="address" label="地址"> </el-table-column>
</el-table>
</div>
</template>
<script>
export default {
name: 'App',
data() {
return {
renderDynamic: [
{
id: 1,
parentId: 0,
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
},
{
id: 2,
parentId: 0,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄',
children: [
{
id: 3,
parentId: 2,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄',
children: [
{
id: 4,
parentId: 3,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
},
{
id: 5,
parentId: 3,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
}
]
},
{
id: 6,
parentId: 2,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
}
]
},
{
id: 11,
parentId: 0,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄',
children: [
{
id: 1101,
parentId: 11,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
},
{
id: 1102,
parentId: 11,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
}
]
}
],
selectArr: []
};
},
mounted() {
this.initData(this.renderDynamic);
},
methods: {
getAllSelect() {
this.selectArr = [];
this.getSelectId(this.renderDynamic);
console.log('-----选中节点id集合----', this.selectArr);
},
getSelectId(data) {
data.forEach((item) => {
if (item.isSelect === true) {
//父级选中,只获取父级的值
this.selectArr.push(item.id);
// 父级选中,获取父级和子级的值,只获取父级的值,将下面代码注释
if (item.children && item.children.length) {
this.getSelectId(item.children);
}
} else if (item.isSelect === '') {
this.getSelectId(item.children);
}
});
},
//设计禁止选中
selectable(row) {
return row.parentId != 11 && row.id != 11;
},
initData(data) {
data.forEach((item) => {
item.isSelect = false; //默认为不选中
if (item.children && item.children.length) {
this.initData(item.children);
}
});
},
selectFun(selection, row) {
this.setRowIsSelect(row);
},
checkIsAllSelect() {
this.oneProductIsSelect = [];
this.renderDynamic.forEach((item) => {
this.oneProductIsSelect.push(item.isSelect);
});
//判断一级产品是否是全选.如果一级产品全为true,则设置为取消全选,否则全选
let isAllSelect = this.oneProductIsSelect.every((selectStatusItem) => {
return true == selectStatusItem;
});
return isAllSelect;
},
selectAllFun(selection) {
// this.renderDynamic.forEach((item) => {
// this.$refs.lendontable.toggleRowSelection(item, !item.isSelect);
// this.selectFun(selection, item);
// });
//设置禁止选中时,取消禁止的选中状态
this.renderDynamic.forEach((item) => {
if (item.id === 11) {
this.$refs.lendontable.toggleRowSelection(item, false);
} else {
this.$refs.lendontable.toggleRowSelection(item, !item.isSelect);
this.selectFun(selection, item);
}
});
},
rowClassNameFun({ row }) {
if (row.isSelect === '') {
return 'indeterminate';
}
},
headerRowClassName({ row }) {
console.log('row: ', row);
let oneProductIsSelect = [];
this.renderDynamic.forEach((item) => {
oneProductIsSelect.push(item.isSelect);
});
if (oneProductIsSelect.includes('')) {
return 'indeterminate';
}
return '';
},
setRowIsSelect(row) {
//当点击父级点复选框时,当前的状态可能为未知状态,所以当前行状态设为false并选中,即可实现子级点全选效果
if (row.isSelect === '') {
row.isSelect = false;
this.$refs.lendontable.toggleRowSelection(row, true);
}
row.isSelect = !row.isSelect;
let that = this;
function selectAllChildrens(data) {
data.forEach((item) => {
item.isSelect = row.isSelect;
that.$refs.lendontable.toggleRowSelection(item, row.isSelect);
if (item.children && item.children.length) {
selectAllChildrens(item.children);
}
});
}
function getSelectStatus(selectStatuaArr, data) {
data.forEach((childrenItem) => {
selectStatuaArr.push(childrenItem.isSelect);
if (childrenItem.children && childrenItem.children.length) {
getSelectStatus(selectStatuaArr, childrenItem.children);
}
});
return selectStatuaArr;
}
function getLevelStatus(row) {
//如果当前节点的parantId =0 并且有子节点,则为1
//如果当前节点的parantId !=0 并且子节点没有子节点 则为3
if (row.parentId == 0) {
if (row.children && row.children.length) {
return 1;
} else {
return 4;
}
} else {
if (!row.children || !row.children.length) {
return 3;
} else {
return 2;
}
}
}
let result = {};
//获取明确的节点
function getExplicitNode(data, parentId) {
data.forEach((item) => {
if (item.id == parentId) {
result = item;
}
if (item.children && item.children.length) {
getExplicitNode(item.children, parentId);
}
});
return result;
}
function operateLastLeve(row) {
//操作的是子节点 1、获取父节点 2、判断子节点选中个数,如果全部选中则父节点设为选中状态,如果都不选中,则为不选中状态,如果部分选择,则设为不明确状态
let selectStatuaArr = [];
let item = getExplicitNode(that.renderDynamic, row.parentId);
selectStatuaArr = getSelectStatus(selectStatuaArr, item.children);
if (
selectStatuaArr.every((selectItem) => {
return true == selectItem;
})
) {
item.isSelect = true;
that.$refs.lendontable.toggleRowSelection(item, true);
} else if (
selectStatuaArr.every((selectItem) => {
return false == selectItem;
})
) {
item.isSelect = false;
that.$refs.lendontable.toggleRowSelection(item, false);
} else {
item.isSelect = '';
}
//则还有父级
if (item.parentId != 0) {
operateLastLeve(item);
}
}
//判断操作的是子级点复选框还是父级点复选框,如果是父级点,则控制子级点的全选和不全选
//1、只是父级 2、既是子集,又是父级 3、只是子级
let levelSataus = getLevelStatus(row);
if (levelSataus == 1) {
selectAllChildrens(row.children);
} else if (levelSataus == 2) {
selectAllChildrens(row.children);
operateLastLeve(row);
} else if (levelSataus == 3) {
operateLastLeve(row);
}
}
}
};
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
.indeterminate .el-checkbox__input .el-checkbox__inner {
background-color: #409eff !important;
border-color: #409eff !important;
color: #fff !important;
}
.indeterminate .el-checkbox__input.is-checked .el-checkbox__inner::after {
transform: scale(0.5);
}
.indeterminate .el-checkbox__input .el-checkbox__inner {
background-color: #f2f6fc;
border-color: #dcdfe6;
}
.indeterminate .el-checkbox__input .el-checkbox__inner::after {
border-color: #c0c4cc !important;
background-color: #c0c4cc;
}
.product-show th .el-checkbox__inner {
display: none !important;
}
.indeterminate .el-checkbox__input .el-checkbox__inner::after {
content: '';
position: absolute;
display: block;
background-color: #fff;
height: 2px;
transform: scale(0.5);
left: 0;
right: 0;
top: 5px;
width: auto !important;
}
.product-show .el-checkbox__inner {
display: block !important;
}
.product-show .el-checkbox {
display: block !important;
}
</style>