<template>
<div class="app">
<div>
<el-checkbox v-model="crossPage">跨页全选</el-checkbox>
</div>
<el-table
ref="tableRef"
:data="dataRender"
row-key="id"
:columns="columns"
border
stripe
@select="onSelect"
@selection-change="onSelectionChange"
>
<el-table-column type="selection" />
<el-table-column
:prop="item.dataIndex"
:label="item.title"
:width="item.width"
v-for="item in columns"
:key="item.dataIndex"
/>
</el-table>
<div class="pagination">
<el-pagination
layout="total, prev, pager, next"
@current-change="onPageChange"
:total="pagination.total"
/>
</div>
<div>
<div v-if="crossPage">排除:{{ JSON.stringify(excludeSelected) }}</div>
<div v-else>已选择:{{ JSON.stringify(selection) }}</div>
</div>
</div>
</template> <script setup lang="ts">
import { reactive, ref, watch, nextTick } from "vue";
import axios from "axios";
import { changeArr } from "../utils/arr-helper"; // 分页信息
const pagination = reactive({
current: 1,
pageSize: 10,
total: 5,
showTotal: true,
}); // 表头
const columns = [
{
title: "姓名",
dataIndex: "name",
width: 100,
},
{
title: "年龄",
dataIndex: "age",
width: 100,
},
{
title: "工资",
dataIndex: "salary",
width: 100,
},
{
title: "住址",
dataIndex: "address",
},
]; const dataRender = ref([]);
const syncDataRender = async () => {
const {
data: { data },
} = await axios.get("/api/user", {
params: {
current: pagination.current,
pageSize: pagination.pageSize,
},
});
dataRender.value = data.list;
pagination.total = data.total;
};
syncDataRender(); const onPageChange = async (current) => {
pagination.current = current;
syncDataRender();
}; // 跨页全选要立即选中当前页数据,即便翻页的也要选中,但是不能包含排除的
// 需要注意的是:当勾选了跨页全选后,已经选中的就不在作数,而是重点关注排除项 // 记录 excludeSelected
// 用户手动勾选触发
// 主要用于记录用户手动取消勾选的项,用于跨页全选时排除
const excludeSelected = ref([]);
const onSelect = (selection, row) => {
const isSelected = selection.findIndex((item) => item.id === row.id) > -1; // 本次是选中还是取消
if (crossPage.value) {
excludeSelected.value = changeArr({
arr: excludeSelected.value,
row,
action: isSelected ? "rm" : "push",
});
}
}; // 记录 selection
// 当选择项发生变化时会触发该事件(包含手动or 调用 tableRef.value.toggleRowSelection)
const selection = ref([]);
const onSelectionChange = (arg) => {
selection.value = arg;
}; // 当跨页全选时,要选中当前页的所有数据
const crossPage = ref(false);
const tableRef = ref(null);
watch(
() => crossPage.value,
() => {
if (crossPage.value) {
for (const element of dataRender.value) {
tableRef.value.toggleRowSelection(element, true);
}
} else {
excludeSelected.value = [];
}
}
); // 跨页全选时,即便内容变化(如翻页)的也要选中,但是不能包含排除的
watch(
() => dataRender.value,
async () => {
// 这里要做还原选中状态
if (crossPage.value) {
for (const element of dataRender.value) {
const isExclude = excludeSelected.value.findIndex((item) => item.id === element.id) >-1;
if (!isExclude) {
await nextTick();
tableRef.value.toggleRowSelection(element, true);
}
}
}
}
);
</script>
<style>
.pagination {
display: flex;
justify-content: center;
align-items: center;
margin-top: 20px;
}
</style>

