vue3+element-plus 表格全选和跨页勾选,以及全选全部功能

目录

背景描述

实现效果

详细开发

1.模拟数据和页面布局

2.跨页勾选和点击勾选功能

3.表头全选

4. 全选全部

(1)全选后禁用表格勾选(简单)

(2)真正意义上的全选全部(难)

总结


背景描述

表格的全选、部分勾选、跨页勾选、本页全选,这几个功能,有很多实现的方法,先说如何保留勾选状态:

1.在表格的数据源中添加一个用于标记选中状态的属性,通常为 selected,当用户单击表格中的某一行复选框时,更新该行的 selected 属性,使用table的select。

2. 借助表格的三个事件,回调函数的selection会记住当前勾选的行。

本篇是根据第二种方法实现的。


实现效果

最终实现的效果如下:

1.多页下勾选,第一页勾选3条,第二页勾选2条,返回第一条,依旧显示勾选的3条

2.单页全选和取消全选

3.手动取消勾选后,本页的全选(表头那里)的中间状态被取消——借助element-plus直接实现了,如果是手写的话需要考虑这个问题,同样的如果需要是实现全选所有的功能,也需要考虑这步。

4.全选全部(最难的部分)——这里是通过全选所有后,禁用表格的勾选框和隐藏表头的勾选框,给接口传一个标志全选的参数来实现这个功能的 ,最简单粗暴的方式。(如果是按钮代表勾选则不用考虑这些)

当然【全选所有】这个功能如果真正实现,需要考虑很多交互,在后面说具体方式。


详细开发

先建一个文件,index.vue

1.模拟数据和页面布局

全部代码

<template><el-card class="card-style"><div class="mt-1"><h2 class="fwb-mb-1">批量全选功能</h2></div><el-row style="margin: 10px 0"><el-col :span="12"><el-checkbox v-model="checkAll" @change="checkAllChange">全选所有</el-checkbox></el-col></el-row><el-tableref="tableRef":data="tableData.slice((params.page - 1) * params.pageSize, params.page * params.pageSize)"class="table-small-custom":row-key="(row) => row.id"height="calc(100vh - 271px)"@select="selectChange"@select-all="selectAllChange"@selection-change="handleSelectionChange"><!-- :header-cell-class-name="leftHeaderStyle" --><!-- :selectable="handleSelectable" --><el-table-column type="selection" width="30" :reserve-selection="true" /><el-table-column type="index" width="70" label="序号" align="center"><template #default="scope"><span v-text="getIndex(scope.$index)"></span></template></el-table-column><el-table-column prop="id" label="id" min-width="160" align="center"></el-table-column></el-table><el-paginationv-model:current-page="params.page"v-model:page-size="params.pageSize"class="pg-block"layout="total, sizes, prev, pager, next, jumper":total="pageTotal":page-sizes="['3', '5']"backgroundsmall@current-change="handleCurrentChange"@size-change="handleSizeChange"/></el-card>
</template><script setup>
import { ref, reactive, defineProps, computed, defineEmits, onMounted, inject } from 'vue'
import axios from '@/utils/request.js'
import { ElMessage, ElMessageBox } from 'element-plus'let tableData = ref([])
let pageTotal = ref(0)
let params = reactive({page: 1,pageSize: 3
})onMounted(async () => {getListData()
})const getListData = async () => {//接口数据tableData.value = [{ id: 12 }, { id: 13 }, { id: 14 }, { id: 15 }, { id: 16 }, { id: 17 }, { id: 18 }]pageTotal.value = tableData.value.length
}const checkAll = ref(false)
const checked = ref([])
const handleSelectable = (row, index) => {return !checkAll.value
}
const selectAllChange = (selection) => {console.log('表头全选', selection)//处理数据//。。。
}const selectChange = (selection, row) => {console.log('勾选', selection, row)//处理数据//。。。
}
const handleSelectionChange = (selection) => {//处理数据//。。。checked.value = selection.map((item) => item.id)
}
const leftHeaderStyle = ({ row, column, rowIndex, columnIndex }) => {if (rowIndex == 0 && columnIndex === 0 && checkAll.value) {return 'selectAllBtnDis'}
}// 为下面全选所有功能
const tableRef = ref(null)
const checkAllChange = (val) => {//全选if (val) {tableRef.value.clearSelection()tableRef.value.toggleAllSelection()}
}const getIndex = (index) => {return (params.page - 1) * params.pageSize + index + 1
}
const handleSizeChange = (val) => {params.page = 1params.pageSize = valgetListData()
}
const handleCurrentChange = (val) => {params.page = valgetListData()
}
</script><style lang="scss" scoped>
:deep(.selectAllBtnDis .cell) {visibility: hidden;
}
</style>

