• element表格跨页全选实现(二)之后端分页


    一.实现思路与效果图

    1.大体思路

    1. 因为如果数据量过大,无法获取所有的数据,所以需要一个标志告诉后端有没有全选

    2. 然后要考虑一种情况,就是全选后,用户再次勾选取消单个选中的数据,用另外一个数组存储这个勾选的数组。

    3. 后端接口拿到两个数据,一个是全选标志,一个是钩子取消的数组数据,通过全部数据减去钩子的数据就是选中的数据。

    4. 如果没有全选,则是选择单个的,用一个数组存储选中的数据即可

    2.ui思路

    • 一个全选按钮,控制是否全选
    • 难点:跨页实现全选。这里因为是后端分页,所以只能ui全选当前页,我这里是通过点击分页切换时再全选下一页。这个时候会存在一个问题就是:如果点击下一页默认全选,然后用户再次点击取消钩子,由于是默认全选了,所以会把取消的也选上。
    • 解决钩子取消选中再次勾上的问题,拿当前页数组和储存取消钩子的数组做差集,获得当前页没有被勾选取消的数组,然后钩上即可

    关键思路就是,传一个全选标志和一个全选后取消选中的数组,后端根据全选标志判断是否全选,是全选则用所有数据减去取消选中的数据得到真正的数据。

    效果图:

    二.具体实现

    1定义一个全选标志和全选方法

    1. //是否全选标志,ture为全选中
    2. const selectFlag = ref(false)
    3. const selectAll = (rows) => {
    4. selectFlag.value = !selectFlag.value
    5. rows.forEach((row) => {
    6.   webTableRef.value.multipleTableRef.toggleRowSelection(row, true)
    7. })
    8. if (!selectFlag.value) {
    9.   //取消全选
    10.   webTableRef.value.multipleTableRef.clearSelection()
    11. }
    12. }

    2.点击分页按钮时,通过全选标志判断是否需要ui显示全选当前页,同时过滤掉选中取消的数据

    1. //存储表格未选中的数据
    2. const noSelectTaskList = ref([])
    3. const changePageSize = async (val) => {
    4. //新建一个新数组,和当前页数据数组求差集,过滤掉用户全选后然后取消勾选的数组
    5. //switchUserList是当前页的数据
    6. //.every是为了求差集
    7. const newArr = switchUserList.value.filter((v) => {
    8. return noSelectTaskList.value.every((e) => e.id != v.id)
    9. })
    10. if (selectFlag.value === true) {
    11. newArr.forEach((row) => {
    12. webTableRef.value.multipleTableRef.toggleRowSelection(row, true)
    13. })
    14. }
    15. }

    3.使用element的 @select="judgeSelectTick"绑定选中钩子时触发的事件,如果是选中勾上则noSelectTaskList.value.push该条数组;

    取消勾中则splice删除该条数据

    1.     @select="judgeSelectTick">
    2.       <el-table-column :type="selection" :reserve-selection="true" width="55" />
    3.          
    4.  
    1. const judgeSelectTick = (selection, row) => {
    2. // true为选中, 0或false为取消选中
    3. const selected = selection.length && selection.indexOf(row) !== -1
    4. if (!selected) {
    5.   const res = noSelectTaskList.value.findIndex((item) => item.id === row.id)
    6.   selectTaskList.value.splice(res, 1)
    7.   noSelectTaskList.value.push(row)
    8. } else {
    9.   const res = noSelectTaskList.value.findIndex((item) => item.id === row.id)
    10.   noSelectTaskList.value.splice(res, 1)
    11.   selectTaskList.value.push(row)
    12. }
    13. }

    selection方法,selection返回的是选中所有数组,一个都不选中则返回空。row则是勾中或者不勾中都返回该行数据。

    如下:

    三.结合业务理解

    结合业务理解,我这里的业务是可以全选分配任务,也可以选单个分配,所以还会有一个selectTaskList,控制是否选中单个数据。也就是说这里的表格包含两个功能:一个是全选(需要全选标志selectFlag和取消勾选数组noSelectTaskList),一个是可以单选(存储勾中选中的数组selectTaskList)。

  • 相关阅读:
    leetcode做题笔记189. 轮转数组
    七天强化学习DAY1-2|(二)马尔科夫决策过程MDP|学习笔记
    PHP多功能投票微信小程序系统源码
    处理 S4过账时的错误:“更正统一日记账分类账的定制设置”
    Stable Diffusion模型运算量分析
    STC 51单片机47——外部中断控制流水灯
    基站天线交叉极化比测量的不确定度评定
    音视频 RED 与 FEC 的 RTP 格式封装
    win11 defender关闭以及恢复
    体验 win10 下 oceanbase 数据库
  • 原文地址:https://blog.csdn.net/qq_26018335/article/details/127755243