Vue实现的表格多选方案支持跨页选择和回显功能

以下是纯Vue实现的表格多选方案(不依赖UI库),支持跨页选择和回显功能:

<template><div class="custom-table"><!-- 表格主体 --><table><thead><tr><th><input type="checkbox" :checked="isAllChecked"@change="toggleAllSelection"></th><th>ID</th><th>Name</th><th>Age</th></tr></thead><tbody><tr v-for="item in currentPageData" :key="item.id"><td><inputtype="checkbox":checked="isSelected(item.id)"@change="toggleSelection(item)"></td><td>{{ item.id }}</td><td>{{ item.name }}</td><td>{{ item.age }}</td></tr></tbody></table><!-- 分页控件 --><div class="pagination"><button v-for="page in totalPages" :key="page":class="{ active: currentPage === page }"@click="currentPage = page">{{ page }}</button></div><!-- 已选展示 --><div class="selected-info">已选ID: {{ selectedIds.join(', ') }}</div></div>
</template><script>
export default {data() {return {// 原始数据allData: [],// 分页相关currentPage: 1,pageSize: 5,// 选中数据selectedItems: new Map(), // 使用Map存储保证顺序}},computed: {// 当前页数据currentPageData() {const start = (this.currentPage - 1) * this.pageSizeconst end = start + this.pageSizereturn this.allData.slice(start, end)},// 总页数totalPages() {return Math.ceil(this.allData.length / this.pageSize)},// 当前页是否全选isAllChecked() {return this.currentPageData.every(item => this.selectedItems.has(item.id))},// 已选ID数组selectedIds() {return Array.from(this.selectedItems.keys())}},created() {// 生成模拟数据this.generateMockData(23)// 模拟回显数据(实际从API获取)this.$nextTick(() => {this.setInitialSelection([2, 5, 9]) // 回显ID为2、5、9的数据})},methods: {// 生成模拟数据generateMockData(count) {for(let i = 1; i <= count; i++) {this.allData.push({id: i,name: `User ${i}`,age: 20 + (i % 10)})}},// 设置初始选中(回显)setInitialSelection(ids) {ids.forEach(id => {const item = this.allData.find(d => d.id === id)if(item) this.selectedItems.set(id, item)})},// 切换单个选择toggleSelection(item) {if(this.selectedItems.has(item.id)) {this.selectedItems.delete(item.id)} else {this.selectedItems.set(item.id, item)}},// 切换全选toggleAllSelection(e) {const checked = e.target.checkedthis.currentPageData.forEach(item => {if(checked) {this.selectedItems.set(item.id, item)} else {this.selectedItems.delete(item.id)}})},// 检查是否选中isSelected(id) {return this.selectedItems.has(id)}}
}
</script><style scoped>
.custom-table {max-width: 800px;margin: 20px auto;font-family: Arial, sans-serif;
}table {width: 100%;border-collapse: collapse;margin-bottom: 20px;
}th, td {border: 1px solid #ddd;padding: 12px;text-align: left;
}th {background-color: #f5f5f5;
}tr:hover {background-color: #f9f9f9;
}.pagination {display: flex;gap: 8px;margin-bottom: 20px;
}.pagination button {padding: 6px 12px;border: 1px solid #ddd;background: white;cursor: pointer;border-radius: 4px;
}.pagination button.active {background: #409eff;color: white;border-color: #409eff;
}.selected-info {padding: 12px;background: #f5f5f5;border-radius: 4px;
}
</style>

核心实现逻辑:

  1. 数据结构设计:

    • allData:存储全部数据(模拟数据)
    • selectedItems:使用Map存储选中项,方便快速查找
    • currentPageData:计算属性获取当前页数据
  2. 跨页选择实现:

    • 使用Map存储选中项,不受分页影响
    • 切换页面时自动保留选中状态
    • 通过isSelected方法检查当前行是否选中
  3. 回显功能:

    • 提供setInitialSelection方法初始化选中项
    • 支持传入ID数组自动匹配数据项
  4. 全选功能:

    • 当前页全选/取消全选
    • 自动同步到全局选中状态
    • 智能显示全选复选框状态
  5. 性能优化:

    • 使用Map数据结构提升查找效率
    • 计算属性缓存计算结果
    • 虚拟滚动友好(可扩展)

功能扩展建议:

  1. 分页优化:

    // 在methods中添加
    goToPage(page) {if(page < 1 || page > this.totalPages) returnthis.currentPage = page
    }// 在模板中添加
    <button @click="goToPage(currentPage - 1)">上一页</button>
    <button @click="goToPage(currentPage + 1)">下一页</button>
    
  2. 多选操作增强:

    // 清空选择
    clearSelection() {this.selectedItems.clear()
    }// 批量删除
    deleteSelected() {this.allData = this.allData.filter(item => !this.selectedItems.has(item.id)this.clearSelection()
    }
    
  3. 数据持久化:

    // 本地存储示例
    watch: {selectedItems: {handler(newVal) {localStorage.setItem('selectedItems', JSON.stringify([...newVal]))},deep: true}
    }
    
  4. 性能增强(大数据量):

    // 使用虚拟滚动
    // 安装vue-virtual-scroller
    import { RecycleScroller } from 'vue-virtual-scroller'// 替换tbody部分
    <RecycleScrollerclass="scroller":items="currentPageData":item-size="48"key-field="id"
    ><template #default="{ item }"><tr><!-- 原有td内容 --></tr></template>
    </RecycleScroller>
    

使用说明:

  1. 通过setInitialSelection方法初始化回显数据
  2. 获取选中数据:Array.from(this.selectedItems.values())
  3. 修改pageSize可调整每页显示数量
  4. 样式可根据需求自定义修改

这个实现方案具有以下特点:

  • 零依赖,纯Vue实现
  • 完整的分页选择逻辑
  • 高性能的选中状态管理
  • 灵活的回显机制
  • 易于扩展的自定义样式
  • 支持大数据量的虚拟滚动(需额外配置)

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

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

相关文章

Oracle 19C 备份

在 Oracle 19c 中&#xff0c;备份数据库通常使用 RMAN&#xff08;Recovery Manager&#xff09; 工具&#xff0c;它是 Oracle 提供的官方备份和恢复工具。以下是通过 RMAN 备份 Oracle 19c 数据库的详细步骤和命令。 一、RMAN 基本概念 RMAN 是 Oracle 的备份和恢复工具&am…

Elasticsearch:人工智能时代的公共部门数据治理

作者&#xff1a;来自 Elastic Darren Meiss 人工智能&#xff08;AI&#xff09;和生成式人工智能&#xff08;GenAI&#xff09;正在迅速改变公共部门&#xff0c;从理论探讨走向实际应用。正确的数据准备、管理和治理将在 GenAI 的成功实施中发挥关键作用。 我们最近举办了…

AT24Cxx移植第三方库到裸机中使用

简介 MCU : STM32F103C8T6 库: HAL库裸机开发 EEPROM : AT24C02, 256Byte容量&#xff0c;I2C接口 电路图 AT24C02 电路图 电路图引用 裸机直接读写 // 写入数据到 EEPROM HAL_StatusTypeDef EEPROM_WriteByte(uint16_t MemAddress, uint8_t Data) {// 发送数据uint8_t …

算法刷题记录——LeetCode篇(1.3) [第21~30题](持续更新)

更新时间&#xff1a;2025-03-29 LeetCode题解专栏&#xff1a;实战算法解题 (专栏)技术博客总目录&#xff1a;计算机技术系列目录页 优先整理热门100及面试150&#xff0c;不定期持续更新&#xff0c;欢迎关注&#xff01; 21. 合并两个有序链表 将两个升序链表合并为一个…

常用数据库

模式的定义于删除 1.定义模式 CREATE SCHEMA [ <模式名> ] AUTHORIZATION < 用户名 >;要创建模式&#xff0c;调用该命令的用户必须拥有数据库管理员权限&#xff0c;或者获得了DBA授权 eg:为用户WANG定义一个模式S-C-SC CREATE SCHEMA "S-C-SC" AUT…

Processor System Reset IP 核 v5.0(vivado)

这个IP的作用&#xff0c;我的理解是&#xff0c;比普通按键复位更加高效灵活&#xff0c;可以配置多个复位输出&#xff0c;可以配置复位周期。 1、输入信号&#xff1a; 重要的信号有时钟clk信号&#xff0c;一般连接到系统时钟&#xff1b;输入复位信号&#xff0c;一般是外…

3月29日星期六今日早报简报微语报早读

3月29日星期六&#xff0c;农历三月初一&#xff0c;早报#微语早读。 1、全国公立医疗机构自3月31日起全面停止收取门诊预交金&#xff1b; 2、永辉超市“胖东来调改店”已达47家店 一线员工薪酬涨幅50%以上&#xff1b; 3、两孩家庭补10万&#xff0c;三孩家庭补20万&#…

pyinstaller 对 pyexecjs模块打包老会有终端框闪烁

解决办法&#xff1a; 修改 execjs 源代码 具体步骤 1. 在 execjs 源文件中&#xff0c;找到 _external_runtime.py 文件中的以下代码 p Popen(cmd, startupinfostartupinfo, stdinPIPE, stdoutPIPE, stderrPIPE, cwdself._cwd,universal_newlinesTrue)2. 修改为&#xff…

代码随想录day2 数组总结

1.二分查找 2.快慢 双指针 代码随想录day1-CSDN博客 3.滑动窗口 滑动窗口就是有一个起始位置&#xff0c;一个终止位置&#xff0c;通过调节起始位置和终止位置得到我们想要的结果。 外面一层for循环 用来更新终止位置 不满足条件 终止位置右移 里面一层while循环 …

MAC安装docker 后提示com.docker.vmnetd”将对您的电脑造成伤害

出现“com.docker.vmnetd”将对您的电脑造成伤害的提示&#xff0c;通常是由于文件签名问题导致 macOS 的安全系统误判 Docker 为恶意软件。以下是解决方法&#xff1a; 停止相关服务并删除文件 运行以下命令停止相关服务并删除有问题的文件 停止 Docker 服务 sudo pkill ‘…

Redis-常用命令

目录 1、Redis数据结构 2、命令简介 2.1、通用命令 DEL EXISTS EXPIRE 2.2、String命令 SET和GET MSET和MGET INCR和INCRBY和DECY SETNX SETEX 2.3、Key的层级结构 2.4、Hash命令 HSET和HGET HMSET和HMGET HGETALL HKEYS和HVALS HINCRBY HSETNX 2.5、List命…

每日一题之既约分数

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 如果一个分数的分子和分母的最大公约数是 1&#xff0c;这个分数称为既约分数。 例如 3/4,1/8,7/1​&#xff0c; 都是既约分数。 请问&#xff0c;有多少个既约分…

Java 图片压缩:高效压缩方案解析

目录 一、基于OpenCV的智能尺寸压缩(一)代码示例(二)技术亮点(三)适用场景二、WebP高效格式转换(一)代码示例(二)核心优势(三)性能对比三、基于Thumbnailator的简单压缩(一)代码示例(二)技术亮点(三)适用场景四、方案选型建议一、基于OpenCV的智能尺寸压缩 …

鸿蒙Next-集成HmRouter的路由模式

第一步&#xff1a;全局安装hmrouter依赖 ohpm install hadss/hmrouter第二步&#xff1a;修改全局的hvigor-config.json5(加入hm-router插件) hvigor/hvigor-config.json5 {"modelVersion": "5.0.1","dependencies": {"hadss/hmrouter-…

uni-app:指引蒙层

组件说明 指引蒙层组件: 通过id标签,突出对应id中的模块; 可以自定义提示词。 点击任意位置关闭蒙层 效果展示和使用示例 切换id之后的效果: 代码实现 <template><view class="guide-mask" v-if="showMask" @click="hideMask"&g…

基于Java与Go的下一代DDoS防御体系构建实战

引言:混合云时代的攻防对抗新格局 2024年某金融平台遭遇峰值2.3Tbps的IPv6混合攻击,传统WAF方案在新型AI驱动攻击面前全面失效。本文将以Java与Go为技术栈,揭示如何构建具备智能决策能力的防御系统。 一、攻击防御技术矩阵重构 1.1 混合攻击特征识别 攻击类型Java检测方案…

大数据Spark(五十五):Spark框架及特点

文章目录 Spark框架及特点 一、Spark框架介绍 二、Spark计算框架具备以下特点 Spark框架及特点 一、Spark框架介绍 Apache Spark 是一个专为大规模数据处理而设计的快速、通用的计算引擎。最初由加州大学伯克利分校的 AMP 实验室&#xff08;Algorithms, Machines, and Pe…

ubuntu 升级补丁,备份备份备份

一、常规软件包更新&#xff08;安全补丁和软件升级&#xff09; 更新软件包列表 从软件源服务器获取最新的软件包信息&#xff1a; sudo apt update升级已安装的软件包 安装所有可用的更新&#xff08;安全补丁、功能更新&#xff09;&#xff1a; sudo apt upgrade处理依赖…

CubeMx——串口与 printf 打印

CubeMx 配置 fputc 实现 /* USER CODE BEGIN 0 */ #include <stdio.h> /* USER CODE END 0 *//* USER CODE BEGIN 1 */ int fputc(int ch, FILE *f) {/* Place your implementation of fputc here *//* e.g. write a character to the USART */uint8_t send_data ch;HA…

多线程 -- Thread类

Thread 的常见构造方法 最后一个构造方法中的 ThreadGroup 线程组是 Java 中的概念&#xff0c;和系统内核中的线程组不是一个东西。我们自己创建的线程&#xff0c;默认是按照 Thread- 0 1 2 3 4...命名。但我们也可以给不同的线程&#xff0c;起不同的名字&#xff08;不同的…