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

news/发布时间2024/5/20 15:46:39

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.ulsteruni.cn/article/26236510.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

会充电的CANoe-赋能新能源汽车,高效完成即插即充(PnC)智能充电功能测试

ISO 15118-2标准中描述的PnC功能,可以实现插枪即充电,识别、计费信息、充电参数都通过高级别通信在EV和EVSE之间自动交换。简化了电动汽车的充电过程,提高了用户体验,为电动汽车行业带来了更智能、更便捷的充电解决方案。然而,电动汽车和充电站之间要实现自动通信和计费,…

Nginx负载均衡、动静分离Tomcat案例实战

一、前言 1)Tomcat是一款开源的、免费的WEB软件服务器,是隶属于Apache基金会旗下的,主要是用于去发布网站代码、提供网页信息服务的。用户通过浏览器可以实现网站页面的访问。 2)Tomcat WEB软件默认可以处理静态网页(Apache、Nginx),同时也可以处理动态网页,主要是处理…

dotnet 9 WPF 支持 Style 的 Setter 填充内容时可忽略 Value 标签

本文记录 WPF 在 dotnet 9 的一项 XAML 编写语法改进点,此改进点用于解决编写 Style 的 Setter 进行给 Value 赋值时,不能将 Value 当成默认内容,需要多写 Value 标签的问题。通过此改进点可减少两行 XAML 代码在原先的 WPF 版本里面,对 Style 的 Setter 填充复杂的对象内容…

WDS+MDT网络启动自动部署windows(十七)MDT中文变量,描述,组织单位OU

简介 这简直就是歧视,在MDT使用变量时,数据库设置时,居然不能用中文。 计算机描述,我将在数据库中设置为使用人,主要是其他地方也不方便看。 描述是存在注册表中的,未来自动化也将会使用使用人这个字段,用来注册OCS这样,有标签,使用人字段的软件。 方向 解决MDT/BDD无…

WDS+MDT网络启动自动部署windows(十六)计算机自动进入指定OU

简介 新装计算机总是在默认电脑,不方便配置终端计算机策略权限。 要想办法让MDT装好的计算机,自动进入指定组织单位OU。 dsquery 大概意思是 domain server query ,就是域服务器搜索的意思。 在域控执行 dsquery ou 先看看OU是怎么用LDAP表示的。 从左到右,OU,逐级的组…

OpenVX技术图例(二)

OpenVX技术图例(二) 参考文献链接 https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/latest/exports/docs/tiovx/docs/user_guide/index.html人工智能芯片与自动驾驶