iView Table 組件跨頁選擇功能實現文檔

iView Table 組件跨頁選擇功能實現文檔

功能概述

實現基于 iView Table 組件的多選功能,支持以下特性:

  • ? 跨頁數據持久化選擇
  • ? 當前頁全選/取消全選
  • ? 自動同步選中狀態顯示
  • ? 分頁切換狀態保持
  • ? 高性能大數據量支持

實現方案

技術棧

  • iView UI 4.x
  • Vue.js 2.x

核心思路

  1. 狀態存儲

    • 使用獨立數組 selectedHospitals 存儲選中項
    • 以唯一標識符 HOSPITAL_ID 作為數據標識
  2. 狀態同步

    • 分頁加載后同步表格選中狀態
    • 使用 row-key 保證行識別穩定性
  3. 事件處理

    • 覆蓋全部選擇相關事件:
      • @on-select 單個選擇
      • @on-select-all 全選當前頁
      • @on-select-cancel 取消單個
      • @on-select-all-cancel 取消全選

代碼示例

模板部分

<template><div class="container"><Tableborderref="selection"row-key="HOSPITAL_ID":columns="columns":data="currentPageData"@on-select="handleSelect"@on-select-all="handleSelectAll"@on-select-cancel="onSelectCancel"@on-select-all-cancel="onSelectAllCancel"/><Page:total="totalCount":current="currentPage"@on-change="handlePageChange"show-total/></div>
</template>

腳本部分

