需求:

  1. 该组件可以显示文本+按钮的形式,也可以显示纯文本的形式。
  2. 文本可以为单行或多行,为单行时超过最大宽度显示省略号,在有按钮的情况下,按钮在文本之后显示。为多行文本时,默认超过两行省略,再有按钮的情况下按钮在文本之后显示。
  3. 在组件中,定义自定义文本内容:如 按钮标签并将此设置为可选参数。定义文本为必传参数。定义行数并设置默认行数为2行,超过两行进行省略。

使用hooks中的useSafeState, useUpdate等
useUpdate: 返回一个函数,调用该函数会强制组件重新渲染。
useSafeState: 用法与useState 完全一样,但是在组件卸载后异步回调内的 setState 不再执行,避免因组件卸载后更新状态而导致的内存泄漏。

子组件中

1.在index.tsx文件中

interface EllipsisProp {width?: number // 宽度 默认百分之百text: string // 文本内容customView?: ReactDOM //自定义文本rows?: number // 展示几行 默认2行
}
import { useSafeState, useUpdate } from 'ahooks'
import React, { useEffect, useRef } from 'react'const Ellipsis: React.FC<EllipsisProp> = (props) => {// 父组件传来的值const { width, text = '', customView, rows = 2 } = props// 设置初始文本值const [textView, setTextView] = useSafeState('')const ref = useRef<HTMLDivElement>(null)const updata = useUpdate()useEffect(() => {setTextView(text)setTimeout(() => {// 强制渲染updata()}, 30)}, [text])// 总体高度const scrollHeight = ref.current?.scrollHeight || 0// 可视高度const clientHeight = ref.current?.clientHeight || 0return (<Divrows={rows}width={width ? width + 'px' : '100%'}text={text}isExceed={scrollHeight > clientHeight + 5} // 样式判断><div className="text_view" ref={ref}>{scrollHeight > clientHeight + 5 && (<div className="view">{customView}</div>)}<span className="text">{textView}</span></div></ContentArea>)
}
export default Ellipsis

2.在styled.ts中

import styled from 'styled-components'
const Div = styled.div<{width: string // 宽度rows: number // 行数text: string // 文本isExceed: boolean // 样式判断
}>`display: flex;.text_view {width: ${(p) => p.width}; 宽度 父组件传过来的高度line-height: 22px;max-height: ${(p) => p.rows * 22 + 'px'}; // 最大高度 行数* 每一行的高度overflow: hidden;font-size: 14px;color: #262626;&::before {content: '';display: ${(p) => (!p.isExceed ? 'none' : 'inline-block')}; float: right;width: 0px;height: ${(p) => p.rows * 22 + 'px'};margin-bottom: -20px;}.text{whiteSpace: pre-wrap; // 保留空白符序列,但是正常地进行换行。}.view {position: relative;float: right;clear: both;&::before {content: '...';position: absolute;left: 1px;top: -2px;color: #333;transform: translateX(-100%);}}.views {clear: both;display: inline-block;margin-left: ${(p) => (p.text ? '6px' : 0)};}}
`
export { Div }

父组件调用

<Ellipsis text={'测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试'} width={319} rows={2}/>

结果:

简单的单行文本超出最大宽度显示省略 …

<span className="font_simall">测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试
</span>
.font_simall {max-width: 200px; 最大宽度display: inline-block;overflow: hidden;white-space: nowrap; 强制不换行text-overflow: ellipsis; 省略
}

简单的多行文本超出最大宽度显示省略 …

.font_simall {width: 215px;display: -webkit-box;word-break: break-all;text-overflow: ellipsis; overflow: hidden;-webkit-line-clamp: 2;-webkit-box-orient: vertical;
}

