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

news2025/1/13 17:03:08

目录

背景描述

实现效果

详细开发

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-table
      ref="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-pagination
      v-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']"
      background
      small
      @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 = 1
  params.pageSize = val
  getListData()
}
const handleCurrentChange = (val) => {
  params.page = val
  getListData()
}
</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.coloradmin.cn/o/1149452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「Eolink Apikit 教程」如何快速创建有效的API监控任务?

API 监控能够确保 API 的稳定性。如果一个 API 出现故障或崩溃&#xff0c;它可能会导致整个应用程序无法正常工作。这对用户和业务来说可能是灾难性的。通过监控 API&#xff0c;开发团队可以及时发现问题并采取措施来修复它们&#xff0c;从而降低应用程序中断的风险。 作为…

(免费领源码)PHP#mysql高校学生考证资源共享小程序35055-计算机毕业设计项目选题推荐

摘要 大学生“考证”已经成为大学生的一门必修课&#xff0c;越来越多的大学生加入考证的行列&#xff0c;他们认为毕业找工作的时候&#xff0c;证书是多多益善。大学生“考证热”应该引起学生&#xff0c;学校、以及社会用人单位等多方面的高度重视。大学生考证热潮的形成&am…

拉普拉斯噪声

拉普拉斯噪声是指从拉普拉斯分布中抽取的随机变量。拉普拉斯分布是一种连续型概率分布&#xff0c;其概率密度函数为&#xff1a; 拉普拉斯噪声在差分隐私&#xff08;Differential Privacy&#xff09;领域中被广泛使用&#xff0c;原因有以下几点&#xff1a; 灵活性&#xf…

学习笔记|单样本t检验|P值|两独立样本均数T检验|规范表达|《小白爱上SPSS》课程:SPSS第五讲 | 两独立样本均数T检验,你会了吗?

目录 学习目的软件版本原始文档P值是假设检验的终极者两独立样本均数T检验一、实战案例二、案例解析三、统计策略四、SPSS操作1、正态性检验2、T检验&#xff08;独立样本T检验&#xff09;结果 五、结果解读Tips&#xff1a;补充知识 六、规范报告1、规范表格2、规范文字 注意…

2.基于Jetson Nano的嵌入式小车避障项目

英伟达jetbot智能小车 一.数据采集 数据采集的时候&#xff0c;一定要不用的光线&#xff0c;不同的方向&#xff0c;不同的环境。 一般500-600张 二.AI训练 三.AI部署 import torch import torchvision3.1 加载预训练模型 第一步&#xff1a;载入模型 model torchvisi…

gitlab添加ssh秘钥

安装git 右击&#xff1a;git bash here 1.首先用如下命令&#xff08;如未特别说明&#xff0c;所有命令均默认在Git Bash工具下执行&#xff09;检查一下用户名和邮箱是否配置&#xff08;gitlab支持我们用用户名或邮箱登录&#xff09;&#xff1a; git config --global --…

『赠书第 2 期』- 『Django+Vue.js商城项目实战』

文章目录 1024 程序员节学习新技术关于作者内容介绍抽奖评论区抽三位小伙伴送书活动时间&#xff1a;截止到 2023-11-05 20:00:00 获奖名单 ps. 文末有抽奖&#xff0c;抽奖为 Swift社区 额外福利 1024 程序员节 受邀参加了 CSDN 举办的 1024 程序员节上海站的活动&#xff0…

【贝叶斯回归】【第 2 部分】--推理算法

一、说明 在第一部分中&#xff0c;我们研究了如何使用 SVI 对简单的贝叶斯线性回归模型进行推理。在本教程中&#xff0c;我们将探索更具表现力的指南以及精确的推理技术。我们将使用与之前相同的数据集。 二、模块导入 [1]:%reset -sf[2]:import logging import osimport tor…

亮氨酸脯氨酸肽——一种新型的医药中间体研究肽

亮氨酸脯氨酸医药中间体肽是一种合成&#xff08;人造&#xff09;激素&#xff0c;类似于大脑中产生的天然激素。它用于治疗许多医疗问题&#xff0c;包括&#xff1a; 子宫平滑肌瘤&#xff08;子宫肌瘤&#xff09;出血引起的贫血&#xff0c;或晚期或晚期前列腺癌症&#…

管理类联考——数学——汇总篇——知识点突破——代数——整式分式——记忆