element-plus 表格跨页全选的更多相关文章

  1. Bootstrap table 跨页全选

    此代码是针对于bootstrap table中分页的跨页全选. 以下是整个bootstrap的定义 <script type="text/javascript" src=&q ...

  2. A在SP.NET跨页多选

    在ASP.NET跨页多选 本文介绍怎样在ASP.NET中实现多页面选择的问题.其详细思路非常easy:用隐藏的INPUT记住每次选择的项目,在进行数据绑定时.检查保存的值,再在DataGrid中进行选 ...

  3. Element UI表格组件技巧:如何简洁实现跨页勾选、跨页统计功能

    业务场景 在使用Element UI的Table组件时,常常面对这样的业务需求: 表格数据的每一项都要提供勾选框,当切换分页时,能够记忆所有页面勾选的数据,以实现批量提交不同页面勾选数据的功能.并且, ...

  4. 当你的layui表格要做全选+删除功能【兼容ie8】

    <!-- 全选 --> <div class="choose"> <input type="checkbox" id=" ...

  5. js 表格上checkbox 全选

    <table class="layui-table"> <thead> <tr> <th width="75"> ...

  6. element ui表格常用功能如:导出 新增 删除 多选 跨页多选 固定表头 多级表头 合并行列 等常见需求

    <template> <div class="table-cooperte"> <el-table :data="tableData&quo ...

  7. web跨页弹窗选值

    最近在项目中看到这样一种效果——点击当前网页文本框,然后弹出一个缩小的网页,并在网页里选择或填写数据,然后又返回当前网页,小网页关闭.感觉非常不错,其实在以前网上也看见过,只是当时没有留心.今天抽时间 ...

  8. element-ui 表格翻页多选,数据回显

    reserve-selection与row-key结合 <el-table :data="pageData" ref="goodsTable" size= ...

  9. Java 操作Word表格——创建嵌套表格、添加/复制表格行或列、设置表格是否禁止跨页断行

    本文将对如何在Java程序中操作Word表格作进一步介绍.操作要点包括 如何在Word中创建嵌套表格. 对已有表格添加行或者列 复制已有表格中的指定行或者列 对跨页的表格可设置是否禁止跨页断行 创建表 ...

  10. C#/VB.NET 设置PDF跨页表格重复显示表头行

    在创建表格时,如果表格内容出现跨页显示的时候,默认情况下该表格的表头不会在下一页显示,在阅读体验上不是很好.下面分享一个方法如何在表格跨页时显示表格的表头内容,在C#中只需要简单使用方法grid.Re ...

随机推荐

  1. rabbitmq的高级部分

    producer的XML配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&quo ...

  2. Cobalt Strike基础

    Cobalt Strike基础 Staged(有阶段) 在有阶段的执行方式中,分为Stager和Stage两个阶段 Stager(初始执行载荷): ​ 定义:Stager是Stage 1,是一个较小的 ...

  3. 康谋技术 |高效同步与处理:ADTF流服务在自动驾驶数采中的应用

    随着自动驾驶技术的发展,车辆的智能化程度不断提高,这体现了车辆感知,决策以及执行的能力.在算法开发和迭代过程中,提高测试和开发效率,关键在于多传感器数据的高质量采集,确保数据的同步性.完整性和一致性. ...

  4. MySQL 插入一条 SQL 语句,redo log 记录的是什么?

    MySQL 插入一条 SQL 语句,redo log 记录的内容 在 MySQL 的 InnoDB 存储引擎中,redo log(重做日志)主要用来保证事务的持久性和崩溃恢复能力.redo log 记 ...

  5. 可视化图解算法:按之字形顺序打印二叉树( Z字形、锯齿形遍历)

    1. 题目 描述 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 数据范围:0≤n≤1500,树上每个节点的val满足 |val| <= 1500 ...

  6. VBA_LoadPicture报错:子过程或子函数未定义

    需要增加如下引用: While in the VBE select Tools>References>find and check "OLE Automation" 参 ...

  7. CentOS7搭建XSS平台

    我的服务器是CentOS7.8 1.安装php 7 CentOS7的默认PHP版本是PHP5,但是如果我们要安装PHP7,不需要将现有的PHP5删除,只要将PHP升级到PHP7即可. 使用 yum p ...

  8. Day.js 2kb日期时间处理javascript库

    Day.js 与 Moment.js 的比较 优点 体积小:Day.js 的体积仅为 2KB 左右,而 Moment.js 的体积约为 67KB. API 相似:Day.js 的 API 与 Mome ...

  9. vue3 基础-API-案例-ToDoList

    前面几篇我们介绍了 compostion API 的一些基础用法, 如 setup, ref, reactive, toRefs, toRef, context 等. 本篇呢找了一个经典的 TodoL ...

  10. 王炸!SpringBoot+MCP 让你的系统秒变AI小助手

    王炸!SpringBoot+MCP 让你的系统秒变AI小助手 感觉本篇对你有帮助可以关注一下我的微信公众号(深入浅出谈java),会不定期更新知识和面试资料.技巧!!! 一.MCP 是什么? MCP( ...