React文本溢出组件封装以及高亮提示

news/2024/10/2 12:35:07

React文本溢出组件封装以及高亮提示

Abbr 组件:使用场景:

  1. 当我们需要设置支持最大行数时进行省略展示
  2. 当我们需要设置支持设置超过多少字符进行省略展示
  3. 当我们需要设置支持关键字高亮展示(有点问题,当关键字被裁剪成...之后,就无法高亮)
  4. 当我们需要支持忽略大小写高亮
  5. 当我们需要支持ToolTip展示全部文本,且可以在toolTip上进行关键字高亮

Abbr 组件tsx

 import { Tooltip } from "antd";
import React from "react";
import "./index.less";
import { finxAllIndex, returnRenderName } from "./tools";interface AbbrTextProps {/* 需要展示的文本 */text: string;/* 截取的长度 */length?: number;/* 设置行数 */line?: number;/* 设置样式 */className?: string;/* 高亮关键字 */keyWord?: string;/* 是否在tooltip中也高亮展示 默认不展示 */showTooltipHighlight?: boolean;/* 主题 */theme?: "default" | "warning" | "error" | "success";/* 是否忽略大小写 */ignoreCase?: boolean;
}
const AbbrText: React.FC<AbbrTextProps> = ({text,length,line,className,keyWord = "",showTooltipHighlight = false,theme = "default",ignoreCase = false,
}) => {let displayText: JSX.Element | string = text;let style = {};let showTooltip = false;/* 如果有高亮的关键字 */const heightKeyWord = (readyText: string,keyWord: string,showAll?: boolean): JSX.Element => {/* 目标结果在字符串中的所有索引 */const findAllIndex = finxAllIndex(readyText, keyWord, ignoreCase);/* 高亮之后标签 */const renderName = returnRenderName(readyText, keyWord, findAllIndex, {theme,});const renderText = (<>{renderName}{!showAll && length && text.length > length && <span>...</span>}</>);return renderText;};if (length && text.length > length) {displayText = text.substring(0, length);showTooltip = true;} else if (line) {style = {display: "-webkit-box","-webkit-box-orient": "vertical",overflow: "hidden",textOverflow: "ellipsis",};}displayText = heightKeyWord(displayText, keyWord);/* length 优先级大于line ,同时设置length 生效 */if (length && line) {console.warn("Abbr组件警告⚠️:length 和 line 同时设置时,length 优先级高");}// 当文本被截短或者设置了行数限制时显示提示const content = (<spanclassName={`abbrtext ${className}`}style={{ ...style, WebkitLineClamp: line, lineClamp: line }}>{displayText}</span>);return (<Tooltiptitle={(showTooltip || line) && showTooltipHighlight? heightKeyWord(text, keyWord, true): text}>{content}</Tooltip>);
};AbbrText.defaultProps = {length: undefined,line: 1,className: "",
};export default AbbrText;

Abbr 组件less

.abbrtext {word-break: break-all;width: fit-content;
}.hightlight {&.default {color: blue;}&.success {color: green;}&.error {color: red;}&.warning {color: orange;}}

Abbr 组件工具函数

 /*** @param str 字符串* @param itemStr 目标字符串* @param ignoreCase 是否忽略大小写* @returns 目标结果在字符串中的所有索引*/
