js原生实现搜索框下拉列表输入框模糊匹配高亮

1、需求

很多搜索列表输入框,输入下拉列表有的文字时做模糊匹配,进行相关文字高亮,(比如需要输入的任意一个字有,列表中对应的那个字就得高亮,不是需要跟输入框的字完全一样 )

2、实现效果:

3、实现方法:

原理就是给特定需要高亮的文字加个class样式,生成一个模版字符串。

注意:我这里是vue所以用v-html解析模版字符串,如果是reactdangerouslySetInnerHTML即可

3.1、正则:

suggest: 字符串原文
highlight: 需高亮文字 (比如可以是你的输入框value)
suggestHighlight: 字符串原文包含highlight的加上高亮样式后的html

typescript 复制代码
const renderSuggest = (suggest: string, highlight) => {
    if (highlight) {
      let suggestHighlight = suggest;
      const highlightStrs = highlight?.split("").join("|") || "";
      try {
        suggestHighlight = suggestHighlight.replace(
          new RegExp(`(${highlightStrs})`, "g"),
          `<i class="highlight-tag">$1</i>`
        );
      } catch (e) {
        console.log("suggest error", e);
      }
    }
    return  <div v-html=`${suggestHighlight}` ></div>
  };

// 别忘记定义高亮class
.highlight-tag {
 	color: red;
 }

3.2、工具方法

第一种:

suggest: 字符串原文
highlight: 需高亮文字 (比如可以是你的输入框value)
suggestHighlight: 字符串原文包含highlight的加上高亮样式后的html

typescript 复制代码
while (index !== -1) {
    // 添加非高亮部分
    suggestHighlight += suggest.substring(currentIndex, index);

    // 添加高亮部分
    suggestHighlight += `<i class="highlight-tag">${highlight}</i>`;

    // 更新当前索引到已找到的高亮部分之后
    currentIndex = index + highlight.length;

    // 继续查找下一个高亮部分
    index = suggest.indexOf(highlight, currentIndex);
}

// 添加剩余的非高亮部分
suggestHighlight += suggest.substring(currentIndex);


// 别忘记定义高亮class
.highlight-tag {
 	color: red;
 }

第二种:

suggest: 字符串原文
highlight: 需高亮文字 (比如可以是你的输入框value)
suggestHighlight: 字符串原文包含highlight的加上高亮样式后的html

typescript 复制代码
const renderSuggest = (suggest: string, highlight: string) => {
    let suggestHighlight = '';

    for (let i = 0; i < suggest.length; i++) {
        const currentChar = suggest[i];
        const isHighlighted = highlight.includes(currentChar);

        // 如果当前字符需要高亮
        if (isHighlighted) {
            suggestHighlight += `<i class="highlight-tag">${currentChar}</i>`;
        } else {
            suggestHighlight += currentChar;
        }
    }

    return  <div v-html="suggestHighlight" ></div>
};

// 别忘记定义高亮class
.highlight-tag {
 	color: red;
 }

end!

希望记录的问题能帮助到你~

相关推荐
掘金安东尼11 分钟前
React 19 发布:useTransition 平滑异步过渡!
前端·javascript·github
用户479492835691514 分钟前
ESLint支持多线程Linting啦
前端·javascript·面试
SleepyZone14 分钟前
使用 Async Generator 实现 Agent 流式输出与流程控制
javascript·agent·ai编程
猪哥帅过吴彦祖30 分钟前
JavaScript Symbol:那个被忽视的"隐形"数据类型
前端·javascript·面试
薛定谔的算法1 小时前
面试官问你知道哪些es6新特性?赶紧收好,猜这里一定有你不知道的?
前端·javascript·面试
用户47949283569151 小时前
🚀 打包工具文件名哈希深度解析:为什么bundle.js变成了bundle.abc123.js
前端·javascript·面试
晴空雨1 小时前
遇到第三方库 bug 怎么办?5 种修改外部依赖的方法帮你搞定
前端·javascript·架构
yzzzzzzzzzzzzzzzzz1 小时前
ES6/ES2015 - ES16/ES2025
前端·ecmascript·es6
Bling_Bling_12 小时前
Vue2 与 Vue3 路由钩子的区别及用法详解
开发语言·前端·vue
Jacob02343 小时前
JavaScript 的进化之旅 Part 2:现代特性与算法优化实战
前端·javascript·性能优化