elementui table表格跨分页多选

本文介绍如何使用ElementUI的表格组件实现跨页多选功能,并利用row-key和reserve-selection属性简化代码,同时保持选中状态不变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

elementui table表格跨分页多选

项目中遇到的表格多选加分页,要获取选中的数据,使用elementui的表格开发,刚开始思路是:
1.创建一个数组,使它每项为一页所选择的选择项数据数组。选择项改变时,去更新对应项的数组
2.切换页码后,等数据加载完,查找selectionArr中当前页有无被选中的选择项数据。如果有,将数据勾选上。

完整代码如下:

<template>
  <div>
    <el-table
      :data="tableDate"
      ref="table"
      @select="handleSelectionChange"
      @select-all="handleSelectionChange"
    >
    
      <el-table-column type="selection" width="55"> </el-table-column>

      <el-table-column prop="name" label="名称" ></el-table-column>
      
    </el-table>
    
    <el-pagination
      @size-change="handleChangePagination"
      @current-change="handleChangePagination"
      :current-page.sync="paginationData.page"
      :page-sizes="[2, 5, 10, 20, 50]"
      :page-size="paginationData.page_size"
      layout="total,sizes, prev, pager, next, jumper"
      :total="total"
    >
    </el-pagination>
  </div>
</template>
<script>

export default {
  data() {
    return {
    tableDate:[],
    total:0,
      paginationData: {
        page: 1,
        page_size: 2,
      },
      arrSelection: [],
    };
  },


  methods: {
    handleSelectionChange(selection) {
      this.arrSelection[this.paginationData.page - 1] = selection;
    },
    SaveTheSelectionResult() {
      if (this.arrSelection[this.paginationData.page - 1]) {
        this.arrSelection[this.paginationData.page - 1].forEach((value) => {
          this.tableDate.forEach((val, index) => {
            if (value.id === val.id) {
              this.$refs.table.toggleRowSelection(this.tableDate[index], true);
            }
          });
        });
       
      }
    },
	handleChangePagination() {
	      this.$http.get('你自己的网址').then((response)=>{
	          this.tableDate = response.data.tableDate;
	          this.total = response.data.total;
	          this.SaveTheSelectionResult()
	    })
	    },
  },
  mounted() {
	this.handleChangePagination() 
  },
};
</script>

但是通过阅读elementui的表格文档时,发现了两个属性row-key和reserve-selection,两个属性的作用如下:

  • row-key:行数据的 Key,用来优化 Table 的渲染;在使用 reserve-selection 功能与显示树形数据时,该属性是必填的。
  • reserve-selection:仅对 type=selection 的列有效,类型为 Boolean,为 true 则会在数据更新之后保留之前选中的数据(需指定 row-key)

使用这两个属性再加上一些表格的方法就可以实现,无需多余的代码,实现代码如下:

<div class="test">
    <el-table
      :data="tableData"
      ref="table"
      style="width: 50%"
      :row-key="getKey"
      @selection-change="handleChangeSelection"
    >
      <el-table-column type="selection" width="55" reserve-selection>
      </el-table-column>
      <el-table-column label="日期">
        <template slot-scope="scope">{{ scope.row.date }}</template>
      </el-table-column>
      <el-table-column prop="name" label="姓名"> </el-table-column>
      <el-table-column prop="address" label="地址"> </el-table-column>
    </el-table>
    <el-pagination
      @size-change="handleChangePagination"
      @current-change="handleChangePagination"
      :current-page.sync="paginationData.page"
      :page-sizes="[2, 5, 10, 20, 50]"
      :page-size="paginationData.page_size"
      layout="total,sizes, prev, pager, next, jumper"
      :total="total"
    >
    </el-pagination>
<script>
export default {
  data() {
    return {
      tableData: [],
      total: 20,
      paginationData: {
        page: 1,
        page_size: 5,
      },
      arrSelection: [],
    };
  },

  methods: {
    getKey(row) {
      return row.id;
    },
    getTables() {
      console.log(this.arrSelection, "arrSelection");
    },
    // 当选择项发生变化时会触发该事件,selection就是选择的数据
    handleChangeSelection(selection) {
      this.arrSelection = selection;
    },
    handleChangePagination() {
      // 请求表格数据
    },
  },
  mounted() {
    this.handleChangePagination();
  },
};
</script>
### ElementUI框组的回显问题解决方案 在 Vue3 和 ElementUI Plus 组合使用的场景下,处理 `el-checkbox-group` 或者表格中的复框回显问题可以通过绑定数据模型并确保组件状态同步来完成。对于分页表格内的复框而言,保持页面的择一致性是一个常见的挑战。 为了实现这一功能,可以采用如下策略: 1. **维护全局择列表** 创建一个独立的数据结构用于存储所有被中的项 ID 列表,在每次点击复框时更新这个列表,并将其作为默认值传递给每一行的复框控件[^1]。 2. **监听分页变化** 当用户切换不同页面时,通过监听分页事件重新加载当前显示区域内的复框状态,依据之前保存的择记录设置对应的勾项。 以下是具体的代码示例展示如何操作: ```html <template> <div> <!-- 表格 --> <el-table :data="tableData" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="name" label="Name"></el-table-column> </el-table> <!-- 分页器 --> <el-pagination layout="prev, pager, next" :total="total" @current-change="handleCurrentPageChange"></el-pagination> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; // 假设这是从服务器获取的数据源 const allTableData = [ /* 数据 */ ]; let currentPage = ref(1); let pageSize = 10; let total = allTableData.length; // 记录已中的ID集合 let selectedIds = new Set(); function handleSelectionChange(selection) { selection.forEach(item => { selectedIds.add(item.id); // 添加到Set中自动去重 }); } function handleCurrentPageChange(pageNum) { currentPage.value = pageNum; const startIdx = (pageNum - 1) * pageSize; tableData.value = allTableData.slice(startIdx, startIdx + pageSize).map(row => ({ ...row, _checked: selectedIds.has(row.id), // 设置每条记录是否应该处于中状态 })); } </script> ``` 此段代码展示了当用户改变分页时,会基于已经存在的 `selectedIds` 集合调整新一页内各条目的 `_checked` 属性,从而达到视觉上的“记忆”效果,即无论翻阅哪一页都能看到之前做出的择。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值