export const finxAllIndex = (str: string,itemStr: string,ignoreCase = false
) => {// 初始化结果数组const result = [];// 遍历字符串,寻找目标项并记录索引for (let i = 0; i <= str.length - itemStr.length; ) {let index = str.indexOf(itemStr, i);if (ignoreCase) {index = str.toLocaleLowerCase().indexOf(itemStr.toLocaleLowerCase(), i);}if (index !== -1) {// 更简洁的判断条件result.push(index);i = index + itemStr.length; // 更新i值} else {i++;}}return result;
};/*** @param str 字符串* @param keyWords 关键字* @param allIndexArray 所有索引* @param config 配置* @param config.theme 主题* @returns 高亮之后标签*/
export const returnRenderName = (str: string,keyWords: string,allIndexArray: Array<number>,config?: {theme?: "default" | "warning" | "error" | "success";}
) => {const { theme = "default" } = config || {};if (allIndexArray.length === 0) {return str;}/* 最终结果 */let res: string | JSX.Element | null = null;let loopindex = 0;const loop = (index = 0): string | JSX.Element => {res = (<>{res}{str.substring(index, allIndexArray[loopindex])}<span className={`hightlight ${theme}`}>{str.substring(allIndexArray[loopindex], keyWords.length)}</span></>);loopindex++;if (allIndexArray.length <= loopindex) {res = (<>{res}{str.substring(allIndexArray[loopindex - 1] + keyWords.length)}</>);return res;} else {return loop(allIndexArray[loopindex - 1] + keyWords.length);}};loop();return res;
};

Abbr 组件测试

import React from "react";
import AbbrText from "./components/Abbr";function App() {return (<><AbbrTexttext="Hello World"keyWord="hello"length={10}showTooltipHighlightignoreCasetheme="warning"/></>);
}export default App;

效果图

img

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

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

相关文章

AlmaLinux 9.4 正式版发布 - RHEL 二进制兼容免费发行版

AlmaLinux 9.4 正式版发布 - RHEL 二进制兼容免费发行版AlmaLinux 9.4 正式版发布 - RHEL 二进制兼容免费发行版 由社区提供的免费 Linux 操作系统,RHEL 二进制兼容发行版 请访问原文链接:AlmaLinux 9.4 正式版发布 - RHEL 二进制兼容免费发行版,查看最新版。原创作品,转载…

cc6链:绕过cc1的JDK版本限制

这里回到LazyMap,LazyMap的get方法可以触发后续的rce为什么cc1有jdk版本限制 JDK中的AnnotationInvocationHandler的readObject更新了,所以cc1用不了 但是前面的部分还是存在的,只要我们找到一个新的入口就还是能执行命令 这里回到LazyMap,LazyMap的get方法可以触发后续的r…

第二届数信杯南区wp-easyJava

第二届数信杯南区easyJavawriteup easyJava 用Eclipse Memory Analyzer进行分析,利用OQL查找字符串这里要写正则表达式:我写了\\u.*意思是找unicode字符串,因为这里的中文都做了unicode编码搜索到这么一个字符串列表,转码——红色框框里的是还原后的内容。如下: 想跟你说一…

Ubuntu中安装OpenSSL

一、前期准备 1.1 压缩包下载 在安装openssl之前,我们需要下载对应的压缩包 https://www.openssl.org/source/openssl-3.0.1.tar.gz 此压缩包可以选择win上下载后解压再复制到本地虚拟机中,也可以选择直接在本地虚拟机中使用wget命令进行下载。当然,在使用wget命令时,我们需…

建发弘爱 X 袋鼠云:加速提升精细化、数字化医疗健康服务能力

厦门建发弘爱医疗集团有限公司(简称“建发弘爱”)创立于2022年,是厦门建发医疗健康投资有限公司的全资子公司,专业从事医疗健康领域的医疗服务。 建发弘爱通过医疗、健康及产业服务三大板块,为百姓提供医疗和健康全生命周期解决方案。以医疗机构为核心,管理及运营弘爱医院…

删除单向链表中数据最小的结点

删除单向链表中数据最小的结点(1)算法的基本设计思想 要找到链表中数据最小的结点,可以使用4指针法。具体步骤如下:定义4个指针,分别命名为MinNodeprev、MinNode、CurrentNodePrev、CurrentNode,MinNodeprev、CurrentNodePrev指向链表的头结点,MinNode、CurrentNode指向…

Java-线程-线程池

0.背景参考资料:Java线程池实现原理及其在美团业务中的实践在 Java 早期,每次创建线程时,都要涉及到线程的创建、销毁以及资源管理,这对于系统的性能和资源利用率是一种浪费。 因此,Java 提供了线程池的概念,以提高线程的管理效率和性能。资源管理优化:传统的线程创建和…