vue3+ts+elementui-表格根據相同值合并

代碼

 <div style="height: auto; overflow: auto"><el-table ref="dataTableRef" v-loading="loading" :data="pageData" highlight-current-row border@selection-change="handleSelectionChange" :span-method="objectSpanMethod" :row-style="tableRowStyle"><el-table-column type="selection" width="55" align="center" /><!-- <el-table-column key="id" label="id" prop="id" align="center" /> --><el-table-column key="roomName" label="房間名稱" prop="roomName" align="center" /><el-table-column key="categoryName" label="所屬分類" prop="categoryName" align="center" /><el-table-column key="deviceName" label="設備名稱" prop="deviceName" align="center" /></el-table><pagination v-if="total > 0" v-model:total="total" v-model:page="queryParams.pageNum"v-model:limit="queryParams.pageSize" @pagination="handleQuery()" style="float: right;" /></div>

js?


interface User {id: stringroomName: stringdeviceName: stringcategoryName: string
}
interface SpanMethodProps {row: Usercolumn: TableColumnCtx<User>rowIndex: numbercolumnIndex: number
}
const objectSpanMethod = ({ row, column, rowIndex }) => {if (column.property === 'roomName') {const currentRoom = row.roomName;let prevRoom = rowIndex === 0 ? null : pageData.value[rowIndex - 1].roomName;if (rowIndex === 0 || currentRoom !== prevRoom) {let count = 1;for (let i = rowIndex + 1; i < pageData.value.length; i++) {if (pageData.value[i].roomName === currentRoom) {count++;} else {break;}}return { rowspan: count, colspan: 1 };} else {return { rowspan: 0, colspan: 0 };}}if (column.property === 'categoryName') {const currentCategory = row.categoryName;let prevCategory = rowIndex === 0 ? null : pageData.value[rowIndex - 1].categoryName;if (rowIndex === 0 || currentCategory !== prevCategory) {let count = 1;for (let i = rowIndex + 1; i < pageData.value.length; i++) {if (pageData.value[i].categoryName === currentCategory) {count++;} else {break;}}return { rowspan: count, colspan: 1 };} else {return { rowspan: 0, colspan: 0 };}}return { rowspan: 1, colspan: 1 };
}
// 定義合并信息的類型
type SpanInfo = {rowspan: numbercolspan: number
}// 用于存儲 roomName 和 categoryName 的合并信息
const roomNameSpanMap: Map<number, SpanInfo> = new Map() // key 是 rowIndex
const categoryNameSpanMap: Map<number, SpanInfo> = new Map()// 計算合并信息的方法
const calculateSpans = (data: User[]) => {let roomNameCount = 1let categoryNameCount = 1let prevRoomName = data[0]?.roomNamelet prevCategoryName = data[0]?.categoryName// 第一行默認 rowspan 為后續相同項的數量roomNameSpanMap.set(0, { rowspan: 1, colspan: 1 })categoryNameSpanMap.set(0, { rowspan: 1, colspan: 1 })for (let i = 1; i < data.length; i++) {const current = data[i]const prev = data[i - 1]// 處理 roomNameif (current.roomName === prev.roomName) {roomNameCount++// 當前行不顯示,rowspan 設為 0roomNameSpanMap.set(i, { rowspan: 0, colspan: 0 })} else {// 新的 roomName,設置 rowspan 為累計的數量roomNameSpanMap.set(i - 1, { rowspan: roomNameCount, colspan: 1 })roomNameCount = 1 // 重置計數roomNameSpanMap.set(i, { rowspan: 1, colspan: 1 }) // 當前行可能是新的開始}// 處理 categoryNameif (current.categoryName === prev.categoryName) {categoryNameCount++categoryNameSpanMap.set(i, { rowspan: 0, colspan: 0 })} else {categoryNameSpanMap.set(i - 1, { rowspan: categoryNameCount, colspan: 1 })categoryNameCount = 1categoryNameSpanMap.set(i, { rowspan: 1, colspan: 1 })}prevRoomName = current.roomNameprevCategoryName = current.categoryName}// 處理最后一行的 rowspanroomNameSpanMap.set(data.length - 1, { rowspan: roomNameCount, colspan: 1 })categoryNameSpanMap.set(data.length - 1, { rowspan: categoryNameCount, colspan: 1 })
}
const tableRowStyle = ({ row, rowIndex }) => {return {height: '40px','vertical-align': 'middle'}
}

style?