export default {data() {return {// 表格配置columns: [{ type: 'selection',width: 60,align: 'center',fixed: 'left'},// 其他數據列...],// 核心數據currentPageData: [],selectedHospitals: [],currentPage: 1,totalCount: 0}},methods: {// 數據獲取方法async loadPageData(page = 1) {const res = await api.getHospitalList({page,pageSize: 10});this.currentPageData = res.data.items;this.totalCount = res.data.total;this.currentPage = page;this.$nextTick(this.syncSelectionStates);},// 狀態同步方法syncSelectionStates() {this.currentPageData.forEach((row, index) => {const isSelected = this.selectedHospitals.some(item => item.id === row.HOSPITAL_ID);if (isSelected) {this.$refs.selection.toggleSelect(index);}});},// 事件處理handleSelect(_, row) {const targetIndex = this.selectedHospitals.findIndex(item => item.id === row.HOSPITAL_ID);if (targetIndex === -1) {this.selectedHospitals.push({id: row.HOSPITAL_ID,name: row.NAME,// 可擴展其他需要保存的字段});} else {this.selectedHospitals.splice(targetIndex, 1);}},handleSelectAll(selection) {if (selection.length === 0) {this.handleDeselectCurrentPage();} else {this.handleSelectCurrentPage(selection);}},handleSelectCurrentPage(selection) {const newSelections = selection.filter(row => !this.selectedHospitals.some(item => item.id === row.HOSPITAL_ID)).map(row => ({id: row.HOSPITAL_ID,name: row.NAME}));this.selectedHospitals.push(...newSelections);},handleDeselectCurrentPage() {const currentPageIds = new Set(this.currentPageData.map(row => row.HOSPITAL_ID));this.selectedHospitals = this.selectedHospitals.filter(item => !currentPageIds.has(item.id));}}
}

核心邏輯說明

關鍵配置

配置項說明
row-key必須設置為數據唯一標識字段
ref="selection"用于獲取表格實例操作選中狀態

狀態同步流程

PageComponent Table StateStore UI 加載新數據 觸發數據更新 獲取已選數據 同步選中狀態 更新勾選顯示 PageComponent Table StateStore UI

性能優化策略

  1. 使用 Set 結構加速查找

    const idSet = new Set(currentPageIds);
    this.selectedHospitals.filter(item => !idSet.has(item.id));
    
  2. 批量操作減少 DOM 操作

    this.$nextTick(() => {this.syncSelectionStates();
    });
    
  3. 防重復處理

    selection.filter(row => !this.selectedHospitals.some(item => item.id === row.HOSPITAL_ID)
    )
    

注意事項

  1. 數據一致性

    • 確保接口返回數據包含 HOSPITAL_ID 字段
    • 分頁大小(pageSize)需前后端統一
  2. 性能限制

    • 推薦在選中數據量 < 1000 時使用前端方案
    • 超過 1000 條建議改用服務端存儲方案
  3. 特殊場景處理

    // 清空所有選擇
    clearAllSelections() {this.selectedHospitals = [];this.$refs.selection.selectAll(false);
    }
    
  4. 版本兼容性

    • 需要 iView 4.3+ 版本支持完善的行選擇功能

擴展功能建議

1. 選中項展示面板

<template><div class="selected-panel"><Tag v-for="item in selectedHospitals" :key="item.id"closable@on-close="handleRemoveTag(item.id)">{{ item.name }}</Tag></div>
</template>

2. 服務端全選方案

handleSelectAllPages() {this.$Modal.confirm({title: '全選確認',content: '將選擇全部符合條件的記錄(共'+this.totalCount+'條)',onOk: async () => {const res = await api.selectAllHospitalIds();this.selectedHospitals = res.data.map(id => ({id,name: '需二次加載名稱' }));}});
}

3. 本地持久化存儲

// 在 created 鉤子中
const saved = localStorage.getItem('selectedHospitals');
if (saved) {this.selectedHospitals = JSON.parse(saved);
}// 添加 watch
watch: {selectedHospitals: {deep: true,handler(newVal) {localStorage.setItem('selectedHospitals', JSON.stringify(newVal));}}
}

常見問題

Q1: 切換分頁后選中狀態顯示異常
? 解決方案:

  1. 檢查是否設置 row-key
  2. 確認在數據更新后調用 syncSelectionStates

Q2: 全選操作性能較差
? 優化建議:

// 使用 Web Worker 處理大數據
const worker = new Worker('./selectionWorker.js');
worker.postMessage({ data: bigData });

Q3: 需要兼容多表格共存場景
? 改進方案:

// 使用 Symbol 作為存儲鍵
const STORAGE_KEY = Symbol('hospital_selection');
this[STORAGE_KEY] = selectedData;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81075.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81075.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81075.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

家庭服務器IPV6搭建無限郵箱系統指南

qq郵箱操作 // 郵箱配置信息 // 注意&#xff1a;使用QQ郵箱需要先開啟IMAP服務并獲取授權碼 // 設置方法&#xff1a;登錄QQ郵箱 -> 設置 -> 賬戶 -> 開啟IMAP/SMTP服務 -> 生成授權碼 服務器操作 fetchmail 同步QQ郵箱 nginx搭建web顯示本地同步過來的郵箱 ssh…

Tauri v1 與 v2 配置對比

本文檔對比 Tauri v1 和 v2 版本的配置結構和內容差異&#xff0c;幫助開發者了解版本變更并進行遷移。 配置結構變化 v1 配置結構 {"package": { ... },"tauri": { "allowlist": { ... },"bundle": { ... },"security":…

對js的Date二次封裝,繼承了原Date的所有方法,增加了自己擴展的方法,可以實現任意時間往前往后推算多少小時、多少天、多少周、多少月;

封裝js時間工具 概述 該方法繼承了 js 中 Date的所有方法&#xff1b;同時擴展了一部分自用方法&#xff1a; 1、任意時間 往前推多少小時&#xff0c;天&#xff0c;月&#xff0c;周&#xff1b;參數1、2必填&#xff0c;參數3可選beforeDate(num,formatter,dateVal); befo…

TimeDistill:通過跨架構蒸餾的MLP高效長期時間序列預測

原文地址&#xff1a;https://arxiv.org/abs/2502.15016 發表會議&#xff1a;暫定&#xff08;但是Star很高&#xff09; 代碼地址&#xff1a;無 作者&#xff1a;Juntong Ni &#xff08;倪浚桐&#xff09;, Zewen Liu &#xff08;劉澤文&#xff09;, Shiyu Wang&…

DeepSeek最新大模型發布-DeepSeek-Prover-V2-671B

2025 年 4 月 30 日&#xff0c;DeepSeek 開源了新模型 DeepSeek-Prover-V2-671B&#xff0c;該模型聚焦數學定理證明任務&#xff0c;基于混合專家架構&#xff0c;使用 Lean 4 框架進行形式化推理訓練&#xff0c;參數規模達 6710 億&#xff0c;結合強化學習與大規模合成數據…

如何用AI生成假期旅行照?

以下是2025年最新AI生成假期旅行照片的實用工具推薦及使用指南&#xff0c;結合工具特點、研發背景和適用場景進行綜合解析&#xff1a; 一、主流AI旅行照片生成工具推薦與對比 1. 搜狐簡單AI&#xff08;國內工具&#xff09; ? 特點&#xff1a; ? 一鍵優化與背景替換&…

ElaticSearch

ElaticSearch: 全文搜索 超級強&#xff0c;比如模糊查詢、關鍵詞高亮等 海量數據 高效查詢&#xff0c;比傳統關系數據庫快得多&#xff08;尤其是搜索&#xff09; 靈活的數據結構&#xff08;Schema靈活&#xff0c;可以動態字段&#xff09; 分布式高可用&#xff0c;天…

Android開發,實現一個簡約又好看的登錄頁

文章目錄 1. 編寫布局文件2.設計要點說明3. 效果圖4. 關于作者其它項目視頻教程介紹 1. 編寫布局文件 編寫activity.login.xml 布局文件 <?xml version"1.0" encoding"utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat xmlns:android…

機器學習:【拋擲硬幣的貝葉斯后驗概率】

首先,拋硬幣的問題通常涉及先驗概率、似然函數和后驗概率。假設用戶可能想通過觀察一系列的正面(H)和反面(T)來更新硬幣的偏差概率。例如,先驗可能假設硬幣是均勻的,但隨著觀察到更多數據,用貝葉斯定理計算后驗分布。 通常,硬幣的偏差可以用Beta分布作為先驗,因為它…

Echarts 問題:自定義的 legend 點擊后消失,格式化 legend 的隱藏文本樣式

文章目錄 問題分析實現步驟代碼解釋問題 如下圖所示,在自定義的 legend 點擊后會消失 分析 我把隱藏的圖例字體顏色設為灰色,可以借助 legend.formatter 和 legend.textStyle 結合 option.series 的 show 屬性來達成。以下是具體的實現步驟和示例代碼: <!DOCTYPE ht…

光譜相機如何提升目標檢測與識別精度

光譜相機&#xff08;多光譜/高光譜&#xff09;通過捕捉目標在多個波段的光譜特征&#xff0c;能夠揭示傳統RGB相機無法感知的材質、化學成分及物理特性差異。以下是提升其目標檢測與識別精度的核心方法&#xff1a; ?1. 硬件優化&#xff1a;提升數據質量? ?(1) 光譜分辨…

springboot項目配置nacos,指定使用環境

遇到這樣一個問題&#xff0c;在開發、測試、生成環境之間切換的問題。 大多數的操作是通過修改spring.profiles.active來確定指向使用的環境配置文件&#xff0c;對應項目中需要增加對應的配置文件。 但是現在幾乎所有公司都會有代碼管理不管是SVN、git&#xff0c;這樣就會涉…

AI代碼審查的落地實施方案 - Java架構師面試實戰

AI代碼審查的落地實施方案 - Java架構師面試實戰 本文通過模擬一位擁有十年Java研發經驗的資深架構師馬架構與面試官之間的對話&#xff0c;深入探討了AI代碼審查的落地實施方案。 第一輪提問 面試官&#xff1a; 馬架構&#xff0c;請介紹一下您對AI代碼審查的理解。 馬架…

TDengine 訂閱不到數據問題排查

簡介 TDengine 在實際生產應用中&#xff0c;經常會遇到訂閱程序訂閱不到數據的問題&#xff0c;總結大部分都為使用不當或狀態不正確等問題&#xff0c;需手工解決。 查看服務端狀態 通過 sql 命令查看有問題的 topic 和consumer_group 組訂閱是否正常。 select * from inf…

二、UI自動化測試02--元素定位方法

目錄 一、定位?組元素?法二、XPath 定位?法1. 路徑策略1.1 路徑值獲取?法 2. 利?元素屬性策略利?元素屬性策略的注意事項 3. 屬性和邏輯結合4. 層級和屬性結合策略5. XPath 延伸?法 三、CSS 定位?法1. CSS 策略: id選擇器/class選擇器/元素選擇器/屬性選擇器2. 屬性選擇…

HotSpot的算法細節

可達性分析算法 以一系列“GC Roots”根對象作為起始節點集&#xff0c;從這些節點開始&#xff0c;根據引用關系向下搜索&#xff0c;搜索過程所走過的路徑稱為“引用鏈”&#xff08;Reference Chain&#xff09;&#xff0c;如果某個對象到GC Roots間沒有任何引用鏈相連&am…

Transformer數學推導——Q27 證明時序注意力(Temporal Attention)在視頻模型中的幀間依賴建模

該問題歸類到Transformer架構問題集——注意力機制——跨模態與多模態。請參考LLM數學推導——Transformer架構問題集。 在視頻理解任務中&#xff0c;捕捉幀與幀之間的時間依賴關系&#xff08;如動作的連貫性、物體的運動軌跡&#xff09;是核心挑戰。時序注意力&#xff08…

服務器和數據庫哪一個更重要

在當今數字化的時代&#xff0c;服務器和數據庫都是構建和運行各種應用系統的關鍵組成部分&#xff0c;要說哪一個更重要&#xff0c;其實很難簡單地給出定論。 服務器就像是一個強大的引擎&#xff0c;為應用程序提供了穩定的運行環境和高效的計算能力。它負責接收和處理來自…

【Android】四大組件之Service

目錄 一、什么是Service 二、啟停 Service 三、綁定 Service 四、前臺服務 五、遠程服務擴展 六、服務保活 七、服務啟動方法混用 你可以把Service想象成一個“后臺默默打工的工人”。它沒有UI界面&#xff0c;默默地在后臺干活&#xff0c;比如播放音樂、下載文件、處理…