一、问题描述
- 记录一个弹窗点击确定按钮后,el-table列表保存已勾选的数据信息
- 再次打开弹窗,回显勾选所有保存的数据信息
- 切换分页,重新请求接口,新的数据也要回显勾选的数据
二、效果图
@selection-change="selectionTableDtaChange"是勾选会触发的事件
:row-key="projectId"是跨页多选row-key";row-key作为勾选的标识 一般为id 根据table中对应的id命名,
type="selection"设置为:reserve-selection="true"
<el-table ref="table" :data="listData" style="width:100%" v-loading="loading" @selection-change="selectData" row-key="projectId">
<el-table-column type="selection" align="center" width="40" :reserve-selection="true"></el-table-column>
</el-table>
methods: {
// 封装回显
showSeclectRow() {
// 已经勾选的id(selectionProjectId)
this.selectionProjectId.forEach((projectId) => {
this.listData.forEach((row) => {
if (row.projectId == projectId) {
this.$refs.table.toggleRowSelection(row, true); //自动回显勾选
}
});
});
},
}
三、全部代码
父组件代码
<el-form-item label="项目范围" prop="projectNames">
<el-tooltip
effect="dark"
:content="form.projectNames||'请选择项目'"
placement="top-start"
>
<el-input
style="width: 100%"
readonly
v-model="form.projectNames"
placeholder="请选择项目"
>
<el-button slot="append" @click="choseProjectScope">请选择</el-button>
</el-input>
</el-tooltip>
</el-form-item>
//引入组件表格弹窗 selectionProjectId,已经选择的id
<projectScope
:showDialog.sync="projectOpen"
@chooseProject="submitProject"
:selectionProjectId.sync="form.projectIds"
></projectScope>
<script>
methods: {
submitProject(data){
this.$set(
this.form,
"projectNames",
data.map((item) => item.projectName).join(",")
);
this.$set(
this.form,
"projectIds",
data.map((item) => item.projectId)
);
},
}
</script>
子组件代码
<template>
<el-dialog
:visible="showDialog"
title="选择项目"
append-to-body
@close="closeFn"
width="60%"
>
<el-row>
<!-- 搜索框 -->
<el-col :span="24">
<el-form
:model="queryParams"
inline
size="small"
@submit.native.prevent="search"
>
<el-form-item label="项目名称:" prop="chargeCode">
<el-input
v-model="queryParams.projectName"
placeholder="请输入项目名称"
clearable
@keyup.native.enter="search"
>
>
</el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" clearable @click="search">查询</el-button>
<el-button clearable @click="reset">重置</el-button>
</el-form-item>
</el-form>
</el-col>
</el-row>
<el-table
v-loading="loading"
:data="listData"
@selection-change="selectData"
row-key="projectId"
height="calc(100vh - 362px)"
ref="table"
>
<el-table-column
type="selection"
show-overflow-tooltip
width="50"
align="center"
:reserve-selection="true"
/>
<el-table-column label="项目编码" align="center" prop="projectCode" />
<el-table-column label="项目名称" align="center" prop="projectName">
</el-table-column>
<el-table-column
label="项目类型"
show-overflow-tooltip
align="center"
prop="clientName"
>
<template slot-scope="scope">
<span>{{ scope.row.dictData.dictLabel }}</span>
</template>
</el-table-column>
<el-table-column
label="项目负责人"
align="center"
prop="manager"
show-overflow-tooltip
>
</el-table-column>
<el-table-column
label="管理面积(㎡)"
align="center"
prop="landArea"
show-overflow-tooltip
>
</el-table-column>
</el-table>
<el-row type="flex" justify="end" style="margin-top: 5px">
<el-pagination
@size-change="handleSizeChange"
@current-change="currentChange"
:current-page.sync="page.pageNum"
:page-size="page.pageSize"
background
layout="total, sizes, prev, pager, next, jumper"
:total="total"
>
</el-pagination>
</el-row>
<span slot="footer">
<el-row type="flex" justify="end">
<el-button @click="submit" type="primary">确定</el-button>
<el-button @click="closeFn">取消</el-button>
</el-row>
</span>
</el-dialog>
</template>
<script>
import { listproject } from "@/api/system/project.js";
export default {
props: {
showDialog: {
type: Boolean,
default: false,
},
// 已经勾选的项目ID
selectionProjectId: {
type: Array,
default: () => [],
},
},
data() {
return {
listData: [],
loading: false,
total: 0,
page: {
pageNum: 1,
pageSize: 10,
},
queryParams: {
searchValue: null,
},
checkedData: null,
};
},
created() {},
watch: {
showDialog: {
async handler(val) {
if (val) {
await this.getList();
this.showSeclectRow();
}
},
immediate: true,
deep: true,
},
},
methods: {
// 封装回显
showSeclectRow() {
// 已经勾选的id(selectionProjectId)
this.selectionProjectId.forEach((projectId) => {
this.listData.forEach((row) => {
if (row.projectId == projectId) {
this.$refs.table.toggleRowSelection(row, true); //自动回显勾选
}
});
});
},
search() {
this.page.pageNum = 1;
this.getList();
},
async getList() {
this.loading = true;
await listproject({
...this.queryParams,
...this.page,
status: 0, // 启用状态
}).then((data) => {
this.listData = data.rows;
this.total = data.total;
this.loading = false;
});
},
// 关闭弹窗
closeFn() {
this.$emit("update:showDialog", false);
this.checkedData = "";
this.page.pageNum = 1;
this.$refs.table.clearSelection(); //清空回显的勾选状态
},
// 分页 展示数量改变触发时也要重新勾选
async currentChange(page) {
this.page.pageNum = page;
await this.getList();
this.showSeclectRow();
},
// 分页 展示数量改变触发时也要重新勾选
async handleSizeChange(pageSize) {
this.page.pageSize = pageSize;
await this.getList();
this.showSeclectRow();
},
selectData(arr, val) {
this.checkedData = arr;
},
submit() {
if (!this.checkedData) {
return this.$message.warning("请选择项目!");
}
this.$emit("chooseProject", this.checkedData);
this.closeFn();
},
// 重置
reset() {
this.page.pageNum = 1;
this.queryParams = {};
this.getList();
},
},
};
</script>