小程序内表格合并功能实现—行合并
功能介绍:支付宝小程序手写表格实现行内合并,依据动态数据自动计算每次需求合并的值,本次记录行内合并,如果列内合并,同理即可实现
前端技术:grid布局 display:grid
先看实现效果:

axml:
<view class="leasePlanView" style="padding-top:{{systemInfo.statusBarHeight + systemInfo.titleBarHeight + 15}}px"><view class="tableInfo por"><view class="head com_flex_between"><view a:for="{{ tableHead }}" class="item table-item com_font_26">{{item.title}}</view></view><view class="tableContent grid-container"><view a:for="{{ order_detail.billList }}" a:for-index="idx" class="grid-row"><view class="grid-cell com_flex_center">{{item.term}}</view><view class="grid-cell com_flex_center">内容</view><view class="grid-cell com_flex_center {{mergeInfo[idx].shouldMerge ? 'merge-cell-' + mergeInfo[idx].mergeRows : ''}} {{(!mergeInfo[idx].showNormal && !mergeInfo[idx].shouldMerge) ? 'hide-cell' : ''}}"><block a:if="{{mergeInfo[idx].showNormal}}"><view class="com_color_third">-</view></block><block a:elif="{{mergeInfo[idx].shouldMerge}}"><view class="com_flex_center_column com_font_20">我是合并数据</view></block></view><view class="grid-cell com_flex_center_column">内容</view></view></view></view>
</view>
js:
最重要的处理逻辑是processMergeData这个方法,根据实际需求可自行修改,只要是表格合并,处理逻辑都是相通的。
Page({data: {tableHead: [{title: '第一列'},{title: '第二列'},{title: '第三列'},{title: '第四列'}],mergeInfo: [], // 存储合并信息order_detail:{billList:[{term: '1',discountAmount: '',},{term: '2',discountAmount: '',},{term: '3',discountAmount: '100',},{term: '4',discountAmount: '100',},{term: '5',discountAmount: '200',},{term: '6',discountAmount: '200',},{term: '7',discountAmount: '300',},{term: '8',discountAmount: '300',},{term: '9',discountAmount: '300',},{term: '10',discountAmount: '',},{term: '11',discountAmount: '',},{term: '12',discountAmount: '',}]}},onLoad(query) {this.processMergeData();},// 处理合并数据processMergeData() {const { billList } = this.data.order_detail;const mergeInfo = [];// 遍历数据计算需要合并的行for (let i = 0; i < billList.length; i++) {const current = billList[i];if (current.discountAmount === null || !current.discountAmount) {// discountAmount 为 null 时正常显示mergeInfo[i] = {shouldMerge: false,mergeRows: 1,showNormal: true // 添加标记,表示需要正常显示};continue;}console.log(mergeInfo[i],'mergeInfo[i]mergeInfo[i]')// 如果当前行已经被标记为合并,跳过if (mergeInfo[i]) continue;let mergeCount = 1;// 向下查找相同 discountAmount 值的行for (let j = i + 1; j < billList.length; j++) {if (billList[j].discountAmount === current.discountAmount) {mergeCount++;// 标记被合并的行mergeInfo[j] = {shouldMerge: false,mergeRows: 0,showNormal: false};} else {break;}}// 标记合并起始行mergeInfo[i] = {shouldMerge: mergeCount > 1,mergeRows: mergeCount,showNormal: false};}console.log(mergeInfo,'mergeInfo')this.setData({ mergeInfo });}
});
css实现:
重点在grid布局和动态合并行数
.leasePlanView {width: 100%;min-height: 100vh;
}.bill_box{padding: 12rpx 16rpx 0;
}
.tableInfo {padding: 30rpx 16rpx;width: 710rpx;margin: -32rpx auto 0;background-color: white;border-radius: 20rpx;z-index: 2;
}.tableTitle {margin-bottom: 16rpx;padding: 0 14rpx;height: 32rpx;font-family: PingFangSC-Medium, PingFang SC;
}.tableInfo .head {background: rgba(255, 68, 36, 0.05);border-radius: 20rpx 20rpx 0rpx 0rpx;margin-top: 28rpx;border: 1rpx solid #E8E8E8;border-bottom: none;
}
.table-item{height: 85rpx;width: 169rpx;text-align: center;font-family: PingFangSC-Medium, PingFang SC;line-height: 85rpx;
}
.tableInfo .item {font-weight: 500;color: #000000;
}/* 表格边框实现 */
.tableContent{border: 1rpx solid #E8E8E8;display: grid;grid-template-columns: repeat(1, 1fr);
}
.border-bottom{border-bottom: 1rpx solid #E8E8E8;
}
.border-left{border-left: 1rpx solid #E8E8E8;
}
.grid-row:last-child .grid-cell{border-bottom: none;
}
.amount:first-child{border-left: none;
}.returnDate .bottom {font-family: PingFangSC-Regular, PingFang SC;font-weight: 400;color: #666666;line-height: 22rpx;margin-top: 4rpx;
}
.tableInfo .amount {font-weight: 400;flex: auto;position: relative;
}
.tableInfo .totalAmount{width: 169rpx;height: 85rpx;text-align: center;
}.grid-container {display: grid;grid-template-columns: repeat(4, 1fr);border: 1rpx solid #E8E8E8;
}.grid-row {display: contents;
}.grid-cell {padding: 10rpx;border-bottom: 1rpx solid #E8E8E8;border-left: 1rpx solid #E8E8E8;height: 85rpx;text-align: center;
}.grid-cell:first-child {border-left: none;
}/* 动态合并行数的样式 */
.merge-cell-2 {grid-row: span 2;height: 170rpx;
}.merge-cell-3 {grid-row: span 3;height: 255rpx;
}.merge-cell-4 {grid-row: span 4;height: 340rpx;
}.hide-cell {display: none;
}
相关文章:
小程序内表格合并功能实现—行合并
功能介绍:支付宝小程序手写表格实现行内合并,依据动态数据自动计算每次需求合并的值,本次记录行内合并,如果列内合并,同理即可实现 前端技术:grid布局 display:grid 先看实现效果: axml&…...
SSE协议介绍和python实现
概述: SSE(Server-Sent Events)协议是一种允许服务器向客户端实时推送更新的技术,基于HTTP协议,常用于实时数据推送特点: 单向通信:服务器向客户端推送数据,客户端无法发送数据。基…...
甘肃旅游服务平台+论文源码视频演示
4 系统设计 4.1系统概要设计 甘肃旅游服务平台并没有使用C/S结构,而是基于网络浏览器的方式去访问服务器,进而获取需要的数据信息,这种依靠浏览器进行数据访问的模式就是现在用得比较广泛的适用于广域网并且没有网速限制要求的小程序结构&am…...
Spring Boot 3虚拟线程的使用
在Spring Boot非Web应用中,使用虚拟线程时程序提前终止的问题及解决方案,可以通过以下步骤深入理解和验证: 问题根源分析 JVM退出机制 Java中,当所有非守护线程结束时,JVM会立即退出。即使存在正在运行的守护线程&…...
3、pytest实现参数化
在 pytest 中,参数化(parametrization)是一种强大的功能,可以让你用不同的输入数据重复执行同一个测试函数。这种功能非常有用,可以帮助你显著减少重复代码并提高测试覆盖率。 参数化的主要作用是: 测试多…...
【解决】Linux命令报错:Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64
报错命令 yum install zabbix-web-mysql-scl zabbix-apache-conf-scl centos使用scl切换软件版本时提示Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64 报错原因 CentOS7的SCL源在2024年6月30日停止维护了。 当scl源里面默认使用了centos官方的地址&#x…...
WebRTC中音视频服务质量QoS之FEC+NACK调用流程
WebRTC中音视频服务质量QoS之FECNACK调用流程 WebRTC中音视频服务质量QoS之FECNACK调用流程 WebRTC中音视频服务质量QoS之FECNACK调用流程前言一、WebRTC中FEC基础原理1. FEC基础操作 异或操作XOR2、 FEC中 行向和纵向 计算3、 WebRTC中 媒体包分组和生成FEC的包数① kFecRateT…...
神经网络知识点整理
目录 一、深度学习基础与流程 二、神经网络基础组件 三、卷积神经网络(CNN)编辑 四、循环神经网络(RNN)与LSTM 五、优化技巧与调参 六、应用场景与前沿编辑 七、总结与展望编辑 一、深度学习基础与流程 机器学习流…...
远程办公新体验:用触屏手机流畅操作电脑桌面
在数字化浪潮的推动下,远程办公已从“应急选项”转变为职场常态。无论是居家隔离、差旅途中,还是咖啡厅临时办公,高效连接公司电脑的需求从未如此迫切。然而,传统的远程控制软件常因操作复杂、画面卡顿或功能限制而影响效率。如今…...
【面试八股】:常见的锁策略
常见的锁策略 synchronized (标准库的锁不够你用了)锁策略和 Java 不强相关,其他语言涉及到锁,也有这样的锁策略。 1. 悲观锁,乐观锁(描述的加锁时遇到的场景) 悲观锁:预测接下来…...
【python】OpenCV—Hand Detection
文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、参考6、其它手部检测和手势识别的方案 更多有趣的代码示例,可参考【Programming】 1、功能描述 基于 opencv-python 和 mediapipe 进行手部检测 2、代码实现 导入必要的库函数 import cv2 import media…...
es6的100个问题
基础概念 解释 let、const 和 var 的区别。什么是块级作用域?ES6 如何实现它?箭头函数和普通函数的主要区别是什么?解释模板字符串(Template Literals)的用途,并举例嵌套变量的写法。解构赋值的语法是什么…...
【Git 常用指令速查表】
Git 常用指令速查表 Git 常用指令速查表目录1. 初始化仓库2. 提交代码流程3. 分支管理4. 远程仓库操作5. 撤销操作6. 查看状态与日志7. 其他实用指令完整操作示例常用场景速查表 Git 常用指令速查表 目录 初始化仓库提交代码流程分支管理远程仓库操作撤销操作查看状态与日志其…...
Flink中聚合算子介绍
前言 在flink api中,聚合算子是非常常用的。所谓的聚合就是在分组的基础上做比较计算的操作。下面通过几个简单案例来说明聚合算子的用法和注意事项。 聚合算子案例 因为flink的api操作流程比较固定,从获取执行环境》获取数据源》执行数据转换操作》输…...
【基础】Windows 中通过 VSCode 使用 GCC 编译调试 C++
准备 安装 VSCode 及 C 插件。通过 MSYS2 安装 MinGW-w64 工具链,为您提供必要的工具来编译代码、调试代码并配置它以使用IntelliSense。参考:Windows 中的 Linux 开发工具链 验证安装: gcc --version g --version gdb --version三个核心配…...
Web Services 简介
Web Services 简介 概述 Web Services 是一种网络服务技术,允许不同的应用程序通过互联网进行交互和数据交换。随着互联网的普及和发展,Web Services 已经成为企业级应用中不可或缺的一部分。本文将详细介绍 Web Services 的概念、特点、应用场景以及相关的技术架构。 什么…...
数据仓库 - 转转 - 一面凉经
面试流程 自我介绍 Python 中,如何在数据清洗过程中应对内存不够的情况 如何避免,在使用Pandas处理大规模数据时,经常会遇到“SettingWithCopyWarning”警告 在Hive中,当您使用动态分区功能进行数据插入时,可能会遇…...
2025跳槽学习计划
(1)编程基础: 目录学习资料Chttps://www.bilibili.com/video/BV1z64y1U7hs?spm_id_from333.1387.favlist.content.clickLinuxPytorchhttps://www.bilibili.com/video/BV1if4y147hS?spm_id_from333.1387.favlist.content.clickopencv数据结…...
算法 | 2024最新算法:鳑鲏鱼优化算法原理,公式,应用,算法改进研究综述,matlab代码
2024最新鳑鲏鱼优化算法(BFO)研究综述 鳑鲏鱼优化算法(Bitterling Fish Optimization, BFO)是2024年提出的一种新型群智能优化算法,受鳑鲏鱼独特的繁殖行为启发,通过模拟其交配、产卵和竞争机制进行全局优化。该算法在多个领域展现出优越性能,尤其在解决复杂非线性问题中…...
具身系列——Diffusion Policy算法实现CartPole游戏
代码原理分析 1. 核心思想 该代码实现了一个基于扩散模型(Diffusion Model)的强化学习策略网络。扩散模型通过逐步去噪过程生成动作,核心思想是: • 前向过程:通过T步逐渐将专家动作添加高斯噪声,最终变成…...
前端性能优化:深入解析哈希算法与TypeScript实践
/ 示例:开放寻址哈希表核心实现 class OpenAddressingHashTable<T> {private size: number;private keys: (string | null)[];private values: (T | null)[];private tombstone Symbol(Deleted);constructor(size: number 53) {this.size size;this.keys …...
知识就是力量——物联网应用技术
基础知识篇 一、常用电子元器件1——USB Type C 接口引脚详解特点接口定义作用主从设备关于6P引脚的简介 2——常用通信芯片CH343P概述特点引脚定义 CH340概述特点封装 3——蜂鸣器概述类型驱动电路原文链接 二、常用封装介绍贴片电阻电容封装介绍封装尺寸与功率关系࿱…...
(windows)conda虚拟环境下open-webui安装与启动
一、创建conda环境 重点强调下,如果用python pip安装,一定要选择python3.11系列版本,我选的3.11.9。 如果你的版本不是这个系列,将会出现一些未知的问题。 conda create -n open-webui python3.11 -y如下就创建好了 二、安装o…...
oracle密码过期 ORA-28001解决方案: the password has expired
** oracle密码过期 ORA-28001解决方案: the password has expired ** oracle 11g 默认密码过期时间为180天密码过期后,访问数据库会出现如下异常java.sql.SQLException: ORA-28001: the password has expired 查询密码过期设定 select * from dba profiles where…...
GStreamer —— 3.1、Qt+GStreamer制作多功能播放器,支持本地mp4文件、rtsp流、usb摄像头等(可跨平台,附源码)
🔔 GStreamer 相关音视频技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 运行效果...
六十天Linux从0到项目搭建(第十天)(系统调用 vs 库函数/进程管理的建模/为什么进程管理中需要PCB?/exec 函数/fork原理与行为详解)
1 系统调用 vs 库函数:本质区别与协作关系 核心区别 特性系统调用(System Call)库函数(Library Function)定义操作系统内核提供的 底层接口,直接操作硬件。封装系统调用的 高级函数,提供便捷功…...
资本运营:基于Python实现的资本运作模拟
基于Python实现的一个简单的资本运营框架; 企业生命周期演示:观察初创→成长→上市→并购全流程 行业对比分析:不同行业的财务特征和估值差异 资本运作策略:体验IPO定价、投资决策、并购整合等操作 市场动态观察ÿ…...
当EFISH-SBC-RK3576遇上区块链:物联网安全与可信数据网络
在工业物联网场景中,设备身份伪造与数据篡改是核心安全隐患。EFISH-SBC-RK3576 通过 硬件安全模块 区块链链上验证,实现设备身份可信锚定与数据全生命周期加密,安全性能提升10倍以上。 1. 安全架构:从芯片到链的端到端防…...
关于spark在yarn上运行时候内存的介绍
在YARN上运行Spark时,内存管理是性能调优的核心环节。以下是 Driver Memory、Executor Memory、堆内存(Heap Memory) 和 堆外内存(Off-Heap Memory) 的区别与配置方法,以及实际场景中的最佳实践:…...
分布式系统面试总结:3、分布式锁(和本地锁的区别、特点、常见实现方案)
仅供自学回顾使用,请支持javaGuide原版书籍。 本篇文章涉及到的分布式锁,在本人其他文章中也有涉及。 《JUC:三、两阶段终止模式、死锁的jconsole检测、乐观锁(版本号机制CAS实现)悲观锁》:https://blog.…...
