使用Vue + Element Plus實現可多行編輯的分頁表格

需求背景:
????????在現代前端開發中,表格作為數據展示和交互的重要組件,在各類管理系統、數據平臺中有著廣泛的應用。隨著用戶對數據操作便捷性要求的不斷提高,具備靈活編輯功能的表格成為了開發中的常見需求。特別是在需求處理大量數據時,不僅要實現數據的分頁展示,還要支持對數據的實時編輯,并且要保證在復雜操作場景下的數據狀態管理。
????????本次demo是人員信息管理的場景。
????????在該場景下,需要一個能夠展示人員基本信息(包括ID、姓名、年齡、職業、愛好等)的表格,同時要求具備強大的編輯功能。具體來說,需要在表格中實現編輯按鈕,點擊后能對該行的職業和愛好進行修改,其中職業通過文本框編輯,愛好通過下拉框選擇。此外,考慮到數據量較大的情況,表格需要支持分頁展示,每頁展示5條數據為例。更為關鍵的是,要實現多行數據同時編輯的功能,并且在切換分頁時,能將數據恢復到初始化狀態,確保用戶操作的一致性和數據展示的準確性,提升系統的易用性和交互體驗。
代碼展示:

<script setup lang="ts">
import { ref, computed } from 'vue'
import { ElTable, ElTableColumn, ElPagination, ElButton, ElInput, ElSelect, ElOption } from 'element-plus'interface TableItem {id: numbername: stringage: numberprofession: stringhobby: stringisEditing: booleanoriginalData?: {profession: stringhobby: string}
}const hobbies = ['讀書', '運動', '音樂', '旅游', '游戲']const tableData = ref<TableItem[]>([{ id: 1, name: '張三', age: 25, profession: '工程師', hobby: '讀書', isEditing: false },{ id: 2, name: '李四', age: 28, profession: '設計師', hobby: '運動', isEditing: false },{ id: 3, name: '王五', age: 30, profession: '教師', hobby: '音樂', isEditing: false },{ id: 4, name: '趙六', age: 22, profession: '學生', hobby: '游戲', isEditing: false },{ id: 5, name: '錢七', age: 35, profession: '醫生', hobby: '旅游', isEditing: false },{ id: 6, name: '孫八', age: 27, profession: '銷售', hobby: '運動', isEditing: false },{ id: 7, name: '周九', age: 32, profession: '會計', hobby: '讀書', isEditing: false },{ id: 8, name: '吳十', age: 29, profession: '律師', hobby: '音樂', isEditing: false },{ id: 9, name: '鄭十一', age: 31, profession: '記者', hobby: '旅游', isEditing: false },{ id: 10, name: '王十二', age: 26, profession: '作家', hobby: '游戲', isEditing: false },
])const currentPage = ref(1)
const pageSize = ref(5)const paginatedData = computed(() => {const start = (currentPage.value - 1) * pageSize.valueconst end = start + pageSize.valuereturn tableData.value.slice(start, end)
})const handleEdit = (row: TableItem) => {row.isEditing = truerow.originalData = {profession: row.profession,hobby: row.hobby}
}const handleSave = (row: TableItem) => {row.isEditing = false;// 實際開發中,調用接口,是否使用delete row.originalData視情況而定delete row.originalData
}const handleCancel = (row: TableItem) => {
// 取消操作時,務必還原之前的數據if (row.originalData) {row.profession = row.originalData.professionrow.hobby = row.originalData.hobby}row.isEditing = false// 實際開發中,調用接口,是否使用delete row.originalData視情況而定delete row.originalData
}const handlePageChange = (page: number) => {currentPage.value = page;// Reset editing state for all rows,僅為靜態數據展示使用;實際開發調用接口,無需單獨處理tableData.value.forEach(row => {if (row.isEditing) {handleCancel(row)}})
}
</script><template><div class="table-container"><el-table :data="paginatedData" style="width: 100%"><el-table-column prop="id" label="ID" width="80" /><el-table-column prop="name" label="姓名" width="120" /><el-table-column prop="age" label="年齡" width="80" /><el-table-column label="職業" width="180"><template #default="{ row }"><el-inputv-if="row.isEditing"v-model="row.profession"size="small"/><span v-else>{{ row.profession }}</span></template></el-table-column><el-table-column label="愛好" width="180"><template #default="{ row }"><el-selectv-if="row.isEditing"v-model="row.hobby"size="small"style="width: 100%"><el-optionv-for="hobby in hobbies":key="hobby":label="hobby":value="hobby"/></el-select><span v-else>{{ row.hobby }}</span></template></el-table-column><el-table-column label="操作" width="180"><template #default="{ row }"><template v-if="row.isEditing"><el-button type="success" size="small" @click="handleSave(row)">保存</el-button><el-button type="info" size="small" @click="handleCancel(row)">取消</el-button></template><el-button v-else type="primary" size="small" @click="handleEdit(row)">編輯</el-button></template></el-table-column></el-table><div class="pagination"><el-paginationv-model:current-page="currentPage":page-size="pageSize":total="tableData.length"layout="prev, pager, next"@current-change="handlePageChange"/></div></div>
</template><style scoped>
.table-container {width: 100%;max-width: 1000px;margin: 0 auto;
}.pagination {margin-top: 20px;display: flex;justify-content: center;
}.el-button {margin-right: 8px;
}.el-button:last-child {margin-right: 0;
}
</style>

