vxe复选框分页勾选的处理

1. 存在的问题

在vxe组件中定义勾选事件后,如果还有分页的功能,那么基本的勾选事件将存在一定的缺陷,如:当翻页的时候会丢失翻页前已勾选的数据。
设计两页数据:
image.pngimage.png
使用基本的勾选事件:

    checkboxChange() {
      this.checkedRows = this.$refs.table.getCheckboxRecords()
    },
    selectAllCheckboxChange(checked) {
      this.checkedRows = checked.records
    },

勾选两页的数据后:
image.png
image.png
虽然第一页的数据显示已经勾选,但是checkedRows中只有第二页的数据。

2. 解决方法

2.1 vxe标签

在vxe标签中需要添加的属性:

row-id="id"
:checkbox-config="{ reserve: true }" 

2.2 勾选事件
    // 复选框事件(保留翻页选中的数据)
    checkboxChange({ checked, records, reserves, row }) {
      // console.log(checked ? '勾选事件' : '取消事件')
      // console.log('当前选中的数据:' + records)
      // console.log('翻页时其他页的数据:' + reserves)
      // console.log('当前选中的数据行:' + row )
      //勾选选中时
      if (checked) {
        //第一次选数据,还未进行翻页时
        if (reserves.length == 0){
          this.selectionRows = records;
        }else {
          //数据集合,翻页存在已选中的数据时,拼接新选中的数据
          this.selectionRows = [...reserves,...records];
        }
      }else {
        //取消选中时
        this.selectionRows = this.selectionRows.filter(item => item.id !== row.id)
      }
    },
    //vxe复选框当前页全选中方法(保留翻页选中的数据):
    selectAllCheckboxChange({ checked, records, reserves}) {
      // console.log(checked ? '勾选事件' : '取消事件')
      // console.log('当前选中的数据:' + records)
      // console.log('翻页时其他页的数据:' + reserves)
      //全选中时
      if (checked) {
        //第一次选数据,还未进行翻页时
        if (reserves.length == 0){
          this.selectionRows = records;
        }else {
          //数据集合,翻页存在已选中的数据时,拼接新选中的数据
          this.selectionRows = [...reserves,...records];
        }
      }else {
        //取消全选时,直接将翻页数据赋值,当前页数据不用加上
        this.selectionRows = reserves;
      }
    },

此时在进行翻页选其他页的数据时,还能保留前面选中的数据的功能。
image.png
如果有删除翻页时其他页的数据的需求,可以使用this.$refs.xTable.clearCheckboxReserve() 方法清除。

完整代码

<template>
  <button @click="save()">确定</button>
  <vxe-grid
      border
      ref="table"
      row-id="id"
      style="width: 500px"
      :data="tableData"
      :columns="tableColumn"
      :checkbox-config="{ reserve: true }"
      :pager-config="tablePage"
      @page-change="handlePageChange"
      @checkbox-change="checkboxChange"
      @checkbox-all="selectAllCheckboxChange"
  >
  </vxe-grid>
</template>

<script>
export default {

  name: "VxeCheck",
  data() {
    return {
      tableData: [
        {id: 10001, name: 'Test1', role: 'Develop', sex: 'Man', age: 28, address: 'test abc'},
        {id: 10002, name: 'Test2', role: 'Test', sex: 'Women', age: 22, address: 'Guangzhou'},
      ],
      tableColumn: [
        { type: 'checkbox', width: 50 },
        { field: 'name', title: 'Name', width: 150, align: 'center' },
        { field: 'sex', title: 'Sex', align: 'center'},
        { field: 'age', title: 'Age', align: 'center' },
        { field: 'address', title: 'Address', align: 'center' },
      ],
      tablePage: {
        total: 4,
        currentPage: 1,
        pageSize: 2,
        align: 'left',
        pageSizes: [2, 3],
        layouts: ['Sizes', 'PrevJump', 'PrevPage', 'Number', 'NextPage', 'NextJump', 'FullJump', 'Total'],
        perfect: true
      },
      /*table选中records*/
      selectionRows : [],
    }
  },
  methods: {
    // 复选框事件(保留翻页选中的数据)
    checkboxChange({ checked, records, reserves, row }) {
      // console.log(checked ? '勾选事件' : '取消事件')
      // console.log('当前选中的数据:' + records)
      // console.log('翻页时其他页的数据:' + reserves)
      // console.log('当前选中的数据行:' + row )
      //勾选选中时
      if (checked) {
        //第一次选数据,还未进行翻页时
        if (reserves.length == 0){
          this.selectionRows = records;
        }else {
          //数据集合,翻页存在已选中的数据时,拼接新选中的数据
          this.selectionRows = [...reserves,...records];
        }
      }else {
        //取消选中时
        this.selectionRows = this.selectionRows.filter(item => item.id !== row.id)
      }
    },
    //vxe复选框当前页全选中方法(保留翻页选中的数据):
    selectAllCheckboxChange({ checked, records, reserves}) {
      // console.log(checked ? '勾选事件' : '取消事件')
      // console.log('当前选中的数据:' + records)
      // console.log('翻页时其他页的数据:' + reserves)
      //全选中时
      if (checked) {
        //第一次选数据,还未进行翻页时
        if (reserves.length == 0){
          this.selectionRows = records;
        }else {
          //数据集合,翻页存在已选中的数据时,拼接新选中的数据
          this.selectionRows = [...reserves,...records];
        }
      }else {
        //取消全选时,直接将翻页数据赋值,当前页数据不用加上
        this.selectionRows = reserves;
      }
    },
    save() {
      console.log(this.selectionRows)
    },
    handlePageChange({ currentPage, pageSize }) {
      this.tablePage.currentPage = currentPage
      this.tablePage.pageSize = pageSize
      if (pageSize === 2 && currentPage === 1) {
        this.tableData = [
          {id: 10001, name: 'Test1', role: 'Develop', sex: 'Man', age: 28, address: 'test abc'},
          {id: 10002, name: 'Test2', role: 'Test', sex: 'Women', age: 22, address: 'Guangzhou'},
        ]
      }
      if (pageSize === 2 && currentPage === 2) {
        this.tableData = [
          {id: 10003, name: 'Test3', role: 'PM', sex: 'Man', age: 32, address: 'Shanghai'},
          {id: 10004, name: 'Test4', role: 'Designer', sex: 'Women', age: 23, address: 'test abc'}
        ]
      }
    }
  }
}
</script>

<style scoped>

</style>
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

€云起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值