ReactJS自动添加Tooltip:基于字典匹配文本生成提示组件
解决方案
核心思路是把输入字符串拆分成「匹配字典关键词的片段」和「普通文本片段」,分别处理后拼接成React元素数组,最后用span包裹返回。具体步骤和代码如下:
1. 预处理字典,生成最优正则规则
为避免短词优先匹配(比如字典同时有"React"和"React Native"时,要先匹配长词条),先把字典的key按长度从长到短排序,再生成匹配完整词汇的正则:
// 假设你的字典是 importedDict const sortedKeys = Object.keys(importedDict).sort((a, b) => b.length - a.length); // 转义特殊字符避免正则语法冲突,用\b确保匹配完整词汇 const regexPattern = sortedKeys.map(key => `\\b${escapeRegExp(key)}\\b`).join('|'); const keywordRegex = new RegExp(regexPattern, 'g'); // 辅助函数:转义正则特殊字符 function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); }
2. 实现字符串拆分与转换函数
function convertTextToTooltipSpan(inputText) { // 用正则拆分字符串,保留匹配的关键词和普通文本 const fragments = inputText.split(keywordRegex); // 遍历片段,转换匹配关键词为Tooltip const elements = fragments.map((fragment, index) => { if (importedDict.hasOwnProperty(fragment)) { // 用已有的defToToolTip处理匹配到的关键词,加唯一key避免React警告 return defToToolTip(fragment, importedDict[fragment], { key: `tooltip-${index}` }); } // 过滤拆分后可能出现的空片段 if (!fragment) return null; // 普通文本直接返回文本节点 return fragment; }).filter(Boolean); // 用span包裹所有元素返回 return <span>{elements}</span>; }
3. 适配中文场景的补充说明
如果处理中文文本,因为中文没有英文那样的单词边界\b,需要调整匹配规则:
- 可以把正则的
\b替换为匹配中文标点、空格或字符串首尾的规则,比如(^|[\s\u3000-\u303f\uff00-\uffef])和($|[\s\u3000-\u303f\uff00-\uffef]) - 或者改用逐个遍历字典词条的方式查找替换(效率稍低,但适配性更强)
内容的提问来源于stack exchange,提问作者Nitzan Daloomy
相关产品推荐
相关产品推荐

