uniapp,小程序中实现文本“展开/收起“功能的最佳实践

news2025/7/13 16:14:49

文章目录

    • 示例
    • 需求分析
    • 实现思路
    • 代码实现
      • 1. HTML结构
      • 2. 数据管理
      • 3. 展开/收起逻辑
      • 4. CSS样式
    • 优化技巧
      • 1. 性能优化
      • 2. 防止事件冒泡
      • 3. 列表更新处理
    • 实际效果
    • 总结

在移动端应用开发中,文本内容的"展开/收起"功能是提升用户体验的常见设计。当列表项中包含大段文本内容时,默认只显示几行,并提供"展开"按钮让用户查看完整内容。今天我将分享如何在uniapp,小程序项目中优雅地实现这一功能。

示例

在这里插入图片描述

需求分析

在一个内容列表页面中,我们希望实现以下功能:

  1. 默认情况下,每个列表项的内容最多显示两行
  2. 超过两行的内容被隐藏,并显示"展开"按钮
  3. 点击"展开"按钮后,显示全部内容,按钮变为"收起"
  4. 点击"收起"按钮后,恢复到只显示两行的状态

实现思路

实现这个功能主要涉及三个方面:

  1. 数据管理:追踪每个列表项的展开状态
  2. 样式控制:通过CSS控制文本显示的行数
  3. 交互逻辑:处理展开/收起按钮的点击事件

让我们一步步来看具体实现:

代码实现

1. HTML结构

首先,我们需要设计适当的HTML结构来容纳内容和按钮:

<view class="content-wrapper">
    <!-- 内容区域,绑定展开状态的类 -->
    <view 
        class="content-text" 
        :class="{'expanded': expandedItems[item.id]}"
    >
        {{ item.content }}
    </view>
    
    <!-- 仅当内容超过一定长度时显示按钮 -->
    <text 
        v-if="item.content && item.content.length > 50" 
        class="expand-button"
        @click.stop="toggleExpand(item.id)"
    >
        {{ expandedItems[item.id] ? '收起' : '展开' }}
    </text>
</view>

2. 数据管理

在Vue组件的data中,我们使用一个对象来存储每个列表项的展开状态:

data() {
    return {
        // 其他数据...
        expandedItems: {} // 用对象存储每个列表项的展开状态
    }
}

3. 展开/收起逻辑

然后,我们需要实现切换展开状态的方法:

methods: {
    // 切换展开状态
    toggleExpand(id) {
        // 使用Vue的$set方法确保响应式更新
        this.$set(this.expandedItems, id, !this.expandedItems[id]);
    },
    
    // 其他方法...
    
    // 当列表数据刷新时,重置展开状态
    resetExpandStatus() {
        this.expandedItems = {};
    }
}

4. CSS样式

最关键的部分是使用CSS来控制文本的显示行数:

.content-text {
    /* 基础样式 */
    font-size: 30rpx;
    line-height: 1.6;
    
    /* 多行文本截断 */
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: 2; /* 限制显示两行 */
    -webkit-box-orient: vertical;
    
    /* 展开状态的样式 */
    &.expanded {
        -webkit-line-clamp: unset; /* 取消行数限制 */
        display: block;
    }
}

.expand-button {
    display: inline-block;
    margin-top: 10rpx;
    color: #1989fa; /* 使用你的主题色 */
    font-size: 26rpx;
}

优化技巧

1. 性能优化

当列表项很多时,我们需要考虑性能优化:

// 优化判断是否需要展开按钮的逻辑
needShowMoreBtn(text) {
    // 缓存长文本判断结果避免重复计算
    if (!this.textLengthCache[text]) {
        this.textLengthCache[text] = text && text.length > 50;
    }
    return this.textLengthCache[text];
}

2. 防止事件冒泡

如果列表项本身有点击事件,需要阻止展开按钮的点击事件冒泡:

<text 
    @click.stop="toggleExpand(item.id)"
    class="expand-button"
>
    {{ expandedItems[item.id] ? '收起' : '展开' }}
</text>

3. 列表更新处理

当列表数据刷新时,确保展开状态被正确重置:

async loadData() {
    // 数据加载逻辑...
    if (isFirstPage) {
        this.resetExpandStatus(); // 重置展开状态
    }
    // 继续处理数据...
}

实际效果

