首页 > 其他分享 >表格分页多选默认回显实现

表格分页多选默认回显实现

时间:2023-07-11 14:13:55浏览次数:41  
标签:selection const 多选 表格 sysId 勾选 length 回显

element的表格可以使用 row-keyreserve-selection 来实现多选翻页回显,但是在使用过程中却出现了,翻页之后,翻页保存的数据丢失问题

复现前准备

首先是使用 el-tableel-pagination 搭建好基本的页面,包括获取表格数据事件,翻页事件以及表格的 selection-changerow-keyreserve-selectionref 这些东西。

页面模板

<el-table
  :data="list"
  :row-key="getRowKey"
  @selection-change="onSelectionChange"
  ref="multipleTable"
>
  <el-table-column	type="selection" width="55"	:reserve-selection="true"></el-table-column>
  <el-table-column label="姓名" prop="name"></el-table-column>
  <el-table-column label="sysId" prop="sysId"></el-table-column>
</el-table>
<el-pagination  :current-page.sync="currentPage"  @current-change="getTableData"  :total="200"></el-pagination>

然后是表格(假)数据获取(翻页事件)、selection-change 事件、getRowKey 事件的实现。

获取表格(假)数据

// 获取表格数据
getTableData() {
  const list = []
  for (let i = 0; i < 10; i++) {
	list.push({
	  sysId: this.currentPage + '' + i,
	  name: `用户-${this.currentPage + '' + i}`
	})
  }
  this.list = list
  // 勾选回显
  this.$nextTick(() => {
	this.tableEcho()
  })
}

selection-change事件

根据官方文档,这个事件接收一个 selection 参数,该参数是一个数组,数组中存放着表格中被勾选的行的数据,如果使用了 reserve-selection 的话,那么即使翻页了重新勾选,这个 selection 中也会保存着之前勾选的数据。

举个例子来说,假如我在第一页,勾选了ABC3行数据,然后在第二页勾选了DE2行数据,那么当我们勾选E这一行的时候 selection 参数中是存在5个元素的,就是ABCDE这5个。
根据上面的描述,我们只需要在 selection-change 事件中,将 selection 参数赋值给一个变量就可以拿到分页表格所勾选的全部数据了。

因此这个 selection-change 的逻辑非常简单,只需要做简单的赋值操作

onSelectionChange(selection) {
  this.selection = selection
}

getRowKey方法

这个根据表格中的数据来确定返回的数据,主要是不要存在重复的就可以了,比如说上面的假数据中,sysId是肯定不会重复的,因此 getRowKey 方法中返回表格数据的 sysId

getRowKey(row) {
  return row.sysId
}

tableEcho勾选回显方法

这个方法中调用表格实例的 toggleRowSelection 方法进行勾选回显。

tableEcho() {
  const tableRef = this.$refs.multipleTable
  const sysIds = this.selection.map(i => i.sysId)
  this.list.forEach(i => {
	if (sysIds.includes(i.sysId)) {
	  tableRef.toggleRowSelection(i, true)
	}
  })
}

(状态)变量定义

最后就是在 data 中定义几个状态,比如说表格数据 list ,当前页面 currentPage,当前已选行 selection,然后就可以开始复现了。

复现过程

首先分成两种情况:selection 状态不存在默认值(空数组)和存在默认值(非空数组)。

不存在默认值

selection 为空数组的时候,无论如何勾选,翻页,都可以正常使用。

存在默认值

selection 为非空数组的时候,问题就出现了,假设 selection 中存储的是第一页的第1/2行数据和第3页的第4/5条数据,也就是说我们希望表格的第一页和第三页存在默认勾选的数据,注意是默认勾选。

selection: [
	{ "sysId": "11", "name": "用户-11" },
	{ "sysId": "12", "name": "用户-12" },
	{ "sysId": "33", "name": "用户-33" },
	{ "sysId": "34", "name": "用户-34" },
	{ "sysId": "35", "name": "用户-35" }
]

然后进入到页面,我们可以发现,表格的第一页确实把1/2行的数据勾选起来了,如下图

image.png

但是问题是,当我们翻到第3页的时候,发现4/5却并没有被勾选起来,如下图