// 表格
/* 確保表格行高一致,避免合并后行高錯亂 */
:deep(.el-table .el-table__row) {/* 不要設置height/min-height/line-height,自動撐開 */vertical-align: middle !important;
}:deep(.el-table__cell) {vertical-align: middle !important;
}/* 確保表格容器有足夠的空間 */
:deep(.table-container) {height: auto;/* 自動高度 */overflow: auto;/* 如果內容超出,顯示滾動條 */
}

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

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

相關文章

UI前端與數字孿生融合案例:智慧城市的智慧停車引導系統

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;停車難的 “城市痛點” 與數字孿生的破局之道當司機在商圈繞圈 30 分鐘仍…

java+vue+SpringBoot集團門戶網站(程序+數據庫+報告+部署教程+答辯指導)

源代碼數據庫LW文檔&#xff08;1萬字以上&#xff09;開題報告答辯稿ppt部署教程代碼講解代碼時間修改工具 技術實現 開發語言&#xff1a;后端&#xff1a;Java 前端&#xff1a;vue框架&#xff1a;springboot數據庫&#xff1a;mysql 開發工具 JDK版本&#xff1a;JDK1.8 數…

【Docker基礎】Docker-compose從入門到精通:安裝指南與核心命令全解析

目錄 前言 1 Docker-compose核心概念解析 1.1 什么是Docker-compose&#xff1f; 1.2 典型應用場景 2 Docker-compose離線安裝詳解 2.1 離線安裝背景與優勢 2.2 詳細安裝步驟 步驟1&#xff1a;獲取離線安裝包 步驟2&#xff1a;文件部署與權限設置 步驟3&#xff1a…

面試150 被圍繞的區域

思路 使用DFS&#xff0c;將所有與邊界相連的’O’都修改為‘#’,然后遍歷數組&#xff0c;如果是遇到’#‘修改為’O’,如果是’O’修改為’X’。 class Solution:def solve(self, board: List[List[str]]) -> None:"""Do not return anything, modify boar…

(數據結構)線性表(上):SeqList 順序表

線性表&#xff08;上&#xff09;&#xff1a;Seqlist 順序表基本了解線性表順序表靜態順序表動態順序表編寫動態順序表項目結構基礎結構初始化尾插頭插尾刪頭刪查找指定位置pos之前插入數據刪除指定位置pos的數據銷毀完整代碼SeqLIst.hSeqLIst.ctest.c算法題移除元素刪除有序…

WebStorm vs VSCode:前端圈的「豆腐腦甜咸之爭」

目錄 一、初識兩位主角&#xff1a;老司機與新勢力 二、開箱體驗&#xff1a;是「拎包入住」還是「毛坯房改造」 三、智能提示&#xff1a;是「知心秘書」還是「百度搜索」 四、調試功能&#xff1a;是「CT 掃描儀」還是「聽診器」 五、性能表現&#xff1a;是「重型坦克」…

C#將類屬性保存到Ini文件方法(利用拓展方法,反射方式獲取到分組名和屬性名稱屬性值)

前言&#xff1a;最近學習C#高級課程&#xff0c;里面學到了利用反射和可以得到屬性的特性、屬性名、屬性值&#xff0c;還有拓展方法&#xff0c;一直想將學到的東西利用起來&#xff0c;剛好今天在研究PropertyGrid控件時&#xff0c;想方便一點保存屬性值到配置文件&#xf…

kafka 單機部署指南(KRaft 版本)

目錄環境準備JDK安裝下載jdkjdk安裝kafka 部署kafka 下載kafka 版本號結構解析kafka 安裝下載和解壓安裝包配置 KRaft 模式格式化存儲目錄啟動kafkaKafka 配置為 systemd 服務注意事項調整 JVM 內存參數Kafka KRaft 版本&#xff08;即 Kafka 3.0 及更高版本&#xff09;使用 K…

websocket案例 599足球比分

目標地址:aHR0cHM6Ly93d3cuNTk5LmNvbS9saXZlLw接口:打開控制臺 點websocket 刷新頁面 顯示分析:不寫理論了關于websocket 幾乎發包位置都是下方圖片 不管抖音還是快手 等平臺這里在進行 new WebSocket 后 是要必須走一步的 也就是 new WebSocket().onopen() 也就是onopen 進行向…

【后端】Linux系統發布.NetCore項目

目錄 1.設置全球化不變模式 1.發布到文件 3. 配置為服務 3.1.添加服務 3.2.添加執行權限 3.3.啟動服務 4.訪問 1.設置全球化不變模式 雙擊所需項目&#xff0c;設置全球化不變模式 <!-- 設置全球化不變模式 --><RuntimeHostConfigurationOption>System.Globa…

