elementui实现当前页全选+所有全选+翻页保持选中状

news2024/10/5 23:30:04

在这里插入图片描述
原文来自:https://blog.csdn.net/sumimg/article/details/121693305?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-121693305-blog-127570059.235%5Ev38%5Epc_relevant_anti_t3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-121693305-blog-127570059.235%5Ev38%5Epc_relevant_anti_t3&utm_relevant_index=2

//代码可直接复制看效果,
<template>
  <div>
    <div class="common-wrapper">
      <el-checkbox
        v-model="allCheck"
        :indeterminate="indeterminate"
        label="全选"
        @change="handleCheck"
      />

      <!--列表-->
      <el-table
        ref="table"
        v-loading="listLoading"
        :data="lists"
        highlight-current-row
        style="width: 100%"
        :row-key="getRowKeys"
        @select="handleSelectRow"
        @select-all="handleSelectAll"
      >
        <el-table-column type="selection" :reserve-selection="true" />
        <el-table-column prop="id" label="id" />
        <el-table-column prop="time" label="time" />
      </el-table>
      <!--工具条-->
      <el-col :span="24" class="toolbar">
        <el-pagination
          :current-page="this.page"
          layout="total , prev, pager, next"
          :page-size="10"
          :total="total"
          style="float: right"
          @current-change="handleCurrentChange"
        />
      </el-col>
      <div class="clearfix" />
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      lists: [
        { id: "1", time: "2019-09-09 12:12:12" },
        { id: "2", time: "2019-09-09 12:12:12" },
        { id: "3", time: "2019-09-09 12:12:12" },
        { id: "4", time: "2019-09-09 12:12:12" },
        { id: "5", time: "2019-09-09 12:12:12" },
        { id: "6", time: "2019-09-09 12:12:12" },
        { id: "7", time: "2019-09-09 12:12:12" },
        { id: "8", time: "2019-09-09 12:12:12" },
        { id: "9", time: "2019-09-09 12:12:12" },
        { id: "10", time: "2019-09-09 12:12:12" },
      ],

      total: 13, // 得到的列表总数
      page: 1,
      listLoading: false,

      getRowKeys(row) {
        return row.id;
      },

      checkedList: [], // 选中列表
      uncheckedList: [], // 未选中列表
      indeterminate: false, // indeterminate属性控制样式
      allCheck: false,
    };
  },

  watch: {
    // 监听列表,如果为所有全选,翻页时保持状态
    lists: {
      handler(value) {
        if (this.allCheck) {
          if (this.uncheckedList.length === 0) {
            this.$nextTick(() => {
              // 这里一定要用$nextTick
              value.forEach((row) => {
                this.$refs.table.toggleRowSelection(row, true);
              });
            });
          } else {
            this.$nextTick(() => {
              value.forEach((row) => {
                for (let i = 0; i < this.uncheckedList.length; i++) {
                  if (row.id === this.uncheckedList[i].id) {
                    this.$refs.table.toggleRowSelection(row, false);
                    break;
                  } else {
                    this.$refs.table.toggleRowSelection(row, true);
                  }
                }
              });
            });
          }
        }
      },
      deep: true,
    },
    // 监听未选中的数组
    uncheckedList: {
      handler(value) {
        // 1.未选中数组长度和总数相等,取消选中状态,取消样式
        if (value.length === this.total) {
          this.allCheck = false;
          this.indeterminate = false;
        }
        // 2.未选中数组长度为0,取消样式
        if (value.length === 0) {
          this.indeterminate = false;
        }
      },
      deep: true,
    },
    // 监听选中数组
    checkedList: {
      handler(value) {
        // 选中数组长度等于总数,代表全部选中,取消样式
        if (value.length === this.total) {
          this.allCheck = true;
          this.indeterminate = false;
        }
      },
    },
  },

  mounted() {},
  methods: {
    handleSelectRow(rows, row) {
      // 单行选择
      if (this.allCheck) {
        // 多选框样式改变,allCheck依然为true,为了保持翻页状态
        this.indeterminate = true;
        // 判断勾选数据行是选中还是取消
        const selected = rows.length && rows.indexOf(row) !== -1;
        const lenFalse = this.uncheckedList.length;
        if (selected) {
          // 选中,从未选中数组中去掉
          if (lenFalse !== 0) {
            //
            for (let i = 0; i < lenFalse; i++) {
              if (this.uncheckedList[i].id === row.id) {
                this.uncheckedList.splice(i, 1);
                break;
              }
            }
          }
        } else {
          // 取消,当前取消的行push进去
          this.uncheckedList.push(row);
        }

        console.log(this.uncheckedList);
      } else {
        this.checkedList = rows;
        console.log(this.checkedList);
      }
    },
    handleSelectAll(rows) {
      if (this.allCheck) {
        this.indeterminate = true;
        const lenNow = this.lists.length;
        // 判断全选本页,是选中还是取消
        if (rows.indexOf(this.lists[0]) !== -1) {
          // 如果选中所有rows存在于tableList,或者判断rows长度不为0  证明是选中状态
          // uncheckedList要删除当前页tableList
          for (let i = 0; i < lenNow; i++) {
            for (let n = 0; n < this.uncheckedList.length; n++) {
              if (this.uncheckedList[n].id === this.lists[i].id) {
                this.uncheckedList.splice(n, 1);
              }
            }
          }
        } else {
          // 取消 如果rows为空,当页是取消状态
          for (let j = 0; j < lenNow; j++) {
            if (this.uncheckedList.length !== 0) {
              // 如果uncheckedList已经有值
              if (this.uncheckedList.indexOf(this.lists[j]) === -1) {
                // 就把uncheckedList中没有的当前页tableList,push进去
                this.uncheckedList.push(this.lists[j]);
              }
            } else {
              // 如果为空,直接全部push
              this.uncheckedList.push(this.lists[j]);
            }
          }
        }
      } else {
        this.checkedList = rows;
      }
    },
    handleCheck() {
      if (this.indeterminate) {
        // 当不为全选样式时,点击变为全选
        this.allCheck = true;
      }
      // 只要点击了全选所有,这两个数组清空
      this.uncheckedList = [];
      this.checkedList = [];
      if (this.allCheck) {
        // 全选所有,列表全部选中,包括翻页
        this.lists.forEach((row) => {
          this.$refs.table.toggleRowSelection(row, true);
        });
      } else {
        // 取消列表全选状态,包括翻页
        this.$refs.table.clearSelection();
      }
    },

    // 分页
    handleCurrentChange(val) {
      this.page = val;
      if (val === 1) {
        this.lists = [
          { id: "1", time: "2019-09-09 12:12:12" },
          { id: "2", time: "2019-09-09 12:12:12" },
          { id: "3", time: "2019-09-09 12:12:12" },
          { id: "4", time: "2019-09-09 12:12:12" },
          { id: "5", time: "2019-09-09 12:12:12" },
          { id: "6", time: "2019-09-09 12:12:12" },
          { id: "7", time: "2019-09-09 12:12:12" },
          { id: "8", time: "2019-09-09 12:12:12" },
          { id: "9", time: "2019-09-09 12:12:12" },
          { id: "10", time: "2019-09-09 12:12:12" },
        ];
      } else {
        this.lists = [
          { id: "11", time: "2019-09-09 12:12:12" },
          { id: "12", time: "2019-09-09 12:12:12" },
          { id: "13", time: "2019-09-09 12:12:12" },
        ];
      }
    },

    // tableList 为当前表格的数据
    checkPageStatus(lists) {
      lists.forEach((row) => {
        const findex = this.saveCheckList.findIndex((item) => {
          return item.id === row.id;
        });
        console.log("checkPageStatus", findex);
        if (findex >= 0) {
          this.$nextTick(() => {
            this.$refs["table"].toggleRowSelection(row);
          });
        }
      });
    },

    // 当表格是在弹出窗再作展示时,再次编辑多选的值时,是需要回显之前勾选的状态。
    // 一、加载表格数据展示,案例用模拟数据,开发需要调用接口
    getList() {
      // this.lists = res.data.data
      // this.total = res.data.count
      // this.$nextTick(() => {
      //       // console.log(this.lists)
      //       // 每一次执行数据请求的方法时,在请求成功的方法里执行回显
      //       this.checkedList.forEach((key) => {
      //         this.lists.forEach((row) => {
      //           if (row.id == key.id) {
      //             this.$refs.table.toggleRowSelection(row, true)
      //           }
      //         })
      //       })
      // }
    },
  },
};
</script>

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

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

