element-ui 的el-table,多选翻页后,之前选择的数据丢失问题处理

问题描述

在使用Element UI的el-table组件时,开启多选功能后,当切换分页或重新加载数据时,之前选中的数据会丢失。这是由于表格在重新渲染时未保留之前的选择状态。

解决方案

1.手动存储历史

利用一个数组来保存所有选中的数据,而不仅仅是当前页的数据。

html 复制代码
<el-table
  ref="multipleTable"
  :data="tableData"
  @select = "rowSelectChange"
>
  <el-table-column
    type="selection"
    width="55"
  ></el-table-column>
  <!-- 其他列 -->
</el-table>

<script>
const ids = ref([])
const rowSelectChange=(selection: UserVO[], row: UserVO)=>{
  // 判断是否选中,选中ids增加,取消选中ids删除
  if(selection.filter(item=>item.userId == row.userId).length>=1){
    ids.value.push(row.userId)
  }else{
    ids.value = ids.value.filter(item=>item!=row.userId)
  }
}

const initIds=()=>{
    // initSelectUsers 为默认已经选中的ids
  props.initSelectUsers?.forEach(userItem => {
    ids.value.push(userItem)
 });
}
</script>
2.使用row-key和reserve-selection

对于需要跨页保持选中状态的场景,可以给表格设置row-key并启用reserve-selection属性。这需要确保每行数据有唯一标识(如id)。

html 复制代码
<el-table
  ref="multipleTable"
  :data="tableData"
  :row-key="getRowKeys"
  @selection-change="handleSelectionChange"
>
  <el-table-column
    type="selection"
    width="55"
    :reserve-selection="true"
  ></el-table-column>
  <!-- 其他列 -->
</el-table>

<script>
const ids = ref([])
const handleSelectionChange = (selection: UserVo) => {
  ids.value = selection.map((item) => item.userId);
}
const getRowKeys=(row:UserVO)=>{
  return row.userId;
}
</script>
注意事项
  • 使用reserve-selection时,必须指定row-key且数据中的该字段必须唯一。
  • 跨页选中会占用内存,数据量过大时建议采用服务器端保存选中状态。

总结

以上可以有效解决分页时选中丢失的问题,对于简单场景,使用reserve-selection属性更为便捷,如果需要修改原有历史数据数组保存 数据更方便。

相关推荐
speedoooo1 天前
在现有App里嵌入一个AI协作者
前端·ui·小程序·前端框架·web app
霍格沃兹测试学院-小舟畅学1 天前
Playwright MCP在UI自动化测试中的定位与思考
ui
Just_Paranoid1 天前
【Android UI】Android 颜色的表示和获取使用指南
android·ui·theme·color·attr·colorstatelist
JIngJaneIL1 天前
基于java + vue校园快递物流管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js
恶猫1 天前
SEELEN UI 桌面自定义工具 v2.3 介绍及安装教程, 深度美化win10/11,装机必备!!
ui·win11·win10·系统优化·桌面·桌面美化·桌面自定义
OpenTiny社区1 天前
2025OpenTiny星光ShowTime!年度贡献者征集启动!
前端·vue.js·低代码
狗哥哥1 天前
从零到一:打造企业级 Vue 3 高性能表格组件的设计哲学与实践
前端·vue.js·架构
计算机毕设VX:Fegn08951 天前
计算机毕业设计|基于springboot + vue图书借阅管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
褪色的笔记簿1 天前
在 Vue 项目里管理弹窗组件:用 ref 还是用 props?
前端·vue.js
一只小阿乐1 天前
前端vue3 web端中实现拖拽功能实现列表排序
前端·vue.js·elementui·vue3·前端拖拽