CMU-15445(2024fall)——PROJECT#0

題目介紹 這是題目原文。 注意&#xff1a;在拉取項目的時候需要注意拉取2024fall的Tag&#xff0c;本人血淚教訓&#xff01; 本題是關于HyperLogLog的具體實現&#xff0c;其介紹可以看這個視頻進行了解。簡單來說HyperLogLog可以在一個非常小的固定內存下&#xff08;一般…

使用微信免費的圖像處理接口,來開發圖片智能裁剪和二維碼/條碼識別功能,爽歪歪

大家好&#xff0c;我是小悟。 1、圖片智能裁剪 我們先來了解一下圖片智能裁剪。圖片智能裁剪聚焦于數字圖像的智能化處理。AI技術的引入徹底改變了傳統依賴人工框選的裁剪模式。 通過深度學習模型自動識別圖像主體&#xff08;人物、商品等&#xff09;&#xff0c;能在極短時…

【代碼隨想錄】+ leetcode hot100:棧與隊列算法專題總結、單調棧

大家好&#xff0c;我是此林。 今天分享的是【代碼隨想錄】棧與隊列算法專題總結&#xff0c;分享刷算法的心得體會。 1. 用棧實現隊列、用隊列實現棧 232. 用棧實現隊列 - 力扣&#xff08;LeetCode&#xff09; 225. 用隊列實現棧 - 力扣&#xff08;LeetCode&#xff09;…

《5分鐘開發訂單微服務!飛算JavaAI實戰:IDEA插件安裝→空指針修復→K8s部署全流程》

目錄 40倍提升開發效能的秘密武器 一、為什么選擇飛算JavaAI&#xff1f;?編輯 二、IDEA插件安裝三步曲&#xff08;極簡版&#xff09; 步驟1&#xff1a;安裝插件&#xff08;30秒完成&#xff09; 步驟2&#xff1a;賬號登錄&#xff08;2種方式任選&#xff09; 方式…

SQL注入基礎嘗試

進入網址&#xff0c;測試正常回顯和出錯畫面http://1bcf75af-6e69-4f78-ac71-849fb8cde1b5.node5.buuoj.cn/Less-2/? id1用特殊符號判斷注入點判斷其類型類型為數字型&#xff0c;order by判斷列數當數字為4時候報錯而3不報錯&#xff0c;由此推斷列數為3&#xff0c;接著測試…

[Dify] -進階4-在 Dify 中實現 PDF 文檔問答功能全流程

隨著業務需求增加,AI 應用常遇到讓模型“讀懂”PDF并回答問題的場景。借助 Dify 的 RAG(Retrieval?Augmented Generation)能力,我們可以構建一個“ChatPDF”式的互動問答機器人。本文詳細講解從環境搭建、PDF 上傳、文本抽取、向量檢索到問答部署的完整流程。 一、技術棧與…

【EPLAN 2.9】許可證xx成功卻顯示紅色叉,無法啟動

問題現象&#xff1a; 無法啟動。 原因&#xff1a;通過mstsc遠程桌面連接會占用顯卡&#xff0c;導致調用顯卡的軟件無法成功。參考&#xff1a;Windows自帶遠程桌面(mstsc)在遠程時無法啟動&#xff08;打開&#xff09;某些應用&#xff08;軟件&#xff09;的解決辦法 編寫…

Oracle ADG 一鍵自動化搭建腳本

前言在 Oracle 數據庫高可用架構中&#xff0c;Active Data Guard (ADG) 是保障數據安全和業務連續性的核心方案。然而傳統 ADG 搭建涉及數十項復雜配置&#xff08;監聽、TNSNAMES、參數文件、密碼文件、日志傳輸、應用服務等&#xff09;&#xff0c;步驟繁瑣且易錯&#xff…

某郵生活旋轉驗證碼識別

注意,本文只提供學習的思路,嚴禁違反法律以及破壞信息系統等行為,本文只提供思路 如有侵犯,請聯系作者下架 本文識別已同步上線至OCR識別網站: http://yxlocr.nat300.top/ocr/other/30 旋轉驗證碼數據集如下: 看起來很像頂象的,都有著綠邊干擾,那其實思路也能簡單了,…

基于Android的景點旅游信息系統App

項目介紹用戶分為普通用戶和管理員兩種角色。 1.管理員有用戶管理、景點管理、評論管理功能。 2.用戶管理包括查看已注冊用戶列表、刪除用戶&#xff1b; 3.景點管理包括增加景點信息、修改景點信息、刪除景點信息、將景點設為推薦&#xff1b; 4.評論管理包括查看評論內容、刪…