)包裹,最后通过v-htm…">
当前位置:首页 > VUE

vue实现搜索高亮显示

2026-02-23 04:30:23VUE

实现搜索高亮的基本思路

在Vue中实现搜索高亮的核心是通过正则表达式匹配关键词,并将匹配到的内容用HTML标签(如<span class="highlight">)包裹,最后通过v-html渲染处理后的文本。需注意安全性问题,避免XSS攻击。

方法一:使用计算属性处理高亮

定义一个计算属性,将原始文本中的关键词替换为高亮样式:

<template>
  <div>
    <input v-model="searchText" placeholder="输入搜索词" />
    <div v-html="highlightedContent"></div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      content: "这里是需要高亮显示的文本内容,包含Vue和JavaScript关键词。",
      searchText: ""
    };
  },
  computed: {
    highlightedContent() {
      if (!this.searchText) return this.content;
      const regex = new RegExp(this.searchText, "gi");
      return this.content.replace(
        regex,
        match => `<span class="highlight">${match}</span>`
      );
    }
  }
};
</script>

<style>
.highlight {
  background-color: yellow;
  font-weight: bold;
}
</style>

注意事项:

  • 使用v-html时需确保内容来源可信,避免XSS攻击。
  • 正则表达式中的gi表示全局匹配且忽略大小写。

方法二:封装高亮为全局指令

将高亮逻辑封装为Vue自定义指令,方便复用:

// main.js 或单独指令文件
Vue.directive('highlight', {
  bind(el, binding) {
    const text = el.textContent;
    const search = binding.value;
    if (!search) return;
    const regex = new RegExp(search, 'gi');
    el.innerHTML = text.replace(
      regex,
      match => `<span class="highlight">${match}</span>`
    );
  },
  update(el, binding) {
    // 搜索词变化时重新渲染
    const text = el.textContent;
    const search = binding.value;
    if (!search) {
      el.innerHTML = text;
      return;
    }
    const regex = new RegExp(search, 'gi');
    el.innerHTML = text.replace(
      regex,
      match => `<span class="highlight">${match}</span>`
    );
  }
});

// 组件中使用
<template>
  <div v-highlight="searchText">{{ content }}</div>
</template>

方法三:处理多关键词高亮

若需支持多个关键词高亮,可通过拆分搜索词并循环处理:

computed: {
  highlightedContent() {
    if (!this.searchText) return this.content;
    const keywords = this.searchText.split(' ').filter(k => k.trim());
    let result = this.content;
    keywords.forEach(keyword => {
      const regex = new RegExp(keyword, 'gi');
      result = result.replace(
        regex,
        match => `<span class="highlight">${match}</span>`
      );
    });
    return result;
  }
}

安全增强建议

若内容可能包含用户输入,建议使用DOMPurify库过滤HTML:

npm install dompurify
import DOMPurify from 'dompurify';
computed: {
  highlightedContent() {
    const rawHtml = this.replaceKeywords(); // 替换逻辑
    return DOMPurify.sanitize(rawHtml);
  }
}

性能优化

对于长文本或高频搜索,可通过防抖(debounce)减少计算次数:

vue实现搜索高亮显示

import { debounce } from 'lodash';
methods: {
  updateHighlight: debounce(function() {
    this.highlightedContent = this.calculateHighlight();
  }, 300)
}

标签: vue高亮
分享给朋友:

相关文章

vue实现视频会议

vue实现视频会议

使用 Vue 实现视频会议 技术选型 Vue.js 作为前端框架,结合 WebRTC 技术实现实时音视频通信。常用的库包括: peerjs:简化 WebRTC 的点对点连接。 socket.io:用…

vue实现拖拉

vue实现拖拉

实现拖拽功能的基本步骤 在Vue中实现拖拽功能可以通过原生HTML5的拖放API或第三方库如vuedraggable完成。以下是两种方法的详细说明。 使用HTML5原生拖放API HTML5提供了原…

vue实现座位

vue实现座位

Vue实现座位布局 使用Vue实现座位布局可以通过组件化和响应式数据管理来简化开发流程。以下是一个完整的实现方案: 数据准备 定义座位数据结构,通常使用二维数组表示行列关系: data() {…

vue实现截屏怎么实现

vue实现截屏怎么实现

Vue实现截屏的方法 使用html2canvas库 html2canvas是一个流行的JavaScript库,可以将网页元素转换为Canvas图像。在Vue项目中安装html2canvas: npm…

vue实现多线程

vue实现多线程

Vue.js 本身是单线程框架,但可以通过以下方法实现类似多线程的效果或利用浏览器多线程能力: 使用 Web Worker Web Worker 是浏览器提供的多线程 API,适合处理 CPU 密集…

vue实现登录检验

vue实现登录检验

实现登录状态检验的方法 在Vue中实现登录状态检验通常涉及前端路由守卫、Token验证以及与后端的交互。以下是几种常见的方法: 使用路由守卫进行登录验证 通过Vue Router的beforeEac…