这里tableData虽然模拟的是前端分页,但是和后端分页效果一样,勾选功能同样适应 

2.跨页勾选和点击勾选功能

element-plus已经支持跨页勾选了,只需要这两个属性:

:row-key="(row) => row.id":reserve-selection="true"

实现效果就如 【实现效果】里第一条。

3.表头全选


const selectAllChange = (selection) => {console.log('表头全选', selection)//处理数据//。。。
}

这里可以处理需要用的数据,当然 手动勾选的时候也要处理数据(selectChange),并且根据打印参数的顺序,如果调用表格的 toggleAllSelection方法来全选表格,selectChange里也会处理顺序,所以,在这一步处理数据是最好的。

关于表格的toggleAllSelection,是用于切换表格的全选和全不选,所以一个表格多次调用就会出现先全选再全不选。之前写翻页默认全选的功能时,用了这个方法,发现有个bug,就是前面那种情况,所以后来 改成了——foreach表格数据然后toggleRowSelection,效果一样。

还有如果翻页默认全选,那么可以先用clearSelection,再toggleAllSelection

4. 全选全部

(1)全选后禁用表格勾选(简单)

这种就是通过全选后,禁用表格的勾选,借助:selectable="handleSelectable" ,如果全选了,则表格不能勾选。

  <el-table-column type="selection" width="30" :reserve-selection="true" :selectable="handleSelectable" />const handleSelectable = (row, index) => {return !checkAll.value
}

并且表头不能被勾选,也就是本页全选,有几种实现方式,要么表头的勾选禁用,要么是表头的勾选隐藏掉,禁用这个应该能实现,但是没有找到方法 ,因为数据为空时,表头就是禁用的:

所以我只好隐藏表头的勾选框:

 通过给table加了一个表头的样式  :header-cell-class-name="leftHeaderStyle"

const leftHeaderStyle = ({ row, column, rowIndex, columnIndex }) => {if (rowIndex == 0 && columnIndex === 0 && checkAllPatient.value) {return 'selectAllBtnDis'}
}:deep(.selectAllBtnDis .cell) {visibility: hidden;
}

实现效果:

 

(2)真正意义上的全选全部(难)

如果要实现真正意义的全选所有,也就是跨页全选,有两种前提:

第一种是前端分页的背景下,直接全选所有后,直接给所有数据加一个selected的属性,或者,已勾选的数据里是全部数据,翻页的时候,遍历当页数据,然后toggleRowSelection。

第二种是后端分页情景下的全选所有。

那么前端无法获取全部数据,自然也翻页后无法知道当前选中哪些,是否全选了,虽然element-plus已经支持记住勾选的数据的功能,但是也很实现这个交互,需要考虑以下几个问题:

  • 全选所有后,当前checkbox是√形式,这种,并且当页的表格被勾选,这个简单,借助【先用clearSelection,再toggleAllSelection】就可以实现。
  • 全选所有后,翻页默认全选,则,翻页的时候需要调用一下上面那一步。
  • 以上两步,都需要记住数据,无所谓,反正handleSelectionChange时会处理数据
  • 全选所有后取消全选,那么就需要clearSelection,翻页时也需要。
  • 全选全部后,取消勾选某一个行或者点表头来取消当页勾选,那么【全选全部】 的checkbox是-的方式,代表已经全选过,但是当前用户手动取消掉一些。那么实现这个功能,则需要考虑,怎么传递数据
  • 比如在第一页全选所有了,那么后面十几页都是被勾选的 ,如果你没有翻页,自然无法获取后面 的数据,传参时如果需要实现上面这个功能,可以和后端沟通,全选时传一个标志,然后再取消勾选时,记住当前取消勾选的数据,传给后端,他们处理数据时就【全部数据-被取消勾选的数据】,这种方式比较便捷
  • 上面时在勾选全部的基础上的一些交互和数据处理,如果是用户手动勾选/手动全选本页,一共十三条数据,全部勾选了,那么【全选全部】被勾选,这个好实现,只需要对比seleced数据的长度和total就行,之后再取消就也跟上面逻辑一样。

