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!

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

相关推荐
摘星编程41 分钟前
OpenHarmony环境下React Native:Tooltip自动定位
javascript·react native·react.js
穿过锁扣的风1 小时前
如何操作HTML网页
前端·javascript·html
2601_949833392 小时前
flutter_for_openharmony口腔护理app实战+知识实现
android·javascript·flutter
东东5162 小时前
果园预售系统的设计与实现spingboot+vue
前端·javascript·vue.js·spring boot·个人开发
起风的蛋挞2 小时前
Matlab提示词语法
前端·javascript·matlab
Amumu121383 小时前
Vue Router(一)
前端·javascript·vue.js
2603_949462103 小时前
Flutter for OpenHarmony 社团管理App实战 - 资产管理实现
开发语言·javascript·flutter
VT.馒头3 小时前
【力扣】2694. 事件发射器
前端·javascript·算法·leetcode·职场和发展·typescript
我是伪码农3 小时前
Vue 1.30
前端·javascript·vue.js