相关文章

使用 Python 和 Flask 构建简单的 Restful API 第 1 部分

一、说明 我将把这个系列分成 3 或 4 篇文章。在本系列的最后&#xff0c;您将了解使用flask构建 restful API 是多么容易。在本文中&#xff0c;我们将设置环境并创建将显示“Hello World”的终结点。 我假设你的电脑上安装了python 2.7和pip。我已经在python 2.7上测试了本文…

2023 华数杯全国大学生数学建模竞赛 ——C题母亲身心健康对婴儿成长的影响 完整建模+代码

目录 完整思路下载链接&#xff1a;这里可以获取2023华数杯全国大学生数学建模竞赛题目C 题母亲身心健康对婴儿成长的影响✅ 问题1问题1建模思路✅ 问题2问题2建模思路✅ 问题3问题3建模思路✅ 问题4问题4建模思路✅ 问题5问题5建模思路提供的数据和资料&#xff1a; 完整思路下…

【我们一起60天准备考研算法面试(大全)-第四十天 40/60】【并查集】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

el-table实现指定列合并

table传入span-method方法可以实现合并行或列&#xff0c;方法的参数是一个对象&#xff0c;里面包含当前行row、当前列column、当前行号rowIndex、当前列号columnIndex四个属性。该函数可以返回一个包含两个元素的数组&#xff0c;第一个元素代表rowspan&#xff0c;第二个元素…

