vue element ui 表格带分页全选情况

2023-11-08

vue element ui 表格带分页全选情况

1. 效果

在这里插入图片描述
在这里插入图片描述

2. 原理

我们真实的情况,选择一条或者多条,将选择的id拼接成一个id数组传给后端,但是问题,如果数据过多的话,全选加入有4-5W条数据传递起来很费力而且可能会出错。和后端商量,当全选选择全部数据时,我们前端只传递一个参数,用这个参数表示选择全部即可。但是问题来了,前端的样式需要我们来进行调整。实现要求,点击了全选之后,切换下一页,也必须是全选的。实际实现请参考具体简单代码例子,实际业务数据等还需自己增加。

<template>
  <div>
    <div>
      <el-table :data="tabledata" border style="width:100%" @selection-change="selRow" ref="multipleTable" :row-key="getRowKeys">
        <el-table-column type="selection" min-width="55" align="center" :reserve-selection="true"></el-table-column>
        <el-table-column prop="num" label="id" min-width="120" align="center"></el-table-column>
        <el-table-column prop="name" label="名称" min-width="300" align="center"></el-table-column>
        <el-table-column prop="time" label="时间" min-width="300" align="center"></el-table-column>
      </el-table>
    </div>
    <el-checkbox label="全选" :indeterminate="isIndeterminate" v-model="checkAll" @change="selAll()"></el-checkbox>
    <el-pagination
      @size-change="handlePageSize"
      @current-change="handleCurrentPage"
      :current-page="currentPage"
      :page-sizes="[3, 5]"
      :page-size="pageSize"
      layout="total, sizes, prev, pager, next, jumper"
      :total="total"
    >
    </el-pagination>
    <el-button @click="btn">打印</el-button>
  </div>
</template>
<script>
export default {
  data() {
    return {
      selectedAssetsList: [], // 该数组对象
      assetsUidList: [], // 下标值
      currentPage: 1,
      pageSize: 3,
      total: 8,
      isIndeterminate: false, // 对el-checkbox控制不完整的全选状态
      checkAll: false, // 对el-checkbox控制全选状态
      tabledata: [],
      newTabledata: [
        // el-table的数据内容
        {
          id: 1,
          num: '20210001',
          name: '小明',
          time: '2021-01-10'
        },
        { id: 2, num: '20210003', name: '打发', time: '2019-10-14' },
        {
          id: 3,
          num: '20210002',
          name: '花花',
          time: '2021-01-10'
        },
        {
          id: 4,
          num: '201903123350',
          name: '的飞洒',
          time: '2019-10-16'
        },
        {
          id: 5,
          num: '201903123345',
          name: '撒打发',
          time: '2019-10-10'
        },
        { id: 6, num: '201903123346', name: '供应商推荐', time: '2019-10-14' },
        {
          id: 7,
          num: '201903123348',
          name: '企鹅窝若',
          time: '2019-10-15'
        },
        {
          id: 8,
          num: '201903123350',
          name: '很多个',
          time: '2019-10-16'
        }
      ]
    }
  },
  mounted() {
    this.search()
  },
  methods: {
    // 获取row的key值
    getRowKeys(row) {
      return row.id
    },
    handlePageSize(pageSize) {
      this.pageSize = pageSize
      this.search()
    },
    handleCurrentPage(currentPage) {
      this.currentPage = currentPage
      this.search()
    },
    search() {
      this.tabledata = this.newTabledata.slice((this.currentPage - 1) * this.pageSize, this.currentPage * this.pageSize)
    },
    btn() {
      console.log(this.selectedAssetsList)
      console.log(this.assetsUidList)
    },
    // 全选按键功能实现
    selAll() {
      console.log(this.$refs.multipleTable.selection.length)
      if (this.$refs.multipleTable.selection.length < this.newTabledata.length) {
        // 判断勾选的数据是否是 大于 全选的数据  ,如果 小于则 让 全选 等于 true 否则为 false
        this.checkAll = true
      } else {
        this.checkAll = false
      }
      if (this.checkAll) {
        this.newTabledata.forEach(row => {
          this.$refs.multipleTable.toggleRowSelection(row, true)
        })
      } else {
        this.$refs.multipleTable.clearSelection()
        this.selectedAssetsList = []
        this.assetsUidList = []
      }
    },
    stateChange() {
      var vm = this
      if (vm.assetsUidList.length < this.newTabledata.length && vm.assetsUidList.length > 0) {
        this.isIndeterminate = true
      } else if (vm.assetsUidList.length === this.newTabledata.length) {
        this.isIndeterminate = false
        this.checkAll = true
      } else if (vm.assetsUidList.length === 0) {
        this.isIndeterminate = false
        this.checkAll = false
      }
    },
    // 表格内checkbox触发的全选按钮状态变化
    selRow(val) {
      const vm = this
      // 选择的行的完整数据。
      vm.selectedAssetsList = Array.from(new Set([...vm.selectedAssetsList, ...val]))
      const currentArr = val.map(item => item.id)
      const arr1 = [...vm.assetsUidList, ...currentArr]
      vm.assetsUidList = Array.from(new Set(arr1))
      const tableData = vm.tabledata.map(item => item.id)
      const difference = tableData.filter(v => !currentArr.includes(v))
      difference.forEach(item => {
        if (vm.assetsUidList.indexOf(item) !== -1) {
          vm.assetsUidList.splice(vm.assetsUidList.indexOf(item), 1)
        }
      })
      // 把选中的行数据进行去重。
      var list = vm.selectedAssetsList.filter(item => vm.assetsUidList.indexOf(item.id) !== -1)
      for (var i = 0; i < list.length; i++) {
        for (var j = i + 1; j < list.length; j++) {
          if (list[i].id === list[j].id) {
            list.splice(j, 1)
            j--
          }
        }
      }
      setTimeout(() => {
        this.stateChange()
      }, 0)
    }
  }
}
</script>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue element ui 表格带分页全选情况 的相关文章

