element-ui table多选框分页跳转后回显勾选状态

3,740 阅读1分钟

描述

当使用el-table勾选效果的时候,会出现第一页勾选后翻页到下一页,再跳转回第一页,这时第一页的勾选状态全没了。这是因为执行了接口查询后重新替换数据,触发了vue的双向绑定,对dom进行了重新的创建,所以原来的勾选状态丢失。

解决思路

使用object对勾选数据使用键值对的形式进行保存,键(key)是页数,值(value)就是勾选的数据

演示

20220228.gif

提示:主要使用 handleSelectionChange() 和 check() 方法,复制这2个方法到自己项目使用。check函数里的 if 判断也要改成自己需要判断的字段

<template>
  <div id="app">
    <el-table ref="multipleTable"
              :data="tableData1"
              @select-all="handleSelectionChange"
              @select="handleSelectionChange">
      <el-table-column type="selection"></el-table-column>
      <el-table-column prop="name" label="姓名"></el-table-column>
    </el-table>
    <el-pagination :current-page.sync="page" :page-size="3" @current-change="pageChange" :total="9"></el-pagination>
  </div>
</template>
<script>
export default {
  data() {
    return {
      page: 1,
      tableData1: [],
      tableData: [{
        name: '王小虎1',
        id: '1'
      }, {
        name: '王小虎2',
        id: '2'
      }, {
        name: '王小虎3',
        id: '3'
      }, {
        name: '王小虎4',
        id: '4'
      }, {
        name: '王小虎5',
        id: '5'
      }, {
        name: '王小虎6',
        id: '6'
      }, {
        name: '王小虎7',
        id: '7'
      }, {
        name: '王小虎8',
        id: '8'
      }, {
        name: '王小虎9',
        id: '9'
      },],
      multipleSelection: {}
    }
  },
  mounted() {
    this.pageChange()
  },
  methods: {
    /**
     * 手动勾选数据行的 Checkbox 时触发
     **/
    handleSelectionChange(val) {
      const arr = new Set()
      let item = {}
      for (item of val) {
        arr.add(item.id)
      }
      // 使用当前页数做key
      this.multipleSelection[this.page] = arr
    },

    /**
     * 记忆勾选方法
     **/
    check() {
      this.$nextTick(() => {
        if (this.multipleSelection[this.page]) {
          /**
           * 注意:一定要 multipleSelection 跟表格数据比对,比对成功的使用表格数据的值设置勾选。
           **/
          this.tableData1.map(val => {
            // val.id 改为自己要比对的值
            if (this.multipleSelection[this.page].has(val.id)) {
              this.$refs.multipleTable.toggleRowSelection(val);
            }
          })
        }
      })
    },
    /**
     * 模拟分页
     **/
    pageChange() {
      this.tableData1 = [];
      let count = this.page * 3;
      let num = (this.page * 3) - 3;
      for (let i = num; i < count; i++) {
        this.tableData1.push(this.tableData[i])
      }
      this.check()
    }
  }
}
</script>