上面代碼僅為靜態數據參考,在實際開發中,我實際的開發邏輯為下面的 條

  1. 初始化調用列表數據,通過map方法為每一條數據增加一個isEdit屬性,值為false;增加一個originalData記錄需要變更的字段或者如上所示,在interface中聲明一個originalData可選屬性,在編輯數據時,再進行復制
  2. 點擊編輯,將isEdit值改為true
  3. 保存操作,給接口傳參,將修改的值進行本地賦值,如愛好下拉框選項卡,實際開發中顯示的都是Desc字段,需要進行處理。保存后,不調用列表接口,否則,就無法實現多行編輯
  4. 取消操作,一定要把原始值進行賦值,否則點擊編輯時,顯示的數據為編輯后未保存的值。
  5. 分頁切換,展示為初始化狀態,只需要正常調用接口即可。

實現效果如下圖所示:
在這里插入圖片描述
希望上述內容對你實現類似功能有所幫助。如果你有更優的實現方法或遇到了其他問題,歡迎在評論區留言分享,我們可以一起探討優化方案。

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

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

相關文章

奧威BI+AI——高效智能數據分析工具,引領數據分析新時代

隨著數據量的激增&#xff0c;企業對高效、智能的數據分析工具——奧威BIAI的需求日益迫切。奧威BIAI&#xff0c;作為一款顛覆性的數據分析工具&#xff0c;憑借其獨特功能&#xff0c;正在引領數據分析領域的新紀元。 一、?零報表環境下的極致體驗? 奧威BIAI突破傳統報表限…

【機器學習基礎】機器學習入門核心算法:K均值(K-Means)

機器學習入門核心算法&#xff1a;K均值&#xff08;K-Means&#xff09; 1. 算法邏輯2. 算法原理與數學推導2.1 目標函數2.2 數學推導2.3 時間復雜度 3. 模型評估內部評估指標外部評估指標&#xff08;需真實標簽&#xff09; 4. 應用案例4.1 客戶細分4.2 圖像壓縮4.3 文檔聚類…

springboot多模塊父pom打包正常,單模塊報錯

背景&#xff1a;因為項目開發中經常發測試環境&#xff0c;發現使用阿里的插件能一鍵上傳&#xff0c;不用手動上傳比較方便。但是多模塊有多個啟動jar的時候&#xff0c;全局打包太慢&#xff0c;單獨打發現報錯。這里貼一下我使用這個插件的方式&#xff1a; 附帶一個我感覺…

通義靈碼2.5——基于MCP打造我的12306火車票智能查詢小助手

前沿技術應用全景圖 本項目作為通義靈碼2.5的標桿實踐案例&#xff0c;展現了AI輔助開發在復雜業務系統中的革命性突破。通過深度集成12306 MCP服務體系&#xff0c;我們構建了一個融合智能決策、環境感知和自主優化的新一代火車票查詢系統。 #mermaid-svg-4D7QqwJjsQRdKVP7 {…

進程間通信(共享內存)

目錄 前置&#xff1a; 一 原理 二 API 1. shmgetr 2. shmctl 3. 指令操作 2. 刪除 3. 掛接 4. 斷開掛接 三 demo代碼 四 共享內存的特征 前置&#xff1a; 1.前面說的不管是匿名管道還是命名管道都是基于文件的思想構建的一套進程間通信的方案&#xff0c;那有沒有…

詳解GPU

詳解GPU GPU&#xff08;圖形處理器&#xff09;就像電腦里的 “圖形小能手”&#xff0c;原本主要用來畫畫&#xff08;渲染圖形&#xff09;&#xff0c;現在還能幫忙干很多雜活&#xff08;并行計算&#xff09; 一、先認識 GPU 的 “鑰匙”&#xff1a;驅動和開發工具 裝驅…

體育遇上AI:解讀新一代智能閱讀產品

在信息過載的今天&#xff0c;體育迷們時常面對這樣的困擾&#xff1a;如何從海量賽事新聞、數據分析和深度評論中高效獲取自己真正關心的內容&#xff1f;體育AI閱讀產品正成為解決這一痛點的關鍵鑰匙——它融合人工智能技術與體育內容生態&#xff0c;為球迷提供智能化、個性…

外網訪問可視化工具 Grafana (Linux版本)

Grafana 是一款強大的可視化監控指標的展示工具&#xff0c;可以將不同的數據源數據以圖形化的方式展示&#xff0c;不僅通用而且非常美觀。它支持多種數據源&#xff0c;如 prometheus 等&#xff0c;也可以通過插件和 API 進行擴展以滿足各種需求。 本文將詳細介紹如何在本地…

Java開發經驗——阿里巴巴編碼規范實踐解析4

