element plus 实现跨页面+跨tab栏多选

news2024/9/28 13:27:12

文章目录

    • element plus 层面
    • 数据层面

菜鸟好久没写博客了,主要是没遇见什么很难的问题,今天碰见了一个没有思路的问题,解决后立马来和大家伙分享了!

菜鸟今天要实现一个需求,就是:实现跨页面+跨 tab栏 多选!界面如下:

在这里插入图片描述
菜鸟一开始感觉毫无头绪,结果没有去百度,直接问 chatGPT 了,chatGPT 直接整了一堆代码,菜鸟试了,一点屁用没有,然后只能百度,按照 csdn 的发现还是不行!

然后出去走了一圈,思来想去,把 chatGPT 的代码注释了一部分,就出效果了,果然还是人类总结的智慧更胜一筹!

这里菜鸟是四个 table 公用一个分页,切换 tab栏 把分页重置为1而已,实现跨页面+跨 tab栏 多选的具体实现:

element plus 层面

其实 element plus 提供了数据变化不改变勾选状态的东西,这里菜鸟记录一下,也方便各位读者:

vue

<!-- :row-key 必须加上 -->
<el-table
  ref="table1"
  stripe
  :data="tableData"
  style="width: 100%; height: 100%"
  @selection-change="handleSelectionChange"
  :row-key="getRowKey"
>
  <!-- :reserve-selection="true" 必须加,且要在 type="selection" 上 -->
  <el-table-column fixed type="selection" width="55" :reserve-selection="true" />
</el-table>

js

// row-key
function getRowKey(row) {
  return row.id
}

数据层面

// 记录每个tab选中的row
const selectedRows = [[], [], [], []]
// 选中的行
let multipleSelection = ref([]) // 用于批量删除
const handleSelectionChange = (val) => {
  multipleSelection.value = val
  // taskaddpage是区分,因为该组件既是另一个界面又是另一个界面的弹窗;sampleType.value 代表的是tab的值
  if (props.taskaddpage) {
    selectedRows[sampleType.value] = val
    emit('sampleCheck', selectedRows.flat()) // 传扁平化后的数据
  }
}

到这里,element plus 就实现完了跨页面+跨 tab栏 多选!

可能看完真的不难,但是没有思路的时候真的很难搞,只要有思路其实都挺简单 !

菜鸟就是被chatGPT的代码搞偏了,所以搞得贼复杂,这里可以把 chatGPT 的回答放这里,反正感觉挺影响思路的:

<template>
  <el-tabs v-model="activeTab">
    <el-tab-pane label="Tab 1" name="1">
      <el-table
        :data="currentTableData"
        @selection-change="handleSelectionChange"
        ref="table1">
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="name" label="Name" width="120"></el-table-column>
        <el-table-column prop="age" label="Age" width="120"></el-table-column>
      </el-table>
    </el-tab-pane>
    <el-tab-pane label="Tab 2" name="2">
      <el-table
        :data="currentTableData"
        @selection-change="handleSelectionChange"
        ref="table2">
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="name" label="Name" width="120"></el-table-column>
        <el-table-column prop="age" label="Age" width="120"></el-table-column>
      </el-table>
    </el-tab-pane>
    <el-tab-pane label="Tab 3" name="3">
      <el-table
        :data="currentTableData"
        @selection-change="handleSelectionChange"
        ref="table3">
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="name" label="Name" width="120"></el-table-column>
        <el-table-column prop="age" label="Age" width="120"></el-table-column>
      </el-table>
    </el-tab-pane>
    <el-tab-pane label="Tab 4" name="4">
      <el-table
        :data="currentTableData"
        @selection-change="handleSelectionChange"
        ref="table4">
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="name" label="Name" width="120"></el-table-column>
        <el-table-column prop="age" label="Age" width="120"></el-table-column>
      </el-table>
    </el-tab-pane>
  </el-tabs>
  <el-pagination
    @current-change="handleCurrentChange"
    :current-page="currentPage"
    :page-size="pageSize"
    :total="total"
    layout="total, prev, pager, next">
  </el-pagination>
</template>

<script setup>
import { ref, watch, computed, nextTick } from 'vue';

// 当前激活的标签页
const activeTab = ref('1');

// 分页信息
const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(30);

// 模拟的表格数据
const tableData = ref([
  { name: 'John', age: 25 },
  { name: 'Jane', age: 30 },
  { name: 'Tom', age: 35 },
  { name: 'Alice', age: 28 },
  { name: 'Bob', age: 32 },
  { name: 'Charlie', age: 29 },
  { name: 'Dave', age: 45 },
  { name: 'Eve', age: 38 },
  { name: 'Frank', age: 50 },
  { name: 'Grace', age: 26 },
  { name: 'Heidi', age: 33 },
  { name: 'Ivan', age: 27 },
  { name: 'Judy', age: 40 },
  { name: 'Mallory', age: 35 },
  { name: 'Niaj', age: 42 },
  { name: 'Oscar', age: 36 },
  { name: 'Peggy', age: 39 },
  { name: 'Rupert', age: 31 },
  { name: 'Sybil', age: 34 },
  { name: 'Trent', age: 43 },
  { name: 'Victor', age: 44 },
  { name: 'Wendy', age: 37 },
  { name: 'Xander', age: 41 },
  { name: 'Yvonne', age: 30 },
  { name: 'Zach', age: 29 },
]);