实现这个功能后,我们获得了以下优势:

  1. 视觉整洁:列表页面整洁一致,不会因为内容长短不一而显得凌乱
  2. 节省空间:默认只显示关键信息,节省屏幕空间
  3. 用户友好:用户可以根据需要自行决定是否查看更多内容
  4. 性能提升:减少了初始渲染的内容量,提高了渲染性能

总结

文本内容的"展开/收起"功能是提升移动端用户体验的重要细节。通过合理的HTML结构、CSS样式和Vue的响应式特性,我们可以轻松实现这个功能。关键点在于:

  1. 使用对象存储每个列表项的展开状态
  2. 利用CSS的-webkit-line-clamp属性控制文本显示行数
  3. 合理处理展开/收起的交互逻辑
  4. 注意性能和兼容性优化

希望这篇文章对你实现类似功能有所帮助!你也可以根据自己的项目需求,对这个基础实现进行定制和扩展,打造更好的用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2376864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

思维链框架:LLMChain,OpenAI,PromptTemplate

什么是思维链,怎么实现 目录 什么是思维链,怎么实现思维链(Chain of Thought)在代码中的实现方式1. 手动构建思维链提示2. 少样本思维链提示3. 自动思维链生成4. 思维链与工具使用结合5. 使用现有思维链框架:LLMChain,OpenAI,PromptTemplate思维链实现的关键要点思维链(C…

使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据(申请key教程)

使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据 目录 使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据&#x1f4cc; 简介&#x1f6e0; 插件安装方法&#x1f30d; 下载 DEM 数据步骤&#x1f511; 注册 OpenTopography 账号&#xff08;如使用 Cope…

计算机组成与体系结构:替换策略(MRU LRU PLRU LFU)

目录 &#x1f3b2; MRU&#xff08;最近最常使用&#xff09; &#x1fa9c; 操作流程&#xff1a; &#x1f3b2; LRU&#xff08;最近最少使用&#xff09; &#x1fa9c; 操作流程&#xff1a; 示例 &#x1f50d; Age Bits&#xff08;年龄位&#xff09; 核心思想…

websocket入门详解

入门websocket的基础应该掌握一下问题&#xff1a; 1、什么是握手&#xff1f; 2、什么是websocket&#xff1f; 3、websocket和http的区别&#xff0c;应用场景 4、html前端简单代码演示 5、springboot整合websocket使用 6、使用vueelementui打造简单聊天室 7、使用web…

(6)python开发经验

文章目录 1 QListWidget样式显示异常2 模块编码错误3 qtcreator开发pyqt编码错误 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;python开发 &#x1f448; 1 QListWidget样式显示异常 main.py import sys from PySide6.QtWi…

HPC软件使用之ANSYS Fluent

目录 一、软件介绍 二、脚本编写 2.1 jou文件 2.2 slurm脚本文件 三、作业提交及查看 四、案例演示 4.1 网格模型 4.2 jou脚本 4.3 slurm脚本 4.4 计算 4.5 结果查看 从本文开始&#xff0c;我们将介绍如何在超级计算机上使用科学计算、工程仿真计算软件开展计算&am…

YOLO11解决方案之距离计算探索

概述 Ultralytics提供了一系列的解决方案&#xff0c;利用YOLO11解决现实世界的问题&#xff0c;包括物体计数、模糊处理、热力图、安防系统、速度估计、物体追踪等多个方面的应用。 测量两个物体之间的间距被称为特定空间内的距离计算&#xff0c;YOLO11使用两个边界框的中心…

论文学习_Precise and Accurate Patch Presence Test for Binaries

摘要&#xff1a;打补丁是应对软件漏洞的主要手段&#xff0c;及时将补丁应用到所有受影响的软件上至关重要&#xff0c;然而这一点在实际中常常难以做到&#xff0c;研究背景。因此&#xff0c;准确检测安全补丁是否已被集成进软件发行版本的能力&#xff0c;对于防御者和攻击…

Ascend的aclgraph(九)AclConcreteGraph:e2e执行aclgraph

1回顾 前面的几章内容探讨了aclgraph运行过程中的涉及到的关键模块和技术。本章节将前面涉及到的模块串联起来&#xff0c;对aclgraph形成一个端到端的了解。 先给出端到端运行的代码&#xff0c;如下&#xff1a; import torch import torch_npu import torchair import log…

c++从入门到精通(四)--动态内存,模板与泛型编程

文章目录 动态内存直接管理内存Shared_ptr类Unique_ptrWeak_ptr动态数组allocator类文本查询程序 模板与泛型编程定义模板函数模板类模板模板参数成员模板控制实例化 模板实参推断重载与模板可变参数模板模板特例化 动态内存 c中动态内存的管理是通过new和delete运算符来实现的…

寻找两个正序数组的中位数 - 困难

************* Python topic: 4. 寻找两个正序数组的中位数 - 力扣&#xff08;LeetCode&#xff09; ************* Give the topic an inspection. Do the old topic will give you some new sparks. Before that, I do some really good craetive things about my logo. …

国产密码新时代!华测国密 SSL 证书解锁安全新高度

在数字安全被提升到国家战略高度的今天&#xff0c;国产密码算法成为筑牢网络安全防线的关键力量。华测国密SSL证书凭借其强大性能与贴心服务&#xff0c;为企业网络安全保驾护航&#xff0c;成为符合国家安全要求的不二之选&#xff01;​ 智能兼容&#xff0c;告别浏览器适配…

【金仓数据库征文】从云计算到区块链:金仓数据库的颠覆性创新之路

目录 一、引言 二、金仓数据库概述 2.1 金仓数据库的背景 2.2 核心技术特点 2.3 行业应用案例 三、金仓数据库的产品优化提案 3.1 性能优化 3.1.1 查询优化 3.1.2 索引优化 3.1.3 缓存优化 3.2 可扩展性优化 3.2.1 水平扩展与分区设计 3.2.2 负载均衡与读写分离 …

股指期货套期保值怎么操作?

股指期货套期保值就是企业或投资者通过持有与其现货市场头寸相反的期货合约&#xff0c;来对冲价格风险的一种方式。换句话说&#xff0c;就是你在股票市场上买了股票&#xff08;现货&#xff09;&#xff0c;担心股价下跌会亏钱&#xff0c;于是就在期货市场上卖出相应的股指…

基于IBM BAW的Case Management进行项目管理示例

说明&#xff1a;使用IBM BAW的难点是如何充分利用其现有功能根据实际业务需要进行设计&#xff0c;本文是示例教程&#xff0c;因CASE Manager使用非常简单&#xff0c;这里重点是说明如何基于CASE Manager进行项目管理&#xff0c;重点在方案设计思路上&#xff0c;其中涉及的…

黑马k8s(七)

1.Pod介绍 查看版本&#xff1a; 查看类型,这里加s跟不加s没啥区别&#xff0c;可加可不加 2.Pod基本配置 3.镜像拉去策略 本地没有这个镜像&#xff0c;策略是Never&#xff0c;启动失败 查看拉去策略&#xff1a; 更改拉去策略&#xff1a; 4.启动命令 运行的是nginx、busv…

九、HQL DQL七大查询子句

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月15日 专栏&#xff1a;Hive教程 Apache Hive 的强大之处在于其类 SQL 的查询语言 HQL&#xff0c;它使得熟悉 SQL 的用户能够轻松地对存储在大规模分布式系统&#xff08;如 HDFS&#xff09;中的数据进行复杂的查询和分析…

RTSP 播放器技术探究:架构、挑战与落地实践

RTSP 播放器为什么至今无法被淘汰&#xff1f; 在实时视频传输领域&#xff0c;RTSP&#xff08;Real-Time Streaming Protocol&#xff09;作为最基础、最常见的协议之一&#xff0c;至今依然被广泛用于监控设备、IP Camera、视频服务器等设备中。然而&#xff0c;要构建一个稳…

实验5 DNS协议分析与测量

实验5 DNS协议分析与测量 1、实验目的 了解互联网的域名结构、域名系统DNS及其域名服务器的基本概念 熟悉DNS协议及其报文基本组成、DNS域名解析原理 掌握常用DNS测量工具dig使用方法和DNS测量的基本技术 2、实验环境 硬件要求&#xff1a;阿里云云主机ECS 一台。 软件要…

【鸿蒙开发】性能优化

语言层面的优化 使用明确的数据类型&#xff0c;避免使用模糊的数据类型&#xff0c;例如ESObject。 使用AOT模式 AOT就是提前编译&#xff0c;将字节码提前编译成机器码&#xff0c;这样可以充分优化&#xff0c;从而加快执行速度。 未启用AOT时&#xff0c;一边运行一边进…