表格分页选择

144 阅读1分钟

表格分页后选中数据丢失

table表格有很多页,每个页勾选了之后,切换分页,之前的页里所勾选的内容会被清空,现在想要解决此问题,切换分页不清空之前的勾选内容,代码如下:

<template>
  <el-table
    ref="multipleTable"
    :data="tableData"
    tooltip-effect="dark"
    style="width: 100%"
    @select="select"
    @select-all="selectAll"
    v-el-table-infinite-scroll="load"
>
    <el-table-column
      type="selection"
      width="55">
    </el-table-column>
    <el-table-column
      label="日期"
      width="120">
      <template slot-scope="scope">{{ scope.row.date }}</template>
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名"
      width="120">
    </el-table-column>
    <el-table-column
      prop="address"
      label="地址"
      show-overflow-tooltip>
    </el-table-column>
  </el-table>
 
</template>

<script>
  export default {
    data() {
      return {
         // 查询参数
      queryParams: {
        pageNum: 1,
        pageSize: 20,
      },
       // 总条数
      total: 0,
	//选中数据的id集合
      selectID: [],
	//选中数据的集合
      selectedItems: [],
	//表格数据
        tableData: [],
      }
    },
     //监听选中数据变化
     watch: {
    	selectedItems(val) {
     	  this.selectID = [];
         if (val.length > 0) {
         val.forEach((value, index) => {
          this.selectID.push(value.id);
        });
      }
    },
  },
    methods: {
     //选中table已有数据
    selectedPreExisting(rows) {
      if (rows.length > 0) {
        //这里使用this.$nextTick是防止表格未渲染完成就执行,导致无法添加选中效果
        this.$nextTick(() => {
          rows.forEach((row) => {
            //判断row是存在当前tableData
            let selectedItem = this.tableData.find(
              (item) => item.id == row.id
            );
            this.$refs.multipleTable.toggleRowSelection(selectedItem);
          });
        });
      } else {
        this.$refs.multipleTable.clearSelection();
      }
    },
    //表格单选
    select(selection, row) {
      console.log(111);
      //因为翻页之后,点选时selection会出现undefined,所以这里需要进行判断
      //这里可以通过判断选择selection中有没有row,就可以判断出是增加还是删减
      if (
        selection &&
        selection.find((item) => item && item.id == row.id)
      ) {
        this.addRows([row]);
      } else {
        this.deleteRows([row]);
      }
    },
    //表格全选
    selectAll(selection) {
      //判断是选中还是取消
      if (selection.length > 0) {
        this.addRows(this.tableData);
      } else {
        this.deleteRows(this.tableData);
      }
    },
    //添加选中
    addRows(rows) {
      rows.forEach((row) => {
        //过滤,当selectedItems有此条数据时,则直接返回,不执行添加
        if (this.selectedItems.find((item) => item.id == row.id)) {
          return;
        }
        this.selectedItems.push(row);
      });
    },
    //取消选中
    deleteRows(rows) {
      //当selectedItems为空数组时,不执行删除
      if (this.selectedItems.length == 0) {
        return;
      }
      //过滤掉当前取消选中的数组
      rows.forEach((row) => {
        this.selectedItems = this.selectedItems.filter(
          (item) => item.id !== row.id
        );
      });
    },
     //下拉分页
    load() {
      if (this.tableData.length < this.total) {
        this.queryParams.pageNum++;
        this.getList();
      }
    },
    //获取数据
    getList() {
      list(this.queryParams).then((res) => {
        this.tableData = this.tableData.concat(res.rows);
     //重新请求数据时触发,将已经选中的数据传给selectedPreExisting方法
        this.selectedPreExisting(this.selectedItems);
        this.total = response.total;
      });
    },
  }
</script>

博客

同时发表在饼干

Snipaste_2023-12-13_10-04-25.png