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.pswp.cn/web/73898.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73898.shtml
英文地址,請注明出處:http://en.pswp.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;不同的…