ESP 32 蓝牙虚拟键盘链接笔记本电脑的键值问题

由于打算利用esp32 通过蓝牙链接电脑后实现一些特俗的键盘功能&#xff0c;所以就折腾了一下&#xff0c;折腾最耗费时间的却是键值问题&#xff0c;让一个20多年的老司机重新补充了知识 过程曲折就不说了&#xff0c;直接说结果。 我们通过网络搜索获取的键值和蓝牙模拟键盘传…

云专线的应用场景

云专线是连接用户本地数据中心和云上虚拟私有云的高安全、高速度、低延迟、稳定可靠的专属连接通道&#xff0c;主要有以下应用场景。 1、混合云环境&#xff1a;企业在私有云和公有云之间传输数据及部署应用时&#xff0c;使用云专线建立专用的网络连接&#xff0c;保证数据传…

做赴日IT工作 Java Python等语言哪个更好?

很多同学问我&#xff0c;做赴日IT工作Java&#xff0c;Python等语言哪个更好&#xff1f;更容易拿到内定通知书&#xff1f;如果你想去做赴日IT工作&#xff0c;无论是学Java还是Python或是其他编程语言&#xff0c;都是很好的选择&#xff0c;因为它们都有自己的的前景和应用…

如何快速完成MySQL数据的差异对比|NineData

在现代商业环境中&#xff0c;数据库是企业存储核心数据的重要工具&#xff0c;而 MySQL 作为最受欢迎的关系型数据库管理系统&#xff0c;广泛应用于各行各业。在容灾、数据迁移、备份恢复等场景下&#xff0c;为了确保两端或多端之间数据的一致性&#xff0c;通常需要对数据进…

【C++】多态(多态的构成条件,虚函数重写,override,final,覆盖隐藏对比)

文章目录 前言一、多态的定义及实现1.多态的构成条件&#xff1a; 二、虚函数1.虚函数的重写2.虚函数重写的例外&#xff08;协变&#xff09;3.析构函数的虚函数&#xff08;基类与派生类析构函数名字不同&#xff09;1.不加virtual的一般情况&#xff1a;2.不加virtual会出现…

Merge和Rebase的区别

Merge 和 Rebase 是 Git 中常用的两种分支整合方式&#xff0c;它们具有不同的工作原理和效果&#xff1a; Merge&#xff08;合并&#xff09; 合并是将两个或多个分支的提交历史合并为一个新的提交。在合并时&#xff0c;Git 会创建一个新的合并提交&#xff0c;将两个分支…

