问题:el-table多选框设置默认选中,进行翻页,之前选中的数据没有保留选中状态
<template>
<el-table
style="width: 100%"
border
:data="state.usersData"
@selection-change="userSelectionChange"
ref="multipleTable"
:row-key="getRowKeys"
>
<el-table-column type="selection" width="55" :reserve-selection="true" />
<el-table-column property="nickName" label="用户名" />
<el-table-column property="name" label="姓名" />
<el-table-column property="mobile" label="手机号"/>
<el-table-column property="email" label="邮箱"/>
</el-table>
<el-pagination
:current-page="state.paramData.page"
:page-size="state.paramData.pageSize"
:page-sizes="[5, 10, 20, 50]"
layout="total, sizes, prev, pager, next, jumper"
:background="true"
:total="state.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</template>
<script setup>
import {watch,reactive,ref} from "vue"
import { getUsers} from "@/api/course.js";
const state=reactive({
tableData:[],
selectedData:[],
paramData:{
page:1,
pageSize:10
},
total:0
})
watch(
() => state.paramData,
() => {
getUserMessage();
reserveSelection();
},
{ deep: true }
);
//获取表格数据
const getMessage=async ()=>{
const {data}=await getUsers();
state.tableData=data;
}
//用户数据反显(默认选中)
const multipleTable = ref();
const reserveSelection = () => {
if (selectData.value.length !== 0) {
selectData.value.forEach((item) => {
setTimeout(() => {
multipleTable.value.toggleRowSelection(item, true); //让页面显示选中的数据
}, 0);
});
}
};
//指定key值,数据更新之后保留之前选中的数据
const getRowKeys = (row) => {
return row.userId;
};
const handleCurrentChange = (val) => {
state.paramData.page = val;
};
const handleSizeChange = (val) => {
state.paramData.pageSize = val;
};
const userSelectionChange = (values) => {
state.selectedData = [...values];
};
</script>
总结步骤:
1.在el-table标签中加入:row-key=“getRowKeys”
2.在el-table-column中的第一行加入type=“selection” 和:reserve-selection=“true”
3.使用el-table 中的 toggleRowSelection 方法,其中该方法的第二个参数设置为true则为选中
注意:在使用toggleRowSelection方法时要在异步操作(setTimeout或nextTick)里面进行,因为当数据发生变化后,vue的依赖监听并更新视图过程是异步进行的,所以此时视图更新任务还在等待,此时通过ref操作dom是无效的