文章目录 考点记忆/考点汇总——按大纲 整体目录大纲法记忆宫殿法绘图记忆法 局部数字编码法归类记忆法重点记忆法歌决记忆法谐音记忆法理解记忆法比较记忆法转图像记忆法可视化法 本篇思路&#xff1a;根据各方的资料&#xff0c;比如名师的资料&#xff0c;按大纲或者其他方式…

大数据之LibrA数据库系统告警处理(ALM-12002 HA资源异常)

告警解释 HA软件周期性检测Manager的WebService浮动IP地址和数据库。当HA软件检测到浮动IP地址或数据库异常时&#xff0c;产生该告警。 当HA检测到浮动IP地址或数据库正常后&#xff0c;告警恢复。 告警属性 告警参数 对系统的影响 如果Manager的WebService浮动IP地址异常…

手机平板摄像头如何给电脑用来开视频会议

环境&#xff1a; Iriun Webcam EV虚拟摄像头 钉钉会议 问题描述&#xff1a; 手机平板摄像头如何给电脑用来开视频会议 解决方案&#xff1a; 1.下载软件 手机端和电脑端都下载这个软件&#xff0c;连接同一局域网打开软件连接好 另外一款软件Iriun 也是一样操作 2.打…

Pytorch L1,L2正则化

L1正则化和L2正则化是常用的正则化技术&#xff0c;用于在机器学习模型中控制过拟合。它们的主要区别在于正则化项的形式和对模型参数的影响。 L1正则化&#xff08;Lasso正则化&#xff09;&#xff1a; 正则化项形式&#xff1a;L1正则化使用模型参数的绝对值之和作为正则化…

RUP核心工作流2021-架构师(六十四)

1、根据传统的软件生命周期方法学&#xff0c;可以把软件生命周期划分为&#xff08;&#xff09;。 A、软件定义、软件开发、软件测试、软件维护 B、软件定义、软件开发、软件运行、软件维护 C、软件分析、软件设计、软件开发、软件维护 D、需求获取、软件设计、软件开发、…

跳槽一定用得上的大厂Java题库!

2023年已经接近尾声了&#xff0c;疫情的影响也在逐渐减小&#xff0c;市场慢慢复苏。不过最近还是会有一些读者粉丝朋友反馈&#xff0c;“Java市场饱和了”、“大环境还是不好”、“投几十个简历都没有一个约面的”。其实并不是岗位需求量变少了&#xff0c;是越来越多的公司…

Calcite 优化层详解

1、关系代数与火山模型 1&#xff09;关系代数 基本的关系代数运算有选择、投影、集合并、集合差、笛卡儿积等。 在这些基本运算之外&#xff0c;还有一些集合之间的交集、连接、除和赋值等运算。 连接运算可分为连接、等值连接、自然连接、外连接、左外连接和右外连接。 …

腰背肌筋膜炎能彻底治愈吗

腰背肌筋膜炎&#xff1a;急性期腰部疼痛剧烈&#xff0c;有烧灼感&#xff0c;腰部活动时症状加重&#xff0c;局部压痛显著&#xff0c;有时体温升高、血液检查可见白细胞增高。急性发作后&#xff0c;少数患者症状完全消退&#xff0c;多数会遗留疼痛&#xff0c;或相隔数月…

SSM律师事务所业务管理系统 毕业设计-附源码01664

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;律师事务所业务管理系统当然也不能排除在外。律师事务所业务管理系统是以实际运用为开发背景&#xff0c;运用软件工程原…

QT实现在线流媒体播放平台

文章目录 QT实现在线流媒体播放平台简介开发视频ffmpeg下载SimpleVideoPlayer.hSimpleVideoPlayer.cpp 开发音频添加功能打开文件夹播放暂停播放上下一首选择倍速 效果展示项目下载 QT实现在线流媒体播放平台 简介 Qt是一种流行的C开发框架&#xff0c;它提供了用于构建图形用…

基于 Center 的 3D 目标检测和跟踪

论文地址&#xff1a;https://arxiv.org/abs/2006.11275 论文代码&#xff1a;https://github.com/tianweiy/CenterPoint 3D 目标通常表示为点云中的 3D Boxes。 CenterPoint 在第一阶段&#xff0c;使用关键点检测器检测对象的中心&#xff0c;然后回归到其他属性&#xff0…