image.png

通过Vue开发者工具可以看到 selection 状态变成了只保存了第一页的勾选行,而丢失了第三页的勾选行。

image.png

通过在 selection-change 事件中 debugger 找到了原因,当我们获取到第一页表格数据的时候,进行表格勾选回显,此时 selection 参数中只存在第一页中默认被勾选的两行,然后 selection 被赋值给了 this.selection,进而导致 this.selection 中原本存在的第三页默认勾选的数据被抹掉了,所以当表格翻到第三页的时候,本来该被勾选的行却没被勾选。

思考

1. 多加一个默认值状态(废弃)

因为 selction 状态被 selection 参数给冲掉了,所以我就想着多定义一个 defaultSelection 状态,里面存放需要进行默认回显的数据,然后我们的 tableEcho 方法就要改成下面这样:

tableEcho() {
  const tableRef = this.$refs.multipleTable
  //============= 这里变啦 

标签:selection,const,多选,表格,sysId,勾选,length,回显
From: https://www.cnblogs.com/maccx/p/17544463.html

相关文章

  • 多选表格实现思路
    表格多选功能的实现参考官方文档即可,下面给出代码:手动添加一个el-table-column,设type属性为selection,使得表格出现复选框<el-table-columntype="selection"width="50"align="center"/>然后给el-table添加selection-change事件,该事件接收一个参数selections,表示当......
  • 单选表格实现思路
    element单选表格的实现,主要依靠elTable组件的select事件,假设存在如下表格:以上面的表格为例子,可以通过如下步骤实现单选表格。data我们需要一个状态tableData用于存放表格的数据,还需要一个状态selectedRow用于存放当前勾选的行是数据。两个状态的默认值如下:data(){ re......
  • mui用列表实现表格的增删改查
    我的需求是实现表格的增删改查,原需求是有两列的表,有三列的表,因为移动端的表格操作不方便,所以想采用以前常用的列表形式来实现。先看画面效果。 一,先用静态html代码,实现画面呈现的样式,采用列表嵌套表格的方法,表格可以约束列宽。<divclass="mui-table"><divclass="mui-......
  • Camstar表格自定义写js,实现单元格合并。
     效果: ......
  • [数据分析与可视化] 基于plottable库绘制精美表格
    plottable是一个Python库,用于在matplotlib中绘制精美定制的图形表格。plottable的官方仓库地址为:plottable。本文主要参考其官方文档,plottable的官方文档地址为:plottable-doc。plottable安装命令如下:pipinstallplottable本文所有代码见:Python-Study-Notes#jupyternoteboo......
  • 明明是张表格脸,怎么也长出了图片?(Excel批量处理图片合集)
    图片来源为函数类:Excel批量插入图片制图片的下拉选项图片就是图片类:批量插入图片把图片用在了数据透视表里只要是单元格对象的图片,不问出处:当函数遇上图片......
  • 利用xlsx库导出页面表格为xlsx文件
    html<el-tableid="table"></el-table>jsimport*asXLSXfrom'xlsx'/** *导出表格为xlsx文件 *@param{string}id表格dom的id*/asyncfunctionexportTable(id,fileName){letwb=XLSX.utils.table_to_book(document.getEleme......
  • 在指定段落下增加表格
    Documentdocument=newDocument();document.LoadFromFile("C:\\Users\\ZYB\\Desktop\\test.docx");Sectionsection=document.Sections[0];//获取第一个节Paragraphtitle=null;foreach(Paragraphparagraphinsection.Paragraphs){if(paragraph.......
  • vue3使用表格el-table-infinite-scroll.js:18 Uncaught (in promise) Error: [el-tabl
    先看下表格里面有没有这个el-scrollbar__wrapclass类 没有的话升级一下element-plus到最新的就行你可以先查看element-plus的版本npmview element-plus下载完之后 就有了......
  • layui表格内可编辑下拉框
    表格内可编辑下拉框扩展自别人的表格内下拉框一、列模板<scripttype="text/html"id="selectTpl"><divclass="inputdiv"><inputclass="layui-input"name="method"z-filter="input"data-tableName=&q......