element表格多页分页选中并回显vue

本文介绍了一种Vue项目中实现多页分页时,如何保持用户选择状态并通过临时数组记录各页选中项的方法。通过监听表格的选择事件,在翻页时能够回显用户的先前选择。

vue开发遇到多页分页选中并回显的需求,整理如下

<el-table
 ....
 @select="handleSelect"
 @select-all="handleSelectAll"
>

data数据
	{
	 ...
     selectUsers: [], // 批量选择的用户
     selectUsersTemparr: [],
    }
methods:
 handleSelect(data) {
      // 本页选中的数据,翻页后依旧需要保留
      // 方案就是 selectUsersTemparr
      let hasExist = false
      let hasExistIndex = 0
      for (let i = 0, len = this.selectUsersTemparr.length; i < len; i++) {
        if (this.selectUsersTemparr[i].curPageNum === this.currentPage) {
          hasExist = true
          hasExistIndex = i
          break
        }
      }
      if (hasExist) {
        // 已经存在
        this.selectUsersTemparr[hasExistIndex].curPageData = data
      } else {
        // 还不存在当页数据
        this.selectUsersTemparr.push({
          curPageNum: this.currentPage,
          curPageData: data
        })
      }
      // 先清空selectUsers
      this.selectUsers = []
      this.selectUsersTemparr.forEach((sItem) => {
        this.selectUsers = this.selectUsers.concat(sItem.curPageData)
      })
    },
    handleSelectAll(data) {
      if (data.length) {
        this.handleSelect(data)
      } else {
        let index = 0
        for (let i = 0, len = this.selectUsersTemparr.length; i < len; i++) {
          if (this.selectUsersTemparr[i].curPageNum === this.currentPage) {
            index = i
            break
          }
        }
        this.selectUsersTemparr.splice(index, 1)
        // 先清空selectUsers
        this.selectUsers = []
        this.selectUsersTemparr.forEach((sItem) => {
          this.selectUsers = this.selectUsers.concat(sItem.curPageData)
        })
      }
    },
    // 获取接口后,调用该方法
    defaultSelected() {
      // 先看看当前页有没有选中项
      let tarIndex = -1
      for (let i = 0, len = this.selectUsersTemparr.length; i < len; i++) {
        if (this.selectUsersTemparr[i].curPageNum === this.currentPage) {
          tarIndex = i
        }
      }
      if (
        tarIndex !== -1 &&
        this.selectUsersTemparr[tarIndex].curPageData.length
      ) {
        // 说明当前页有选中项 把当前页选中项的index去都摘出来
        const tempIndexArr = this.selectUsersTemparr[tarIndex].curPageData.map(
          (tItem) => {
            return tItem.index
          }
        )

        tempIndexArr.forEach((iItem) => {
          this.$refs.table.toggleRowSelection(this.tableData[iItem], true)
        })
      }
    },
    ...
    // 接口查询列表数据
    getList(){
    	...
    	// 从接口得到列表数据content,需要与每页item赋值index索引,作为复选框回显标识
    	this.tableData = content.map((item, i) => {
        	item.index = i
        })
    	this.$nextTick(()=>{
    		this.defaultSelected()
    	}
    }

在这里插入图片描述

### Vue3 Element Plus 复选框分页回显解决方案 在处理 `Vue3` 和 `Element Plus` 的表格组件时,为了实现在分页切换后保持已选择项的状态,可以采用以下方案: #### 数据结构设计 确保数据模型能够保存每一页的选择状态。通常做法是在页面级的数据对象中维护一个映射表来记录哪些行被选中。 ```javascript const selectedRowsMap = ref(new Map()); ``` 此变量用于存储每一行唯一标识符到其是否已被勾选的布尔值之间的对应关系[^1]。 #### 表格配置 当初始化表格或加载新页码的数据时,应遍历当前显示的数据集设置默认选中的行。这可以通过监听分页事件在每次更新视图之前同步选择状态完成。 ```html <template> <el-table :data="tableData" @selection-change="handleSelectionChange"> <!-- 列定义 --> <el-table-column type="selection" width="55"></el-table-column> ... </el-table> <div class="pagination-container"> <el-pagination layout="prev, pager, next" :total="total" @current-change="handlePageChange"/> </div> </template> ``` 每当发生分页变化时触发 `handlePageChange` 方法,在该方法内部重新计算哪几条记录应该处于选中状态,通过编程方式调用 `toggleRowSelection()` 来恢复这些选项。 ```typescript import { ElTable } from "element-plus"; // 假设 tableRef 是指向 el-table 组件实例的一个 Ref const handlePageChange = (currentPage) => { // 获取新的数据列表... const currentSelectedKeys = Array.from(selectedRowsMap.value.keys()).filter(key => newDataList.some(item => item.id === key)); nextTick(() => { currentSelectedKeys.forEach((key) => { const row = newDataList.find(item => item.id === key); if(row){ tableRef.value.toggleRowSelection(row, true); } }); }); }; ``` 上述逻辑确保即使用户翻阅不同页面再返回原位置也能看到之前的多选结果得以保留[^2]。 对于渲染函数的具体实现细节以及如何自定义单元格内容可参见提供的 E-expand.js 文件说明;而对于属性配置方面,则需要注意像 `<el-tree-select>` 这样的控件需要正确指定 `props` 属性才能正常工作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值