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

在这里插入图片描述
原文来自: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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Three.js阴影

目录 Three.js入门 Three.js光源 Three.js阴影 使用灯光后&#xff0c;场景中就会产生阴影。物体的背面确实在黑暗中&#xff0c;这称为核心阴影&#xff08;core shadow&#xff09;。我们缺少的是落下的阴影&#xff08;drop shadow&#xff09;&#xff0c;即对象在其他…

Web Worker API

Web Worker API Web Worker 使得在一个独立于 Web 应用程序主执行线程的后台线程中运行脚本操作成为可能。这样做的好处是可以在独立线程中执行费时的处理任务&#xff0c;使主线程&#xff08;通常是 UI 线程&#xff09;的运行不会被阻塞/放慢。 Web Worker概念与用法 Wor…

C# 有效的字母异位词

242 有效的字母异位词 给定两个字符串 和 &#xff0c;编写一个函数来判断 是否是 的字母异位词。stts 注意&#xff1a;若 和 中每个字符出现的次数都相同&#xff0c;则称 和 互为字母异位词。stst 示例 1: 输入: s “anagram”, t “nagaram” 输出: true 示例 2: 输…

MySQL 的事件调度器

MySQL 的事件调度器可以通过以下方式进行管理&#xff1a; 1】查看事件调度器的状态 SHOW VARIABLES LIKE event_scheduler;2】启用/禁用事件调度器 SET GLOBAL event_scheduler ON;SET GLOBAL event_scheduler OFF; 注意&#xff1a;启用/禁用事件调度器需要具有 SUPE…

SpringBoot源码分析(8)--内置ApplicationContextInitializer

文章目录 1、DelegatingApplicationContextInitializer2、SharedMetadataReaderFactoryContextInitializer3、ContextIdApplicationContextInitializer4、ConfigurationWarningsApplicationContextInitializer5、ServerPortInfoApplicationContextInitializer6、ConditionEvalu…

PPT忘记密码如何解除?

PPT文件所带有的两种加密方式&#xff0c;打开密码以及修改权限&#xff0c;两种密码在打开文件的时候都会有相应的提示&#xff0c;但不同的是两种加密忘记密码之后是不同的。 如果忘记了打开密码&#xff0c;我们就没办法打开PPT文件了&#xff1b;如果是忘记了修改密码&…

解决github打不开的方法

解决github打不开的方法 本文参考文章&#xff1a;解决可ping通但无法访问github网站的问题 一、确定域名github.com的ip地址 进入网址 IP/服务器github.com的信息 - 站长工具 (chinaz.com)&#xff0c;查看 ip 地址。 20.205.243.166 github.com二、确定域名github.global.…

Node.js新手在哪儿找小项目练手?

前言 可以参考一下下面的nodejs相关的项目&#xff0c;希望对你的学习有所帮助&#xff0c;废话少说&#xff0c;让我们直接进入正题>> 1、 NodeBB Star: 13.3k 一个基于Node.js的现代化社区论坛软件&#xff0c;具有快速、可扩展、易于使用和灵活的特点。它支持多种数…

深度学习Redis(2):持久化

前言 在上一篇文章中&#xff0c;介绍Redis的内存模型&#xff0c;从这篇文章开始&#xff0c;将依次介绍Redis高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。 本文将先说明上述几种技术分别解决了Redis高可用的什么问题&#xff1b;然后详细介绍Redis的持…

Java课题笔记~6个重要注解参数含义

1、[掌握]Before 前置通知-方法有 JoinPoint 参数 在目标方法执行之前执行。被注解为前置通知的方法&#xff0c;可以包含一个 JoinPoint 类型参数。 该类型的对象本身就是切入点表达式。通过该参数&#xff0c;可获取切入点表达式、方法签名、目标对象等。 不光前置通知的方…

HBase Shell 操作

