Utilice la tabla de componentes de Element, cuando utilice datos de árbol y haga coincidir el cuadro de selección múltiple, de la siguiente manera:
Habrá un problema, haga clic en la esquina superior izquierda para seleccionar todo, solo se puede seleccionar el primer nivel de nodos del árbol y no se pueden seleccionar los nodos secundarios, como se muestra en la figura:
Si desea seleccionar todas las tablas haciendo clic en Seleccionar todo, necesita encontrar otra manera, el método es el siguiente:
1. Primero configure uno para la tabla ref
,
2. Vincule un @select-all
método;
3. Defina una variable para identificar si el cuadro de selección completo está seleccionado y el predeterminado no está seleccionado;
checkedKeys: false,
4. @select-all
El método de vinculación es el siguiente: en la tabla de elementos, select-all
significa que el evento se activa cuando el usuario marca manualmente todas las casillas de verificación. Cada vez que el usuario hace clic, las claves marcadas se invierten y se realiza el bucle foreach. en los datos de la tabla para seleccionar la casilla de selección múltiple/El código clave para desmarcar es:
this.$refs.multipleTable.toggleRowSelection(row, flag);
La casilla de verificación flag=true está seleccionada, flag=false no está marcada.
Este método no afectará @selection-change
el método de enlace; si el estado está todo seleccionado, puede obtener todos los datos seleccionados.
La captura de pantalla del código es la siguiente:
El código completo es el siguiente:
<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>
El método anterior solo se puede utilizar para seleccionar todo; si se selecciona el padre, el niño no será seleccionado
El siguiente método consiste en seleccionar el padre y el hijo, pero no se pueden utilizar todas las selecciones.
<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>