当前位置:首页 > VUE

vue实现搜索高亮

2026-03-29 18:45:25VUE

实现搜索高亮的方法

使用 v-html 和正则表达式

通过正则表达式匹配关键词并替换为高亮标签,结合 v-html 渲染结果。

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

<script>
export default {
  data() {
    return {
      content: '这里是需要被搜索的文本内容',
      searchText: ''
    };
  },
  computed: {
    highlightedContent() {
      if (!this.searchText) return this.content;
      const regex = new RegExp(this.searchText, 'gi');
      return this.content.replace(regex, match => 
        `<span style="background-color: yellow">${match}</span>`
      );
    }
  }
};
</script>

使用自定义指令

封装高亮逻辑为自定义指令,增强复用性。

<template>
  <div>
    <input v-model="searchText" />
    <div v-highlight="searchText">{{ content }}</div>
  </div>
</template>

<script>
export default {
  directives: {
    highlight: {
      updated(el, binding) {
        const text = el.textContent;
        if (!binding.value) {
          el.innerHTML = text;
          return;
        }
        const regex = new RegExp(binding.value, 'gi');
        el.innerHTML = text.replace(regex, match => 
          `<span style="background-color: yellow">${match}</span>`
        );
      }
    }
  },
  data() {
    return {
      content: '示例文本内容',
      searchText: ''
    };
  }
};
</script>

使用第三方库

借助 mark.js 实现更复杂的高亮效果。

<template>
  <div>
    <input v-model="searchText" />
    <div ref="content">需要高亮的文本内容</div>
  </div>
</template>

<script>
import Mark from 'mark.js';
export default {
  data() {
    return {
      searchText: ''
    };
  },
  watch: {
    searchText(newVal) {
      const markInstance = new Mark(this.$refs.content);
      markInstance.unmark();
      if (newVal) markInstance.mark(newVal);
    }
  }
};
</script>

动态样式类名

通过动态绑定类名实现高亮样式切换。

<template>
  <div>
    <input v-model="searchText" />
    <div :class="{ 'highlight': searchText }">{{ content }}</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      content: '动态样式类名示例',
      searchText: ''
    };
  }
};
</script>

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

高亮组件封装

将高亮逻辑抽象为独立组件,提高可维护性。

<template>
  <div>
    <input v-model="searchText" />
    <Highlight :text="content" :query="searchText" />
  </div>
</template>

<script>
import Highlight from './Highlight.vue';
export default {
  components: { Highlight },
  data() {
    return {
      content: '组件封装示例',
      searchText: ''
    };
  }
};
</script>

Highlight.vue 中实现核心逻辑:

vue实现搜索高亮

<template>
  <div v-html="highlightedText"></div>
</template>

<script>
export default {
  props: ['text', 'query'],
  computed: {
    highlightedText() {
      if (!this.query) return this.text;
      const regex = new RegExp(this.query, 'gi');
      return this.text.replace(regex, match => 
        `<span class="highlight">${match}</span>`
      );
    }
  }
};
</script>

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

注意事项

  • 使用 v-html 时需防范 XSS 攻击,确保内容可信。
  • 正则表达式需处理特殊字符,避免匹配错误。
  • 高亮样式可根据需求自定义颜色或动画效果。

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

相关文章

vue请求实现进度条

vue请求实现进度条

实现请求进度条的方法 在Vue中实现请求进度条可以通过多种方式完成,常见的有使用第三方库如axios结合nprogress或自定义进度条组件。以下是几种实现方法: 使用axios和nprogress…

vue实现跑车

vue实现跑车

Vue 实现跑车动画效果 使用 Vue 结合 CSS 动画可以实现跑车在屏幕上移动的效果。以下是一个完整的实现方案: 创建 Vue 组件结构 <template> <div c…

vue实现通知

vue实现通知

Vue 实现通知功能的方法 使用 Vue 实现通知功能可以通过多种方式实现,以下是一些常见的方法: 使用 Vue 的全局事件总线 在 Vue 中可以通过事件总线实现通知功能。创建一个全局事件总线,然…

vue轮播实现

vue轮播实现

Vue 轮播实现方法 使用第三方库(推荐) 安装 swiper 或 vue-awesome-swiper 库,快速实现功能丰富的轮播效果。 以 vue-awesome-swiper 为例: npm…

vue实现前端录制

vue实现前端录制

Vue 实现前端录制功能 前端录制通常包括音频、视频或屏幕录制,结合Vue框架可以通过浏览器API实现。以下是几种常见录制场景的实现方法: 音频录制 使用浏览器MediaRecorder API实现…

vue 实现 input focus

vue 实现 input focus

实现 Input Focus 的方法 在 Vue 中实现 input 元素的聚焦可以通过以下几种方式完成。 使用 ref 和 $refs 通过 ref 属性标记 input 元素,然后在 Vue 实…