【react】文本内容超过一行,显示为单行省略,并且出现icon图标;点击此图标,可以进行展开或收起文本功能实现

2023-11-08

需求:

  1. 多条数据展示,每条数据的文本内容不超过一行
  2. 文本内容为一行时,不显示 展开收起icon图标
  3. 文本超过一行时,内容单行省略,并且显示⬇️
  4. 点击图标,图标切换为收起按钮, ⬆️
// 后端返回数据
const data = [
    {
      name: '测试测试测试',
      time: '2022-07-06 18:50:08',
      remark:
        '测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试',
    },
    {
      name: '测试测试测试',
      time: '2022-07-06 18:50:08',
      remark:
        '测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试',
    },
    {
      name: '测试测试测试',
      time: '2022-07-06 18:50:08',
      remark:
        '测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试',
    },
]

使用useEffect处理

// 监听文本的可视宽度(ref.current.clientWidth)和滚动宽度 (ref.current.scrollWidth)
const ref = useRef<HTMLDivElement>(null)
// 利用可视宽度和滚动宽度比较来判断是否显示此按钮

// 依赖数据长度以及刷新
useEffect(() => {
    if (data && !isLoading) {
      const dataObj = [...data]
      dataObj.map((item: { isShow: boolean }) => {
      // 为每一条数据添加isShow 来控制文本显示和按钮显示
        if (!item.isShow) {
          item.isShow = false
        }
      })
      mutate(dataObj) // mutate 重新请求数据
    }
  }, [data?.length, isLoading])

函数方法

 // 点击展示或收起数据
  const handlerChange = (val: number) => {
    const arr = [...data]
    arr.map((item: { isShow: boolean }, index: number) => {
      if (index === val) {
        item.isShow = !item.isShow
      }
    })
    mutate(arr) // mutate 重新请求数据
  }

数据渲染

// 数据渲染
 {data.map(
	 (item: { 
		  name: string 
		  time: string 
		  remark: string 
		  isShow: boolean
		    },
		    index: number
	  ) => (
	    <Main rows={!item.isShow ? 1 : 9999} key={index}>
	      <div className="point_title">
	        <div className="title_text">{item.name}</div>
	      </div>
	      <div className="point_time">
	        {item.time.replace(/-/g, '/')}
	      </div>
	      <div className="point_remark">
	        <div className="remark_text" ref={ref}>
	          {item.remark}
	        </div>
	        {(item.isShow ||
	          (ref.current &&
	            ref.current.clientWidth < ref.current.scrollWidth)) && (
	          <div
	            onClick={() => handlerChange(index)}
	            className="remark_icon"
	          >
	            {item.isShow ? (
	              <ArrowUp className="icon" />
	            ) : (
	              <ArrowDown className="icon" />
	            )}
	          </div>
	        )}
	      </div>
	    </Main>
	 )
)}

样式渲染

const Main = styled.div<{
  rows: number
}>`
  margin: 16px;
  padding-bottom: 16px;
  border-bottom: 1px solid #ededed;
  .icon {
    width: 14px;
    height: 14px;
  }
  .point_title {
    display: flex;
    justify-content: space-between;
    .title_text {
      font-family: 'PingFangSC-Medium';
      font-size: 14px;
      color: #262626;
      line-height: 22px;
      font-weight: 500;
      flex: 1 1;
    }
  }
  .point_time {
    margin-top: 4px;
    margin-bottom: 4px;
    font-family: 'PingFangSC-Regular';
    font-size: 12px;
    color: #8c8c8c;
    line-height: 20px;
    font-weight: 400;
    height: 20px;
  }
  .point_remark {
    display: flex;
    justify-content: space-between;
    font-size: 12px;
    color: #8c8c8c;
    line-height: 20px;
    font-weight: 400;
    .remark_text {
      width: 313px;
      ${(p) => MultiLineOmission(p.rows)}; // 多行省略
    }
    .remark_icon {
      display: flex;
      align-items: center;
    }
  }
`
export { Main }

多行省略的实现

// 多行省略
const MultiLineOmission = (line = 3) => css`
  display: ${() => line !== 1 && '-webkit-box'};
  overflow: hidden;
  text-overflow: ellipsis;
  -webkit-line-clamp: ${() => line};
  -webkit-box-orient: vertical;
  word-break: break-all;
  white-space: ${() => line === 1 && 'nowrap'};
`
export { MultiLineOmission }

总结:

  1. 注意是每一条数据,因此需要给每一条数据添加 isShow
  2. 点击时传入每一条数据的id值,如果没有id也可以使用index,将此条数据的item.isShow变为!item.isShow,然后进行重新刷新数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【react】文本内容超过一行,显示为单行省略,并且出现icon图标;点击此图标,可以进行展开或收起文本功能实现 的相关文章