随机推荐

  • PHP 三元 !empty 而不是评估为真或假 可用isset()

    是否可以使用速记三元来检查变量是否已设置 而不是是否计算结果为零或非零 例如 我试过 var 0 echo string var string false 2 但由于前两个表达式的计算结果均为 0 或 false 因此显示为 2 我认为也许
  • Netty4 websocket 开启服务端并设置IP和端口号

    一 环境也就是POM文件
  • Python学习(4)证件照底色变换

    Python学习 4 证件照底色变换 前言 一 Python准备 二 Python仿真 三 仿真结果 四 小结 前言 随着人工智能研究的不断兴起 Python的应用也在不断上升 由于Python语言的简洁性 易读性以及可扩展性 特别是在开源
  • Java面向对象三大特性(封装、继承、多态)

    文章目录 前言 一 封装 1 封装的概念 2 private实现封装 3 getter和setter方法 4 封装的好处 二 继承 1 继承的概念 2 extends实现继承 3 super 关键字 Object 4 访问权限 1 priv
  • 蓝桥杯单片机第十四届第三次模拟题

    题目 Main c include
  • [数值计算-12]:什么是函数逼近:插值、拟合、回归

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119901220 目录 第1章
  • ISO-15118 -1,2,3,4,5,6,8,9,20【最新版】1~20,国际标准分类中,ISO15118涉及到电车、道路车辆装置

    ISO 15118 本专题涉及ISO15118的标准有 国际标准分类中 ISO15118涉及到电车 道路车辆装置 在中国标准分类中 ISO15118涉及到无轨电车牵引供电 交通管理综合 电子 电气设备 公路工程 ISO 15118 20 2
  • 【Java学习笔记】异常处理

    一 异常分类 1 可检查的异常 编译时检查 必须捕捉或声明 可查异常虽然是异常状况 但在一定程度上它的发生是可以预计的 而且一旦发生这种异常状况 就必须采取某种方式进行处理 2 不可检查的异常 编译时不受检查 不需要捕捉或声明 包括erro
  • 主板电源开关接口图解_主板跳线接法示意图,超详细适合DIY新手

    现在DIY自己装机已经很简单了 网上的教程各种各样 也不用专门去电脑城找专业人士来装了 只需要购买好硬件即可 不过 在组装电脑时有一个步骤是很难的 就是主板跳线或者说机箱里面各种线怎么接 下面就给大家说说主板跳线接法 一 开关机跳线和指示灯
  • linux命令总结dd命令详解

    dd 用指定大小的块拷贝一个文件 并在拷贝的同时进行指定的转换 注意 指定数字的地方若以下列字符结尾 则乘以相应的数字 b 512 c 1 k 1024 w 2 参数注释 if 文件名 输入文件名 缺省为标准输入 即指定源文件 lt if
  • Java设计模式-迪米特法则

    迪米特法则 Low Of Demeter 定义 一个对象应该对其他对象保持最少的了解 问题由来 类与类之间的关系越密切 耦合度越大 当一个类发生改变时 对另一个类的影响也越大 解决方案 尽量降低类与类之间的耦合 自从我们接触编程开始 就知道
  • 【LeetCode】—— 二叉树进阶面试题

    一 根据二叉树创建字符串LeetCode606题 1 1 题目描述 空节点则用一对空括号 表示 而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对 示例 1 输入 二叉树 1 2 3 4 1 2 3 4 输出 1 2
  • 批量插入及数据库事务(三)

    五 批量插入 5 1 批量执行SQL语句 当需要成批插入或者更新记录时 可以采用Java的批量更新机制 这一机制允许多条语句一次性提交给数据库批量处理 通常情况下比单独提交处理更有效率 JDBC的批量处理语句包括下面三个方法 addBatc
  • 算法讲解四之滑动窗口

    文章目录 算法学习篇四 滑动窗口 声明 题目 长度最小的子数组 解法一 解法一思路 解法二 滑动窗口 解法二思路 拓展知识点 1 程序设计中 与 的使用 2 i 与 i的使用区别 说明 算法学习篇四 滑动窗口 声明 本文旨在记录自己学习算法
  • 使用python的selenium自动化登录获取cookie

    要爬取广点通广告平台数据 这平台居然没有提供开发用的API数据接口 登录是QQ登录 很复杂 不好抓取登录接口逻辑 于是就用这个 想录gif的不好录 文档 https www yiibai com selenium selenium webd
  • xgboost特征选择

    Xgboost在各大数据挖掘比赛中是一个大杀器 往往可以取得比其他各种机器学习算法更好的效果 数据预处理 特征工程 调参对Xgboost的效果有着非常重要的影响 这里介绍一下运用xgboost的特征选择 运用xgboost的特征选择可以筛选
  • 微信小程序带参扫码跳转以及测试方法

    前言 最近在做小程序开发时 遇到的一个比较基础性的问题吧 觉得有记录的必要 第一是加深自己的影响 第二也方便跟我一样遇到这种问题的朋友做一个方法参考 参数及跳转页面约定 这里的参数是你与后端沟通好的 约定的要返回的内容 这里因为项目业务需要
  • Grafana初步总结

    1 grafana安装及问题解决 在官网下载安装包 解压后进入bin目录双击 grafana server exe启动服务 服务启动成功默认端口3000 在浏览器输入http localhost 3000 回车进入登录界面 初始账号密码为
  • mySql 将一行数据拆分为多条数据原理解析

    先上sql语句 select distinct SUBSTRING INDEX SUBSTRING INDEX a beam type b help topic id 1 1 name from fab process tech test
  • vue element ui 表格带分页全选情况

    vue element ui 表格带分页全选情况 1 效果 2 原理 我们真实的情况 选择一条或者多条 将选择的id拼接成一个id数组传给后端 但是问题 如果数据过多的话 全选加入有4 5W条数据传递起来很费力而且可能会出错 和后端商量 当