Android中简单封装Livedata工具类

Android中简单封装Livedata工具类 前言&#xff1a; 之前讲解过livedata和viewmodel的简单使用&#xff0c;也封装过room工具类&#xff0c;本文是对livedata的简单封装和使用&#xff0c;先是封装了一个简单的工具类&#xff0c;然后实现了一个倒计时工具类的封装. 1.LiveD…

让你的商城触达全球市场!了解跨境商城系统源码的优势

全球市场触达的商机 随着全球化趋势的不断发展&#xff0c;跨境电商已经成为企业开拓全球市场的重要途径之一。在扩大国际业务的同时&#xff0c;企业需要面对许多挑战&#xff0c;如语言、支付、物流等问题。这些问题可以通过使用跨境商城系统源码来解决。 一、多语言支持 跨境…

如何做好电信布线?

电信布线作为通信网络骨干&#xff0c;对于任何现代企业或组织来说都是至关重要的组成部分。随着业务量的持续增长&#xff0c;对电信布线安装提出了更高的要求。为此&#xff0c;飞速&#xff08;FS&#xff09;提出了FHD电信布线解决方案&#xff0c;在满足了电信机房要求的基…

源码分析——ConcurrentHashMap源码+底层数据结构分析

文章目录 1. ConcurrentHashMap 1.71. 存储结构2. 初始化3. put4. 扩容 rehash5. get 2. ConcurrentHashMap 1.81. 存储结构2. 初始化 initTable3. put4. get 3. 总结 1. ConcurrentHashMap 1.7 1. 存储结构 Java 7 中 ConcurrentHashMap 的存储结构如上图&#xff0c;Concurr…

【Vue3】localStorage读取数组并赋值的问题

问题描述 今天在写项目用到localStorage进行存储并读取数据&#xff0c;并将读取到的数据存放到列表的时候&#xff0c;发现vue3不能直接对数组进行赋值。因为Vue3的响应式是proxy&#xff0c;对所有的数据进行了拦截。 onBeforeMount(() > {console.log(JSON.parse(local…

C语言学习笔记 使用vscode外部console出现闪退-12

前言 在使用vscode的外部console时&#xff0c;会出现闪退现象&#xff0c;这是因为程序运行结束后&#xff0c;系统自动退出了终端&#xff08;终端机制决定的&#xff09;。我们可以在C程序结束后&#xff0c;使用system函数来暂停DOS终端系统&#xff0c;这样就可以完整地看…

中间件插件机制

一、插件 在mybatis一类中间件在处理的时候&#xff0c;提供了插件机制&#xff0c;类似于aop机制&#xff0c;可以在方法前、方法后进行拦截并且修改入参获得改变其方法的行为。那么调用的的方法应该也需要使用动态代理活动被插件进行aop的对象。

GD32F103硬件I2C0通讯

GD32F103的I2C模块有I2C0和I2C1;本程序使用I2C0功能模块; I2C0引脚复用和重映射: 当I2C0_REMAP0时,I2C0引脚复用功能,I2C0_SCL映射到PB6引脚,I2C0_SDA映射到PB7引脚; 当I2C0_REMAP1时,I2C0引脚重映射,I2C0_SCL映射到PB8引脚,I2C0_SDA映射到PB9引脚; I2C1引脚只有复用引脚: I2C…

Nevron Vision for .NET Crack

Nevron Vision for .NET Crack NET Vision是一个用于创建具有数据可视化功能的强大数据表示应用程序的套件。该套件具有用于.NET的Nevron Chart、用于.NET的Nevron Diagram和用于.NET的Nevron User Interface。精心设计的对象模型、众多功能和高质量的演示使复杂数据的可视化变…

观察级水下机器人使用系列之四二维前视声纳

本文主要讲观察级水下机器人Valor配套的二维前视声纳&#xff0c;它与超短基线定位、摄像头都是水下机器人导航的重要部件。二维声纳是Tritech公司生产的&#xff0c;型号为Gemini 720is。 ​编辑​ Gemini 720is主要技术参数见下表。 Gemini 720is通过一条蓝色的缆与机器人的…