随机推荐

  • Kyligence Zen产品体验——一站式指标平台泰酷辣~

    文章目录 一 前言 二 为什么需要指标化平台 三 什么是Kyligence Zen 四 Kyligence Zen新特性 五 Kyligence Zen注册篇 六 Kyligence Zen体验篇 七 Kyligence Zen实战篇 7
  • 安卓百度地图开发(三)在定位图层获取指南针角度

    在官方文档中没有给出获取角度的方法 这里使用了安卓自带的传感器获取指南针角度 首先定义传感器和角度 private SensorManager mSensorManager double degree 0 在oncreate方法中初始化传感
  • Xmind使用技巧

    新建图表 根据需求 可新建为空白图表或模板图表 空白图 模板 提高工作效率 其中因果分析 鱼普 图 SWOT分析 比较与对比 读书笔记等常用 也可以新建空白图 改变鱼头的左右方向 相比就是样式没有模板的那么丰富
  • 操作系统 请求分页存储管理

    目录 请求分页存储管理中的页表机制 缺页中断机构 地址转换 页置换算法 页分配和页置换策略 工作集及抖动现象的消除 请求分页存储管理的优缺点 请求分页存储管理中的页表机制 系统需要解决的问题 系统如何获知进程当前所需页面不在主存 当发现缺页
  • 记录一次FISCO BCOS的console启动失败的问题(create BcosSDK failed for the number of available peers is 0)

    记录一次FISCO BCOS的console启动失败的问题 报错 create BcosSDK failed for the number of available peers is 0 版本 FISCO BCOS v2 7 0 conso
  • 新多模态大模型霸榜!支持图文混合输入,不懂知识还能现学

    克雷西 发自 凹非寺量子位 公众号 QbitAI 多模态大模型家族 又有新成员了 不仅能将多张图像与文本结合分析 还能处理视频中的时空关系 这款免费开源的模型 在MMbench和MME榜单同时登顶 目前浮动排名也保持在前三位 MMBench
  • 物联网的应用场景

    随着物联网技术的不断发展和普及 它已经在各个领域展现出了巨大的潜力和前景 下面将会探讨物联网的应用前景 1 智能家居 智能家居是物联网技术最广泛应用的领域之一 通过智能家居设备 人们可以在任何时间 任何地点通过手机 平板电脑等设备远程控制家
  • 深度学习原理分析之数据不足与过拟合

    人们常常知道若干种解决过拟合的方法但不知其因 本文对其进行原理剖析 一个模型所能提供的信息一般来源于两个方面 一是训练数据中蕴含的信息 二是在模型的形成过程中 包括构造 学习 推理等 人们提供的先验信息 当训练数据不足时 说明模型从原始数据
  • Spring Boot官方例子《Developing Your First Spring Boot Application》无法运行

    官方的第一个例子就卡住了 https docs spring io spring boot docs current reference htmlsingle getting started first application 按照要求 一
  • 【消息队列】kafka consumer demo

    package consumer import org apache kafka clients consumer ConsumerConfig import org apache kafka clients consumer Consum
  • git常用命令及免密登录

    常用命令 git config global user name 用户名 设置用户签名 git config global user email 邮箱 设置用户签名 git init 初始化本地库 git status 查看本地库状态 gi
  • 多线程写图像文件的一点小测试(Boost + Gual)

    转载自 http blog csdn net liminlu0314 article details 7420484 在处理遥感图像中 发现往往比较耗时的是在数据的IO中 尤其是在O 写入 的时候更加耗时 GDAL可以支持图像的多线程写入
  • 蓝桥杯——修改数组

    问题描述 给定一个长度为N的数组A A1 A2 AN 数组中有可能有重复出现的整数 在小明要按以下方法将其修改为没有重复整数的数组 小明会依次修改A2 A3 AN 当修改Ai时 小明会检查Ai是否在A1 Ai 1中出现过 如果出现过 则小明
  • C#中的事件和委托_札记1

    C 中的事件和委托 札记1 委托 自定义委托 静态方法 被委托 委托是一种类型 所以任何定义类的地方都可以定义委托类型 自定义委托的基本格式示例如下
  • RobotFramework 安装教程

    动化测试框架 具盘点 安装步骤 页面介绍 标准库 不需要安装 直接 RF 带 扩展库 快捷键 实战 RobotFramework 安装教程 动化测试框架 具盘点 java junit和testng 具 postmen newman git
  • html动态爱心代码【二】(附源码)

    目录 前言 效果演示 内容修改 完整代码 总结 前言 七夕马上就要到了 为了帮助大家高效表白 下面再给大家带来了实用的HTML浪漫表白代码 附源码 背景音乐 可用于520 情人节 生日 表白等场景 可直接使用 效果演示 内容修改 文案 di
  • go - flag包(处理命令行参数小能手)

    前言 在golang中有很多方法来处理命令行参数 简单情况下可以不使用任何库 直接使用os Args 但是golang标准库提供了flag包来专门处理命令行参数 当然还有第三方提供的处理命令行参数的库cobra cli可以参考 flag包绑
  • qt没有mysql驱动的解决办法

    qt没有mysql驱动的解决办法 第一部分 qtcreator上没有mysql驱动的解决办法 第一步 找到你的qt的版本的源码src 第二步 点击mysql pro 电脑会自动打开qtcreater 然后就是进行编译器的选择 我选择的是 在
  • BootStrap的使用

    是别人帮我们已经写好的css样式 我们如果想要使用这个BootStrap 下载BootStrap 使用 在页面上引入BootStrap 自定置 先在网上下载好BootStrap 并导入到Pycharm 引入BootStrap 注意引入的是
  • 【react】文本内容超过一行,显示为单行省略,并且出现icon图标;点击此图标,可以进行展开或收起文本功能实现

    需求 多条数据展示 每条数据的文本内容不超过一行 文本内容为一行时 不显示 展开收起icon图标 文本超过一行时 内容单行省略 并且显示 点击图标 图标切换为收起按钮 后端返回数据 const data name 测试测试测试 time 2