// 选中的行
const selectedRows = ref({
  '1': [],
  '2': [],
  '3': [],
  '4': [],
});

// 标志位,避免在分页和标签页切换时触发 @selection-change
let isRestoringSelection = false;

// 计算当前页显示的数据
const currentTableData = computed(() => {
  const start = (currentPage.value - 1) * pageSize.value;
  const end = start + pageSize.value;
  return tableData.value.slice(start, end);
});

// 处理表格行选中变化
const handleSelectionChange = (selection) => {
  if (!isRestoringSelection) {
    selectedRows.value[activeTab.value] = selection;
  }
};

// 处理分页变化
const handleCurrentChange = (page) => {
  currentPage.value = page;
  restoreSelection();
};

// 监听分页变化
watch(currentPage, () => {
  loading.value = true;
  setTimeout(() => {
    loading.value = false;
    restoreSelection();
  }, 500); // 模拟数据加载延迟
});

// 恢复表格的选中项
const restoreSelection = () => {
  nextTick(() => {
    const tableRef = activeTab.value === '1' ? table1
                    : activeTab.value === '2' ? table2
                    : activeTab.value === '3' ? table3
                    : table4;
    isRestoringSelection = true;
    tableRef.value.clearSelection();
    selectedRows.value[activeTab.value].forEach(row => {
      tableRef.value.toggleRowSelection(row, true);
    });
    isRestoringSelection = false;
  });
};

// 监听标签页切换
watch(activeTab, () => {
  restoreSelection();
});

const table1 = ref(null);
const table2 = ref(null);
const table3 = ref(null);
const table4 = ref(null);
</script>

<style>
/* 样式根据需要调整 */
</style>

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

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

相关文章

【RHCE】综合实验0710综合实验

题目&#xff1a; 主服务器192.168.244.130 防火墙允许服务的放行&#xff1a; selinux放行 [rootlocalhost ~]# ll -Z /nfs/rhce 总用量 4 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 8 7月 10 16:52 index.html -rw-r--r--. 1 nobody nobody system_…

Vue2打包部署后动态修改后端接口地址的解决方法

文章目录 前言一、背景二、解决方法1.在public文件夹下创建config文件夹&#xff0c;并创建config.js文件2.编写config.js内容3.在index.html中加载config.js4.在封装axios工具类的js中修改配置 总结 前言 本篇文章将介绍使用Vue2开发前后端分离项目时&#xff0c;前端打包部署…

分布式应用系统设计:即时消息系统

即时消息(IM)系统&#xff0c;涉及&#xff1a;站内消息系统 组件如下&#xff1b; 客户端&#xff1a; WEB页面&#xff0c;IM桌面客户端。通过WebSocket 跟ChatService后端服务连接 Chat Service&#xff1a; 提供WebSocket接口&#xff0c;并保持跟“客户端”状态的维护。…

ArrayList----源码分析

源码中的简介&#xff1a; List接口的可调整数组实现。实现所有可选列表操作&#xff0c;并允许所有元素&#xff0c;包括null。除了实现List接口之外&#xff0c;这个类还提供了一些方法来操作内部用于存储列表的数组的大小。(这个类大致相当于Vector&#xff0c;只是它是不同…

Web知识库应用程序LibreKB

什么是 LibreKB &#xff1f; LibreKB 是一款知识库 Web 应用程序。免费、开源、自托管&#xff0c;基于 PHP/MySQL。 官方并没有 Docker 镜像&#xff0c;老苏这次图省事&#xff0c;并没有像往常一样构建一个镜像&#xff0c;而是基于 Docker 搭建了一个 LAMP 环境&#xff0…

ServiceDesk Plus再次获得国际认可的粉象认证

我们又一次做到了&#xff01;ServiceDesk Plus 现已获得 CMDB 和发布部署过程的 PinkVERIFY™ &#xff08;粉象&#xff09;认证。 通过PinkVerify 认证&#xff0c;我们现在已经获得了七项核心 IT 服务管理实践&#xff1a; 1、事件管理 2、问题管理 3、变更管理 4、资产管…

dev小熊猫,clion设置模版教程

首先点击工具 然后进入设置 &#xff0c;找到代码模版 然后点击c模版&#xff0c;进入之后直接输入模版之后&#xff0c;&#xff08;还没有结束&#xff01;&#xff01;&#xff01;&#xff09;&#xff0c;先点击应用&#xff0c;然后是确定&#xff01;&#xff01;&#…

