使用Element的组件Table表格,当使用树形数据再配合上多选框,如下:
会出现一种问题,点击左上方全选,只能够选中一级树节点,子节点无法被选中,如图所示:
想要实现点击全选就选中所有的表格,要另想办法,方法如下:
1、首先给table设置一个ref
;
2、绑定一个@select-all
方法;
3、定义一个变量,来识别全选框是否被选中,默认为未被选中;
checkedKeys: false,
4、@select-all
绑定的方法如下,Element的Table表格中,select-all
表示当用户手动勾选全选 Checkbox 时触发的事件 ,每次点击,checkedKeys就取反,对表格数据进行foreach循环,使多选框选中/取消选中的关键代码为:
this.$refs.multipleTable.toggleRowSelection(row, flag);
flag=true多选框选中,flag=false取消选中
该方法不会影响@selection-change
绑定的方法,若状态为全选,可以拿到全选的数据。
代码截图如下:
全部代码如下:
<template>
<div>
<h1>树型数据+表格</h1>
<el-table :data="tableData" style="width:80%;margin: 100px;" row-key="id" border default-expand-all
@select-all="selectAll" ref="multipleTable" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55">
</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="地址" width="380">
</el-table-column>
</el-table>
</div>
</template>
<script>
export default {
nama: "Tree",
data() {
return {
checkedKeys: false,
tableData: [
{
id: 1,
date: "2016-05-02",
name: "王小虎",
address: "上海市普陀区金沙江路 1518 弄",
children: [],
},
{
id: 2,
date: "2016-05-04",
name: "王小虎",
address: "上海市普陀区金沙江路 1517 弄",
},
{
id: 3,
date: "2016-05-01",
name: "王小虎",
address: "上海市普陀区金沙江路 1519 弄",
children: [
{
id: 31,
date: "2016-05-01",
name: "王小虎",
address: "上海市普陀区金沙江路 1519 弄",
},
{
id: 3531,
date: "2016-05-01",
name: "王小虎",
address: "上海市普陀区金沙江路 1519 弄",
},
{
id: 8931,
date: "2016-05-01",
name: "王小虎",
address: "上海市普陀区金沙江路 1519 弄",
},
{
id: 32,
date: "2016-05-01",
name: "王小虎",
address: "上海市普陀区金沙江路 1519 弄",
children: [
{
id: 61,
date: "2016-05-01",
name: "王小虎",
address: "上海市普陀区金沙江路 1519 弄",
},
{
id: 42,
date: "2016-05-01",
name: "王小虎",
address: "上海市普陀区金沙江路 1519 弄",
children: [
{
id: 321,
date: "2016-05-01",
name: "王小虎33333",
address: "上海市普陀区金沙江路 1519 弄",
},
],
},
],
},
],
},
{
id: 4,
date: "2016-05-03",
name: "王小虎",
address: "上海市普陀区金沙江路 1516 弄",
},
],
};
},
methods: {
selectAll() {
this.checkedKeys = !this.checkedKeys;
this.splite(this.tableData, this.checkedKeys);
},
/**
* 处理数据
*/
splite(data, flag) {
data.forEach((row) => {
this.$refs.multipleTable.toggleRowSelection(row, flag);
if (row.children != undefined) {
this.splite(row.children);
}
});
},
handleSelectionChange(val){
console.log(val);
}
}
};
</script>
上述方法只能用全选,选父级的话子级是不会选中的
下面这个方法,是选择父级子级可以选中,但是全选不能用
<template>
<div>
<el-table
v-if="deptList.length > 0"
v-loading="loading"
:data="deptList"
row-key="id"
:default-expand-all="isExpandAll"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
@select-all="selectAll"
ref="multipleTable"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" :selectable="row => !row.disabled">
<template slot-scope="scope">
<el-checkbox v-model="scope.row.selected" @change="onRowSelectChange(scope.row)"></el-checkbox>
</template>
</el-table-column>
<!-- 其他列定义 -->
</el-table>
</div>
</template>
<script>
export default {
data() {
return {
deptList: [],
loading: false,
isExpandAll: false,
checkedKeys: false
};
},
methods: {
selectAll() {
this.checkedKeys = !this.checkedKeys;
this.splite(this.deptList, this.checkedKeys);
},
splite(data, flag) {
data.forEach((row) => {
this.$refs.multipleTable.toggleRowSelection(row, flag);
if (row.children && row.children.length) {
this.splite(row.children, flag);
}
});
},
onRowSelectChange(row) {
if (row.children && row.children.length > 0) {
this.traverse(row.children, row.selected);
}
},
traverse(data, checked) {
data.forEach((row) => {
this.$set(row, 'selected', checked);
if (row.children && row.children.length > 0) {
this.traverse(row.children, checked);
}
});
},
// 其他方法
}
};
</script>