摘要 本文主要介紹了阿里巴巴編碼規范中關于日志處理的相關實踐解析。強調了使用日志框架&#xff08;如 SLF4J、JCL&#xff09;而非直接使用日志系統&#xff08;如 Log4j、Logback&#xff09;的 API 的重要性&#xff0c;包括解耦日志實現、統一日志調用方式等好處。同時&…

各個鏈接集合

golang學習&#xff5e;&#xff5e;_從數組中取一個相同大小的slice有成本嗎?-CSDN博客 框架 golang學習&#xff5e;&#xff5e;_從數組中取一個相同大小的slice有成本嗎?-CSDN博客 golang k8s學習_容器化部署和傳統部署區別-CSDN博客 K8S rabbitmq_rabbitmq 廣播-CSD…

Cesium 展示——獲取鼠標移動、點擊位置的幾種方法

文章目錄 需求分析:這里我們用到了幾種常見的鼠標事件1. 獲取鼠標移動的位置2. 獲取鼠標點擊的位置3. 添加面4. 示例代碼需求 獲取指定斷面的 label 分析:這里我們用到了幾種常見的鼠標事件 1. 獲取鼠標移動的位置 viewer.screenSpaceEventHandler.setInputAction((moveme…

技術分享 | Oracle SQL優化案例一則

本文為墨天輪數據庫管理服務團隊第70期技術分享&#xff0c;內容原創&#xff0c;作者為技術顧問馬奕璇&#xff0c;如需轉載請聯系小墨&#xff08;VX&#xff1a;modb666&#xff09;并注明來源。 一、問題概述 開發人員反映有條跑批語句在測試環境執行了很久都沒結束&…

$3 #12階段三小結Java se

$3 #12 階段三小結 Java se 基本沒有新學什么知識點 感覺 基礎語法 和高級語法 已經學完了 現在就是得學習 一些企業開發的框架 以及項目架構的思維 比如一個產品 從需求分析 到功能模塊設計 到接口文檔定義 數據庫建立 前端接口頁面設計 后端接口開發的步驟 然后現在比…

華為云Flexus+DeepSeek征文 | 初探華為云ModelArts Studio:部署DeepSeek-V3/R1商用服務的詳細步驟

華為云FlexusDeepSeek征文 | 初探華為云ModelArts Studio&#xff1a;部署DeepSeek-V3/R1商用服務的詳細步驟 前言一、華為云ModelArts Studio平臺介紹1.1 ModelArts Studio介紹1.2 ModelArts Studio主要特點1.3 ModelArts Studio使用場景1.4 ModelArts Studio產品架構 二、訪問…

易經六十四卦象解釋數據集分享!智能體知識庫收集~

今天給大家分享一個易經六十四卦象解釋數據集 &#xff0c;繼續來積累AI相關的資料。 六十四卦&#xff0c;記載于《易經》&#xff0c;每一卦的圖像均由兩個八卦上下組合而成&#xff0c;每一卦各有六個爻。南宋朱熹說&#xff0c;先畫八卦于內&#xff0c;后畫八卦于外&#…

1 μs = 10?? s

1 s 10? s 1 ms 10? s 1 s 10?? s 1 ns 10?? s 1 ps 10? s 1 fs 10?? s ?? 時間單位&#xff08;十進制&#xff09; 符號單位名稱10 的冪次s秒&#xff08;second&#xff09;10?ms毫秒&#xff08;millisecond&#xff09;10?s微秒&#xff08;microseco…

webrtc初了解

1. webrtc的簡介 一、WebRTC 是什么&#xff1f; Web Real-Time Communication&#xff08;網頁實時通信&#xff09;&#xff0c;是瀏覽器原生支持的實時音視頻通信技術&#xff0c;無需安裝插件或客戶端&#xff0c;可直接在瀏覽器之間實現點對點&#xff08;P2P&#xff09…

從數據持久化到網絡通信與OpenCV:Qt應用程序開發的深度探索與實戰

文章目錄 前言一、QSettings&#xff1a;輕量級數據持久化方案1.1 QSettings 主要特點1.2 QSettings 常用函數整理 二、數據庫2.1 連接SQLite數據庫2.2 建表2.3 增刪改 三、網絡編程3.1 網絡分層3.2 IP地址3.3 端口號3.4 基于TCP的Socket通信3.4 相關接口3.4.1核心類3.4.2 通信…

經典SQL查詢問題的練習第一天

首先有三張表&#xff0c;學生表、課程表、成績表 student:studentId,studentName; course:courseId&#xff0c;courseName,teacher; score:score,studentId,courseId; 接著有以下幾道題目&#xff1a; ①查詢課程編號為‘0006’的總成績&#xff1a; 首先總成績&#x…

企業級網絡管理實戰:Linux、云與容器的深度融合與優化

在數字化轉型浪潮下&#xff0c;企業網絡架構日益復雜&#xff0c;Linux系統、云計算與容器技術成為構建高效、靈活網絡的核心要素。本文將從技術原理、實踐方案、優化策略三個維度&#xff0c;深度解析企業級網絡管理中的關鍵技術&#xff0c;助力企業打造穩定、安全、可擴展的…