maven6——生命周期与插件

生命周期 生命周期&#xff1a;指运行的阶段&#xff08;比如几岁&#xff09; maven有三个生命周期如下&#xff0c;每个生命周期大概做的事情如下&#xff1a; 注意&#xff1a;每次执行某个&#xff0c;他会把上面的都执行一遍 插件&#xff1a; 每一个插件&#xf…

【SQL】DML、DDL、ROLLBACK 、COMMIT详解

DML DML&#xff08;Data Manipulation Language&#xff09;数据操作语言&#xff0c;是用于对数据库中的数据进行基本操作的一种编程语言。DML是数据库管理系统&#xff08;DBMS&#xff09;中的一个重要部分&#xff0c;它允许用户或应用程序对数据库中的数据进行增、删、改…

Pytorch张量

在conda的环境中安装Jupyter及其他软件包 Pytorch 建立在张量&#xff08;tensor&#xff09;之上&#xff0c;Pytorch张量是一个 n 维数组&#xff0c;类似于 NumPy 数组。专门针对GPU设计&#xff0c;可以运行在GPU上以加快计算效率。换句话说&#xff0c;Pytorch张量是可以运…

WebGIS基础原理

该部分内容与部分插图、学习框架的主要参考的网站与博主如下&#xff08;也趁机分享给大家&#xff09;&#xff1a; OSGeo开源WebGIS在线教程&#xff1a;http://webgis.cn/ OSGeo《地理信息系统原理》&#xff1a;https://www.osgeo.cn/gis-tutorial/index.html OSGeo《Pyth…

30.ROM-IP核的调用

&#xff08;1&#xff09;ROM IP核简介&#xff1a; ROM是只读存储器&#xff0c;是一种只能读出事先锁存的固态半导体存储器。其特性是一旦存储资料就无法再将之改变或删除&#xff0c;并且资料也不会因为电源关闭而消失。&#xff08;掉电不丢失&#xff09; FPGA使用内部RA…

鸿蒙语言基础类库:【@ohos.util.HashMap (非线性容器HashMap)】

非线性容器HashMap 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 H…

算法 | NOIP1999 Cantor表

算法篇——Cantor的数表 - SteveWang - 博客园 (cnblogs.com) #include <bits/stdc.h> using namespace std; int high(int n) {return n*(n1)/2; } int main() {int k;cin>>k;int n1;while(1){if(high(n)>k){break;}n;} int mhigh(n);int wm-k1;if(n%20){cout…

Autosar诊断实战系列28-2E写DID Pending期间偶发回NRC0x13问题排查

本文框架 前言1.问题描述2.问题复现3.问题分析问题1:为何在2E Pending期间会发送功能寻址的10 01回NRC13?问题2:在ECU Pending期间收到功能寻址10 01,MCU需要如何处理?问题3:DcmDslConnection是如何定义的?问题4:功能寻址于物理寻址是否对应不同的DcmDslConnection?问…

vue 下拉菜单树形结构——vue-treeselect的组件使用

参考&#xff1a; https://www.cnblogs.com/syjtiramisu/p/17672866.htmlhttps://www.cnblogs.com/syjtiramisu/p/17672866.html vue-treeselect的使用 - 简书下载依赖 使用https://www.jianshu.com/p/459550e1477d 实际项目使用&#xff1a;

【087】基于SpringBoot+Vue实现的房租租赁管理系统

系统介绍 视频演示 基于SpringBootVue实现的房租租赁管理系统采用前后端分离架构&#xff0c;系统分为管理员、房东、用户三种角色&#xff0c;实现了登陆与注册、在线聊天、预约看房、房源管理、用户管理、租房、投诉举报、收藏、房主申请等功能 技术选型 开发工具&#x…

Protobuf: 大数据开发中的高效数据传输利器

作为一名大数据开发者&#xff0c;我经常需要处理海量的数据传输和存储。在这个过程中&#xff0c;选择一个高效、可靠的数据序列化工具至关重要。今天&#xff0c;我想和大家分享一下我在项目中使用 Protobuf 的经历。 目录 故事背景Protobuf 简介优点&#xff1a; 实战案例示…

Go-知识测试-示例测试

Go-知识测试-示例测试 1. 定义2. 例子3. 数据结构4. 编译过程5. 执行过程 建议先看&#xff1a;https://blog.csdn.net/a18792721831/article/details/140062769 Go-知识测试-工作机制 1. 定义 示例测试要保证测试文件以_test.go结尾。 测试方法必须以ExampleXxx开头。 测试文…

常见点云处理总结汇总

点云处理是一系列操作和技术&#xff0c;用于分析和处理三维点云数据&#xff0c;以提取有用的信息并生成可视化结果。以下是常见的点云处理方法及其简要说明&#xff1a; 1. 点云预处理 滤波&#xff1a;去除噪声和无效点&#xff0c;如使用统计滤波、半径滤波等。下采样&a…