_makabaka

多选表格实现思路

表格多选功能的实现参考官方文档即可,下面给出代码:

手动添加一个el-table-column,设type属性为selection,使得表格出现复选框

  <el-table-column type="selection" width="50" align="center" />

image-20230421150146888

然后给 el-table 添加 selection-change 事件,该事件接收一个参数 selections,表示当前选中的行所组成的数组。

<el-table :data="userList" @selection-change="handleSelectionChange">

这样就实现了一个基本的多选表格了。

分页多选-状态保留

有时候我们的表格数据会不止一页,如果想要保留上一页选中的数据,可以通过 row-keyreserve-selection 这两个属性来实现,首先是给 el-table 添加 row-key 属性,该属性可以接受一个Function做值,该Function接受该行的数据row做为参数,且需要返回一个唯一的key。

<el-table :row-key="getRowKey" :data="userList" @selection-change="handleSelectionChange" >
getRowKey(row) {  return row.userId  }

然后给 type="selection"el-table-column 添加 reserve-selection 属性

<el-table-column type="selection" width="50" align="center" :reserve-selection="true"/>

多选表格回显

想要进行选中的数据回显,要使用的是表格组件的 toggleRowSelection 方法。

第一步,给 el-table 添加 ref 使得我们可以获取到DOM,从而使用它上面的方法

<el-table :row-key="getRowKey" :data="userList" @selection-change="handleSelectionChange" ref="multipleTable">

然后,我们应该是存在一个数组 selectedList 里面存放着我们已经勾选的数据(或者说是我们需要回显的数据),然后我们会请求接口,接口返回表格的数据 dataList 给我们,接下来我们对 dataList 进行遍历,同时判断遍历到的当前元素是否存在于 selectedList(意思就是判断当前元素是否需要被勾选起来),如果是需要被勾选,我们就使用 toggleRowSelection 来改变勾选状态

this.dataList = response.rows // 请求返回的数据
const userIds = this.selectedList.map(i => i.userId) // 简化判断操作
// 遍历返回的数据
this.dataList.forEach(row => {
    if (userIds.includes(row.userId)) {
      this.$refs.multipleTable.toggleRowSelection(row, true)
    }
})

注意,因为我们的表格显示的是请求回来的表格数据 dataList ,所以放在 toggleRowSelection 中的行元素应该是 dataList 中的元素,而不是 selectedList 的。

注意踩坑

存在这样一种场景,我们的表格是在一个弹出框里,当我们点击外部某个按钮后,弹出框显示表格,我们执行勾选操作,假设本次勾选了10行数据,然后关闭弹出框,重新打开弹出框,然后不进行勾选操作,然后点击确定,会发现 selection-change 事件的 selection 数组中有20个元素。这是不对的,应该只有刚刚勾选的那10个元素才对。

www.alltoall.net_dasdsdfsdfsdfsdfs_xTwlPsamXd

为什么会出现这个问题呢,我的猜想是,el-table 中存在某个变量x存放着我们多选时选中的数据,当我们第二次打开弹出框的时候,用的还是同一个 el-table (因为没有清除掉这个DOM元素),所以这个x变量中还存放着我们上次选中的值,然后我们为了回显数据又通过代码 toggleRowSelection 把数据勾选了一遍,所以这个x变量中就存在20个元素了。

因此我们要注意销毁掉 el-table 元素,比如上面的场景中,我通过 el-dialogdestroy-on-close 来实现每次关闭弹出框的时候都清空掉里面的元素,从而解决了这个问题。

posted on 2023-07-11 13:42  __makabaka  阅读(109)  评论(0编辑  收藏  举报

导航