1、基本操作 1.1、进入HBase客户端命令行 前提是先启动hadoop集群和zookeeper集群。 bin/hbase shell 1.2、查看帮助命令 helphelp 查看指定命令的语法规则 查看 list_namespace 的用法&#xff08;‘记得加单引号’&#xff09; help list_namespace 2、namespace 我们…

HTML基础铺垫

&#x1f60a;HTML基础铺垫 &#x1f47b;前言&#x1f4dc;HTML文档结构&#x1f3ad;头部head&#x1f94f;标题title标记&#x1f94f;元信息meta标记 &#x1f3ad;主体body&#x1f94f;body标记&#x1f94f;body标记属性 &#x1f3ad;HTML基本语法&#x1f94f;标记类型…

Tomcat的介绍和安装配置、eclipse中动态web项目的创建和运行、使用IDEA创建web项目并运行

一、Tomcat的介绍和安装配置 安装tomcat&#xff1a; 环境变量的配置&#xff1a; 配置之后重启cmd&#xff0c;执行startup命令&#xff0c;启动tomcat 在localhost:8080&#xff0c;能进入tomcat主界面&#xff0c;说明配置成功 二、eclipse中动态web项目的创建和运行 tomca…

Web3 solidity编写交易所合约 编写ETH和自定义代币存入逻辑 并带着大家手动测试

上文 Web3 叙述交易所授权置换概念 编写transferFrom与approve函数我们写完一个简单授权交易所的逻辑 但是并没有测试 其实也不是我不想 主要是 交易所也没实例化 现在也测试不了 我们先运行 ganache 启动一个虚拟的区块链环境 先发布 在终端执行 truffle migrate如果你跟着我…

【车道线】TwinLiteNet 复现过程全纪录

码字不易&#xff0c;喜欢的请点赞收藏&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 论文全文翻译&#xff1a;【freespace】TwinLiteNet: An Efficient and Lightweight Model for Driveable Area and Lane Segmentation_莫克_Cheney的博客-CSDN博客 目录…

全面讲解最小二乘法

常见的最小二乘法我们就不多说了&#xff0c;下面主要介绍一下最小二乘法的一些先进方法。 正则化的最小二乘法 在使用常见的最小二乘法进行回归分析时&#xff0c;常常会遇到过拟合的问题&#xff0c;也就是在训练数据集上表现的很好&#xff0c;但是在测试数据集上表现的很…

如何解决 Elasticsearch 查询缓慢的问题以获得更好的用户体验

作者&#xff1a;Philipp Kahr Elasticsearch Service 用户的重要注意事项&#xff1a;目前&#xff0c;本文中描述的 Kibana 设置更改仅限于 Cloud 控制台&#xff0c;如果没有我们支持团队的手动干预&#xff0c;则无法进行配置。 我们的工程团队正在努力消除对这些设置的限制…

Oracle-expdp报错ORA-39077、06502(Bug-16928674)

问题: 用户在使用expdp进程导出时&#xff0c;出现队列报错ORA-39077、ORA-06502 ORA-31626: job does not exist ORA-31638: cannot attach to job SYS_EXPORT_SCHEMA_01 for user SYS ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95 ORA-06512: at "SYS.KUPV$…

Windows下安装 Redis

目录 1.下载 1.1.Redis官网 1.2.github下载地址 2.安装步骤 2.1.解压Redis压缩包 2.2.创建临时服务 2.3.启动客户端 2.4.注册Redis服务 3.总结 4.致谢 1.下载 1.1.Redis官网 Download | Redis Redis 官方网站没有提供 Windows 版的安装包&#xff0c;但可以通过…

标准化归一化 batch norm, layer norm, group norm, instance norm

Layer Normalization - EXPLAINED (in Transformer Neural Networks) Layer Normalization - EXPLAINED (in Transformer Neural Networks) 0~4min:什么是multi-head attention 5~7min:layer norm图示 7~9min:公式举例layer norm 9:54-end:layer norm的代码示例 group n…