Vue使用el-table給每一行數據上面增加一行自定義合并行

// template
<template><el-table:data="flattenedData":span-method="objectSpanMethod"borderclass="custom-header-table"style="width: 100%"ref="myTable":height="'60vh'"><!-- 訂單詳情列 --><el-table-column label="訂單詳情" width="300"><template #default="{ row }"><!-- 額外行 --><div v-if="row.isExtraRow" class="extra-row"><div class="content"><span class="row_text">訂單號:{{ row.orderNo }}</span><el-buttontype="text"size="mini"@click="copyOrderNo(row.orderNo, '訂單號')"class="copy-btn">復制</el-button><span class="row_text">下單時間:{{ row.createTime }}</span><span class="row_text">企業名稱:{{ row.contact }}</span><span class="row_text">報告單位:{{ row.reportUnitAddress }}</span></div><span class="statistic"><el-statisticv-if="row.tradeStatus == 11"format="HH:mm:ss":value="row.remainingTime"time-indices><template slot="suffix"><span class="color">后自動關閉</span></template></el-statistic></span></div><!-- 商品行 --><div v-else class="cell_box"><div class="flex"><el-imageclass="avatar":src="row.serveImageUrl":preview-src-list="[row.serveImageUrl]"></el-image><div class="name"><div class="flex"><el-tagtype="danger"size="small"v-if="row.isUrgent == 1">加急</el-tag><el-tooltipeffect="dark":content="row.serveName"placement="top"><spanclass="name-text":class="row.isUrgent == 1? 'title': 'title2'">{{ row.serveName }}</span></el-tooltip></div><div class="name-desc title2">檢測用途:{{ row.testUse }}</div></div></div></div></template></el-table-column><!-- 下單數量列 --><el-table-column label="下單數量" width="200"><template #default="{ row }"><div class="cell_box txt" v-if="!row.isExtraRow">{{ row.orderNumber || '-' }}</div></template></el-table-column><!-- 實付金額列 --><el-table-column label="實付金額" width="200"><template #default="{ row }"><div class="cell_box txt" v-if="!row.isExtraRow">¥{{ row.totalPrice || '0.00' }}</div></template></el-table-column><!-- 訂單狀態列 --><el-table-column label="訂單狀態"><template #default="{ row }"><div class="cell_box" v-if="!row.isExtraRow"><!-- 待付款 --><template v-if="row.tradeStatus == 11"><el-tag size="small" type="danger">待付款</el-tag></template><templatev-if="row.tradeStatus == 20 &&row.acceptStatus == 0"><el-tag size="small" type="warning">受理中</el-tag></template><templatev-if="row.tradeStatus == 20 &&row.acceptStatus == 1"><el-tag size="small" type="success">服務中</el-tag></template><template v-if="row.tradeStatus == 40"><el-tag size="small"> 已完成 </el-tag></template><templatev-if="row.tradeStatus == -1 ||row.tradeStatus == -2"><el-tag size="small" type="info">已關閉</el-tag></template></div></template></el-table-column><!-- 操作列 --><el-table-column label="操作" width="150px"><template #default="{ row }"><divclass="cell_box operations"v-if="!row.isExtraRow"><el-button@click="handlePayment(row)"type="text"size="small"class="payBtn"v-if="row.tradeStatus == 11">掃碼付款</el-button><el-buttonclass="btns"type="text"size="small"@click="handleDetails(row)">訂單詳情</el-button><el-buttonclass="btns"type="text"size="small"@click="handleClose(row)"v-if="row.tradeStatus == 11">關閉訂單</el-button></div></template></el-table-column></el-table></template>
// datadata() {return {// 原始數據tableData: [],showCheckboxes: false}
}
// computed
computed: {// 實際數據flattenedData() {let result = []this.tableData.forEach((order) => {// 計算剩余時間const remainingTime = (() => {const currentTime = new Date(order.systemTime).getTime()const deadline = new Date(order.deadlineCloseTime).getTime()return currentTime >= deadline? 0: deadline - currentTime + new Date().getTime() // 加上當前時間})()// 1. 額外行(訂單信息)result.push({isExtraRow: true,orderNo: order.orderNo, // 使用實際訂單號createTime: order.createTime,contact: order.contact,tradeStatus: order.tradeStatus,reportUnitAddress: order.reportUnitAddress,remainingTime: remainingTime// orderData: order,      // 存儲完整訂單數據(可選)})// 2. 商品行(從 orderServeList 解析)try {const serveList = JSON.parse(order.orderServeList || '[]')serveList.forEach((serveItem) => {result.push({...serveItem, // 商品信息isExtraRow: false,orderId: order.id, // 關聯訂單IDtradeStatus: order.tradeStatus,acceptStatus: order.acceptStatus// orderData: order // 關聯訂單數據(可選)})})} catch (e) {console.error('解析 orderServeList 失敗:', e)}})console.log(result, 'result')return result}
}
// methods
methods: {objectSpanMethod({ row, column, rowIndex, columnIndex }) {if (row.isExtraRow) {// 動態計算列數(需確保 el-table 已渲染)const columns = this.$refs.myTable?.columns?.lengthif (columnIndex === 0) {return {rowspan: 1,colspan: columns // 動態跨所有列}} else {return {rowspan: 0,colspan: 0}}}return { rowspan: 1, colspan: 1 }},copyOrderNo(content, title) {const textArea = document.createElement('textarea')textArea.value = content// 隱藏 textarea,并防止它影響頁面布局textArea.style.position = 'fixed'textArea.style.opacity = '0'textArea.style.left = '-9999px'textArea.style.top = '0'document.body.appendChild(textArea)textArea.select()try {const successful = document.execCommand('copy')if (successful) {this.$message.success(title + '已復制!')} else {this.$message.error('復制失敗,請手動復制')}} catch (err) {this.$message.error('復制失敗,請手動復制')}document.body.removeChild(textArea)}}
// style
<style lang="scss" scoped>/deep/ .custom-header-table {.el-table__header {th {background: #f6f6f6 !important;height: 20px;font-family: PingFangSC, PingFang SC;font-weight: 500;font-size: 14px;color: #515a6e;line-height: 20px;text-align: left;font-style: normal;padding-left: 10px !important;}}}/* 額外行樣式 */.extra-row {background-color: #e2ebfe;padding: 10px;font-weight: bold;display: flex;justify-content: space-between;align-items: center;gap: 20px;.content {flex: 1;white-space: nowrap; // 使文本不換行顯示overflow: hidden;text-overflow: ellipsis; // 顯示省略號}.statistic {width: 170px;/deep/ .number {color: #ff4131 !important;}}}/* 不影響正常行 *//deep/ .el-table__body tr:not(.extra-row) td {padding: 0; /* 正常行的 padding 保持不變 */}/deep/ .el-table .cell {padding: 0; /* 正常行的 padding 保持不變 */}/deep/ .cell {padding-left: 0 !important;}.copy-btn {font-size: 14px;margin-left: 10px;margin-left: -5px;color: #1464df;}.btns {color: #1464df;}.cell_box {padding: 10px;}.flex {display: flex;.avatar {width: 92px;height: 91px;margin-left: 10px;}/deep/ .el-tag {margin-right: 5px;}.name {display: flex;flex-direction: column;justify-content: space-around;margin-left: 10px;&-text {height: 22px;font-family: PingFangSC, PingFang SC;font-weight: 500;font-size: 16px;color: #262626;line-height: 22px;text-align: left;font-style: normal;}&-desc {height: 20px;font-family: PingFangSC, PingFang SC;font-weight: 400;font-size: 14px;color: #999999;line-height: 20px;text-align: left;font-style: normal;}}}.title {max-width: 150px;white-space: nowrap; // 使文本不換行顯示overflow: hidden;text-overflow: ellipsis; // 顯示省略號}.title2 {max-width: 180px;white-space: nowrap; // 使文本不換行顯示overflow: hidden;text-overflow: ellipsis; // 顯示省略號}.row_text {margin: 0 8px;}.color {color: #ff4131;}.payBtn {color: orange;}.txt {font-family: PingFangSC, PingFang SC;font-weight: 400;font-size: 14px;color: #3c3c3c;text-align: left;font-style: normal;}.operations {display: flex;flex-direction: column;/deep/ .el-button + .el-button,.el-checkbox.is-bordered + .el-checkbox.is-bordered {margin-left: 0 !important;}}
</style>

如何需要合并同一個訂單下的數據的操作列

methods: {objectSpanMethod({ row, column, rowIndex, columnIndex }) {if (row.isExtraRow) {// 處理額外行(訂單信息行)const columns = this.$refs.myTable?.columns?.length;if (columnIndex === 0) {return {rowspan: 1,colspan: columns // 動態跨所有列};} else {return {rowspan: 0,colspan: 0};}} else {// 處理商品行if (columnIndex === 4) { // 操作列是第5列(從0開始計數)// 找到當前訂單的所有商品行const orderRows = this.getOrderRows(row.orderId);const firstRowIndex = this.findFirstRowIndex(row.orderId);// 如果是當前訂單的第一個商品行,則合并行數if (rowIndex === firstRowIndex) {return {rowspan: orderRows.length,colspan: 1};} else {return {rowspan: 0,colspan: 0};}}}return { rowspan: 1, colspan: 1 };},// 獲取指定訂單的所有商品行getOrderRows(orderId) {return this.flattenedData.filter(item => !item.isExtraRow && item.orderId === orderId);},// 找到指定訂單的第一個商品行的索引findFirstRowIndex(orderId) {return this.flattenedData.findIndex(item => !item.isExtraRow && item.orderId === orderId);}
}

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

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

相關文章

vue項目使用html2canvas和jspdf將頁面導出成PDF文件

一、需求&#xff1a; 頁面上某一部分內容需要生成pdf并下載 二、技術方案&#xff1a; 使用html2canvas和jsPDF插件 三、js代碼 // 頁面導出為pdf格式 import html2Canvas from "html2canvas"; import jsPDF from "jspdf"; import { uploadImg } f…

大模型LLM表格報表分析:markitdown文件轉markdown,大模型markdown統計分析

整體流程&#xff1a;用markitdown工具文件轉markdown&#xff0c;然后大模型markdown統計分析 markitdown https://github.com/microsoft/markitdown 在線體驗&#xff1a;https://huggingface.co/spaces/AlirezaF138/Markitdown 安裝&#xff1a; pip install markitdown…

Linux 第二講 --- 基礎指令(二)

前言 這是基礎指令的第二部分&#xff0c;但是該部分的講解會大量使用到基礎指令&#xff08;一&#xff09;的內容&#xff0c;為了大家的觀感&#xff0c;如果對Linux的一些基本指令不了解的話&#xff0c;可以先看基礎指令&#xff08;一&#xff09;&#xff0c;同樣的本文…

python格式化字符串漏洞

什么是python格式化字符串漏洞 python中&#xff0c;存在幾種格式化字符串的方式&#xff0c;然而當我們使用的方式不正確的時候&#xff0c;即格式化的字符串能夠被我們控制時&#xff0c;就會導致一些嚴重的問題&#xff0c;比如獲取敏感信息 python常見的格式化字符串 百…

LLaMA-Factory雙卡4090微調DeepSeek-R1-Distill-Qwen-14B醫學領域

unsloth單卡4090微調DeepSeek-R1-Distill-Qwen-14B醫學領域后&#xff0c;跑通一下多卡微調。 1&#xff0c;準備2卡RTX 4090 2&#xff0c;準備數據集 醫學領域 pip install -U huggingface_hub export HF_ENDPOINThttps://hf-mirror.com huggingface-cli download --resum…

React Hooks: useRef,useCallback,useMemo用法詳解

1. useRef&#xff08;保存引用值&#xff09; useRef 通常用于保存“不會參與 UI 渲染&#xff0c;但生命周期要長”的對象引用&#xff0c;比如獲取 DOM、保存定時器 ID、WebSocket等。 新建useRef.js組件&#xff0c;寫入代碼&#xff1a; import React, { useRef, useSt…

Spring AI 結構化輸出詳解

一、Spring AI 結構化輸出的定義與核心概念 Spring AI 提供了一種強大的功能&#xff0c;允許開發者將大型語言模型&#xff08;LLM&#xff09;的輸出從字符串轉換為結構化格式&#xff0c;如 JSON、XML 或 Java 對象。這種結構化輸出能力對于依賴可靠解析輸出值的下游應用程…

THM Billing

1. 信息收集 (1) Nmap 掃描 bashnmap -T4 -sC -sV -p- 10.10.189.216 輸出關鍵信息&#xff1a; PORT STATE SERVICE VERSION22/tcp open ssh OpenSSH 8.4p1 Debian 5deb11u380/tcp open http Apache 2.4.56 (Debian) # MagnusBilling 應用3306/tcp open …

布局決定終局:基于開源AI大模型、AI智能名片與S2B2C商城小程序的戰略反推思維

摘要&#xff1a;在商業競爭日益激烈的當下&#xff0c;布局與終局預判成為企業成功的關鍵要素。本文探討了布局與終局預判的智慧性&#xff0c;強調其雖無法做到百分之百準確&#xff0c;但能顯著提升思考能力。終局思維作為重要戰略工具&#xff0c;并非一步到位的戰略部署&a…

貪心算法 day08(加油站+單調遞增的數字+壞了的計算機)

目錄 1.加油站 2.單調遞增的數字 3.壞了的計算器 1.加油站 鏈接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; gas[index] - cost[index]&#xff0c;ret 表示的是在i位置開始循環時剩余的油量 a到達的最大路徑假設是f那么我們可以得出 a b …

【技術派部署篇】云服務器部署技術派

1 環境搭建 1.1 JDK安裝 # ubuntu sudo apt update # 更新apt apt install openjdk-8-jdk # 安裝JDK安裝完畢之后&#xff0c;執行 java -version 命令進行驗證&#xff1a; 1.2 Maven安裝 cd ~ mkdir soft cd soft wget https://dlcdn.apache.org/maven/maven-3/3.8.8/bina…

Linux:35.其他IPC和IPC原理+信號量入門

通過命名管道隊共享內存的數據發送進行保護的bug&#xff1a; 命名管道掛掉后&#xff0c;進程也掛掉了。 6.systemV消息隊列 原理:進程間IPC:原理->看到同一份資源->維護成為一個隊列。 過程&#xff1a; 進程A,進程B進行通信。 讓操作系統提供一個隊列結構&#xff0c;…

【數據結構】紅黑樹超詳解 ---一篇通關紅黑樹原理(含源碼解析+動態構建紅黑樹)

一.什么是紅黑樹 紅黑樹是一種自平衡的二叉查找樹&#xff0c;是計算機科學中用到的一種數據結構。1972年出現&#xff0c;最初被稱為平衡二叉B樹。1978年更名為“紅黑樹”。是一種特殊的二叉查找樹&#xff0c;紅黑樹的每一個節點上都有存儲表示節點的顏色。每一個節點可以是…

2024年第十五屆藍橋杯CC++大學A組--成績統計

2024年第十五屆藍橋杯C&C大學A組--成績統計 題目&#xff1a; 動態規劃&#xff0c; 對于該題&#xff0c;考慮動態規劃解法&#xff0c;先取前k個人的成績計算其方差&#xff0c;并將成績記錄在數組中&#xff0c;記錄當前均值&#xff0c;設小藍已檢查前i-1個人的成績&…

vue2使用ezuikit-js播放螢石視頻

需求&#xff1a;需要在大屏上播放螢石視頻&#xff0c;用到官方的ezuikit-js插件實現&#xff0c;并實現視頻播放切換功能。有個問題至今沒有解決&#xff0c;就是螢石視頻的寬高是固定的&#xff0c;不會根據大屏縮放進行自適應。我這邊做了簡單的刷新自適應。 1.下載ezuikit…

愛普生TG-5510CA和TG-5510CB晶振成為服務器中的理想之選

在數字化時代&#xff0c;服務器作為數據存儲、處理與傳輸的核心樞紐&#xff0c;其性能的優劣直接影響著整個信息系統的運行效率與穩定性。從企業內部的數據中心到云計算服務提供商的大規模集群&#xff0c;服務器需要應對海量數據的高速處理與頻繁交互。而在服務器復雜精密的…

使用opentelemetry 可觀測監控springboot應用的指標、鏈路實踐,使用zipkin展示鏈路追蹤數據,使用grafana展示指標

1.安裝docker&#xff0c;docker-compose &#xff08;1&#xff09;安裝依賴包 yum install -y yum-utils device-mapper-persistent-data lvm22.2、部署dockertar xvf docker-20.10.19.tgz cp docker/* /usr/bin/vim /usr/lib/systemd/system/docker.service[Unit] Descript…

5. 藍橋公園

題目描述 小明喜歡觀景&#xff0c;于是今天他來到了藍橋公園。 已知公園有 N 個景點&#xff0c;景點和景點之間一共有 M 條道路。小明有 Q 個觀景計劃&#xff0c;每個計劃包含一個起點 stst 和一個終點 eded&#xff0c;表示他想從 stst 去到 eded。但是小明的體力有限&am…

虛幻基礎:碰撞幀運算

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄 碰撞碰撞盒線段檢測 幀運算&#xff1a;每個程序流就是一幀的計算結果速度過快時(10000)&#xff0c;導致每幀移動過大(83)&#xff0c;從而導致碰撞盒錯過而沒有碰撞速度快的碰撞要用線段檢測 碰撞 碰撞盒 線段檢…

Qt 入門 3 之對話框 QDialog

Qt 入門 3 之對話框 QDialog 本文從以下幾點分開講述&#xff1a; - 對話框的基本原理介紹 - 兩種不同類型的對話框 - 一個由多個窗口組成并且窗口間可以相互切換的程序 1.模態和非模態對話框 QDialog 類是所有對話框窗口類的基類。對話框窗口是一個經常用來完成短小任務或者…