以上差不多是实现的主要难点,目前我查找解决方案,也大多是给这种方式,如果有其他方式,可以在评论区告知。


总结

这个功能,需要考虑很多交互的逻辑,因为我写的是【全选全部】是一个checkbox的勾选框,所以要考虑取消勾选的功能,自然就有了上面真正实现时的难点。但是如果这个功能是通过一个按钮控制的,点击按钮就代表全选所有操作,那么自然不用考虑取消勾选和禁用的逻辑,因为全选所有时,就已经走完批量全选的流程了。两种实现方式根据业务具体的调整,这次也是为了记录实现这个功能时遇到的问题和思考。

关于最后阐述的【全选全部】功能的难点,确实我现阶段没有好的实现方式,只想到那一种,如果有其他的方式,评论区可以指导一下,感谢~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/175566.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elementUI el-collapse 自定义折叠面板icon 和 样式 或文字展开收起

: :v-deep{.el-collapse-item__arrow {width: 40px;}.el-icon-arrow-right:before {content: "展开";font-size: 15px;font-family: heiti;color: #2295ff;font-weight: bold;}.el-collapse-item__arrow.is-active {transform: none;}.el-collapse-item__arrow.is-a…

HarmonyOS原生分析能力,即开即用助力精细化运营

数据分析产品对开发者的价值呈现在两个层面&#xff0c;第一个是产品的层面&#xff0c;可以通过数据去洞察用户的行为&#xff0c;从而找到产品的优化点。另外一个就是运营层面&#xff0c;可以基于数据去驱动&#xff0c;来实现私域和公域的精细化运营。 在鸿蒙生态上&#…

ELK 日志分析实践

一 ELK 1 ELK 概述 ELK是一整套解决方案&#xff0c;是三个软件产品的首字母缩写&#xff0c;很多公司都在使用&#xff0c;如:Sina、携程、华为、美团等 Elasticsearch&#xff1a;负责日志检索和储存 Logstash&#xff1a;负责日志的收集和分析、处理 Kibana&#xf…

【高效开发工具系列】你真的会使用Mac吗?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Ubuntu中使用yum命令出现错误提示:Command ‘yum‘ not found, did you mean:

Ubuntu中使用yum命令出现错误提示:Command ‘yum’ not found, did you mean: command ‘gum’ from snap gum (0.12.0) command ‘num’ from deb quickcal (2.4-1) command ‘yum4’ from deb nextgen-yum4 (4.5.2-6) command ‘uum’ from deb freewnn-jserver (1.1.1~a021…

KaiwuDB 亮相第四届跨国公司领导人青岛峰会

10月10日至12日&#xff0c;由商务部和山东省人民政府共同主办的第四届跨国公司领导人青岛峰会在青岛国际会议中心举办。该峰会为跨国公司打造的国家级开放平台&#xff0c;是聚集跨国公司与中国合作、专注跨国公司议题、分享跨国公司经验、链接资源、促进合作的重大活动。Kaiw…

第19期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

win11系统msvcp120.dll丢失的解决方法,亲测有效的详细方法

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“msvcp120.dll丢失”这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些修复措施。本文将介绍五个修复msvcp120.dll丢失的方法&#xff0c;帮助大…

数据库概念和sal语句

数据库概念和sal语句 数据&#xff1a;数字信息 据&#xff1a;属性对一系列对象的具体属性的描述的集合。 数据库&#xff1a;数据库就是用来组织&#xff08;各个数据之间是有关联&#xff0c;是按照规则组织起来的&#xff09;&#xff0c;存储和管理&#xff08;对数据的增…

qt 系列(一)---qt designer设计常用操作

最近转战qt, 主要用qt designer 进行GUI开发&#xff0c;记录下实战经验~ 1.前言 qt 是跨平台C图形用户界面应用程序开发框架&#xff0c;可以使用的IDE工具有 qt creator 和 vs, 这里我主要使用 Visual Studio 2017 工具进行程序开发与编写。 2. 环境配置 只写关键步骤~~ …

Apriori算法

Apriori算法是关联规则挖掘算法&#xff0c;也是最经典的算法。 Apriori算法是一种用于挖掘数据集中频繁项集的算法&#xff0c;进而用于生成关联规则。这种算法在数据挖掘、机器学习、市场篮子分析等多个领域都有广泛的应用。 Apriori算法是为了发现事物之间的联系的算法&am…

弱覆盖栅格图层制作

栅格边界生成及图层制作 栅格边界polygon生成 提取的弱覆盖栅格数据中包含了栅格中心经度和栅格中心维度&#xff0c;我们根据栅格中心经纬度生成对应的栅格边界POLYGON&#xff08;20米*40米&#xff09; 计算公式&#xff1a;polygon(栅格中心经度-0.00017 栅格中心纬度0.00…

详解—数据结构《树和二叉树》

目录 一.树概念及结构 1.1树的概念 1.2树的表示 二.二叉树的概念及结构 2.1概念 2.2二叉树的特点 2.3现实中的二叉树 2.4数据结构中的二叉树 2.5 特殊的二叉树 2.6二叉树的存储结构 2.6.1二叉树的性质 2.6.2 顺序结构 2.6.3链式存储 三. 二叉树的链式结构的遍历 …

【C语言_题库】C语言:编写一个程序,输入一组字符串,将字符串中的小写字母转换为大写字母,其它字符不变,并输出。

把键盘输入的一行字符串的小写字母转换成大写字母,其余字符不变,进行输出,直到遇到回车为止。 具体说明 【问题描述】 从键盘输入一行英文字符串,把所有小写字母变成大写字母,其他字母和字符保持不变。 【输入形式】 输入一行字符串,含大小写。 【输出形式】 输出大写字…

Yusi技术资讯博客wordpress模板

Yusi技术资讯博客wordpress模板&#xff0c;从第一感觉看上去&#xff0c;两栏结构直接将网站的内容展现&#xff0c;以红白灰色调搭配&#xff0c;一种低调协调的风格&#xff0c;喜欢该wordpress主题的朋友可以下载试试。 下载地址&#xff1a;https://bbs.csdn.net/topics/…

图的深度优先遍历的六种应用附Java代码

目录 无向图的连通分量个数 单纯求出了连通分量个数 能具体返回哪几个点是同一个连通分量 路径问题 单源路径问题 从某个顶点到另一个顶点的路径问题 检测无向图中的环 二分图的检测 无向图的连通分量个数 单纯求出了连通分量个数 import java.util.ArrayList;publi…

DoLa:对比层解码提高大型语言模型的事实性

DoLa&#xff1a;对比层解码提高大型语言模型的事实性 摘要1 引言2 方法2.1 事实知识在不同层级上演化2.2 动态早期层选择2.3 预测对比 3 实验3.1 任务3.2 实验设置3.3 多项选择3.3.1 TruthfulQA&#xff1a;多项选择3.3.2 FACTOR&#xff1a;维基、新闻 3.4 开放式文本生成3.4…

SUE3000 1VCF750090R804 REM615面板

SUE3000 1VCF750090R804 REM615面板 蓝色波长激光的特殊特性使扫描仪适用于各种材料的高精度轮廓和尺寸测量&#xff0c;包括闪亮的表面、炽热的发光金属、有机材料(如食品、木材和木质单板)&#xff0c;以及透明或半透明材料&#xff0c;如塑料、玻璃、光学元件和薄膜/基底。…

【波形图】LabVIEW中的波形图和波形图表有什么区别?

波形图和波形图表在显示和更新数据的方式上有所不同。 波形图可接受各种类型的数据阵列&#xff0c;例如数组&#xff0c;波形或动态数据。波形图在接收到数据后将立即绘制所有接收到的数据点 。波形图不接受单点值。当您将包含数据点的数组连接到波形图时&#xff0c;波形图会…

Syntax Error: TypeError: this.getOptions is not a function的解决(Vue)

报错信息&#xff1a; TypeError: this.getOptions is not a function 这个是在运行项目是遇到的问题 这个报错是类型错误&#xff0c;this.getOptions 不是一个函数 。这个错误一般就是less-loader库里的错误。 主要是less-loader版本太高&#xff0c;不兼容this.getOptions…