react 多行或单行文本溢出省略显示省略号(...)相关推荐

  1. vue中多行文本标签_element-ui+vue-cli3.0系列问题三:el-tooltip实现多行,单行文本溢出省略号处理...

    大家都知道,对于文本溢出处理,单行溢出处理直接用css就可以处理,但是对于多行文本溢出的话,也可以用css处理,但是由于浏览器的兼容性,所以只能通过js结合css来处理. 点击查看源码. 单行文本溢出 ...

  2. 文本溢出处理显示省略号

    一.文本溢出处理显示省略号 1.单行文本溢出显示省略号 方法1:省略号 单行文本: width:200px:设置盒子的宽度(限制宽度) white-space:nowrap:设置文本不换行 overf ...

  3. web 文本溢出处理显示省略号

    1.单行文本溢出显示省略号 方法1:省略号 单行文本: width:200px:设置盒子的宽度(限制宽度) white-space:nowrap:设置文本不换行 overflow:hidden:溢出隐 ...

  4. 全局mixin封装文本溢出隐藏显示省略号

    全局mixin封装文本溢出隐藏显示省略号 @mixin ellipsis2($line) {display: -webkit-box;overflow: hidden;text-overflow: e ...

  5. svg中如何让文本溢出时显示省略号

    svg中如何让文本溢出时显示省略号 最近在使用d3.js实现一个树状组织结构图,遇到如下图所示的问题,要求是文本内容固宽,溢出内容应用省略号代替,如果是使用普通html标签实现的话,是比较简单的,ov ...

  6. 单行文字溢出隐藏显示省略号

    单行文字溢出隐藏显示省略号 1. 让换行的文字强制在一行显示.属性 white-space: nowrap; 2. 溢出的部分隐藏.overflow: hidden: 3. 文字溢出显示用省略号. t ...

  7. 单行文本溢出省略和多行文本溢出省略

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  8. css单行文本溢出以...显示

    固定三句话: /* 不换行 */white-space: nowrap;/* 溢出隐藏 */overflow: hidden;/* 表示文本溢出时显示方式 ellipsis表示圆点 */text-ov ...

  9. css文本溢出隐藏显示省略号

    一.单行文本显示省略号 1.先强制文本一行内显示 white-space:nowrap(不换行); 2.超出部分影藏 overflow:hidden; 3.用省略号代替超出的部分 text-overf ...

  10. 多行文本溢出省略和单行文本溢出省略

    记录下大神文章的地址,下次用的时候方便 http://www.daqianduan.com/6179.html 单行: overflow: hidden; text-overflow:ellipsis ...

最新文章

  1. MySQL学习笔记(六)MySQL8.0 配置笔记
  2. JSP_通过表格显示数据库的信息
  3. mysql主键创建非聚集索引_什么是聚集索引,非聚集索引,索引覆盖,回表,索引下推...
  4. linux root目录install,Linux如何建立、删除、切换目录?
  5. h5 bootstrap 小程序模板_青浦区社群小程序模板
  6. Java打war包or打jar包
  7. 实验吧web-中-忘记密码了
  8. android canvas_Android实现自定义阴影效果
  9. innerHTML和outerHTML以及innerText和outerText之间的区别
  10. (转载)一文教你 “量子编程”入门式
  11. 用树莓派打造家庭影院媒体库+硬盘播放机+无人值守下载机
  12. SEM1 PSYCHOLOGY LEC2
  13. Win11 25188.1000补丁包介绍及下载地址
  14. webfreer去广告
  15. 小秘书智能app登录
  16. 斯坦福大学计算机科学专业硕士排名,斯坦福大学计算机系统研究生排名关键的都看过来...
  17. 引用的账户当前已锁定,且无法登录
  18. 幽默感七个技巧_培养幽默感的16种方法
  19. 帝国双璧--卫青与霍去病
  20. jsp未正确拼写字 mysql_(转)MySQL5.0中文问题及JDBC数据库连接和JSP汉字编码问题解决方法总结...

热门文章

  1. html a4页面样式_4个使用将HTML转换为PDF的方法介绍-js教程
  2. 计算机二级怎么样分屏方便,一招实现电脑分屏,比你想象中更简单
  3. 移动前端开发与web前端开发的区别
  4. 模拟电话簿提取名字显示
  5. win10怎么用计算机二进制,教你如何使用Win10计算器进行进制转换?
  6. 瞄准千亿工业物联网市场,有人物联网为2万企业级用户提供完整可靠方案
  7. 8位PCM编码转换16位PCM
  8. php数字验证码代码,php中文字母数字验证码实现代码
  9. 2000坐标系和WGS84的关系
  10. POI导出 Excel 加水印支持 SXSSFWorkbook 和 XSSFWorkbook 模式