vue实现搜索关键词高亮的详细教程

下面是“vue实现搜索关键词高亮的详细教程”的完整攻略。

一、需求分析

我们需要实现一个搜索功能,在用户搜索关键词后,将页面中匹配到的关键词高亮显示。

二、实现过程

1. HTML结构

首先,我们需要在HTML中准备好需要搜索的容器,并且将搜索结果渲染到容器中。

<div class="search-container">
  <!-- 用于显示搜索结果的容器 -->
  <ul class="search-ul">
    <li v-for="(result, index) in searchResults" :key="index">
      <!-- 高亮显示关键词的地方 -->
      <span v-html="result.highlight"></span>
    </li>
  </ul>

  <!-- 搜索框 -->
  <input type="text" v-model="keyword" @keyup="searchKeyword" placeholder="请输入搜索关键词" />
</div>

在上述HTML结构中,我们准备了一个包含搜索结果和搜索框的容器。搜索结果由一个ul列表表示,我们使用v-for指令将搜索结果渲染到列表中。在每个搜索结果li元素中,我们使用v-html指令来显示高亮的搜索关键词。

2. 数据结构定义

接下来,我们需要定义搜索结果的数据结构。我们使用关键词keyword来匹配数据,匹配成功后将搜索结果保存在searchResults数组中。每个搜索结果对象包含一个原始文本和一个高亮显示的文本。

data() {
  return {
    keyword: '', // 搜索关键词
    searchResults: [] // 搜索结果
  }
}

3. 搜索方法实现

现在我们需要实现searchKeyword方法,这个方法将在用户输入关键词后触发,将搜索结果保存在searchResults数组中。

methods: {
  searchKeyword() {
    // 清空之前的搜索结果
    this.searchResults = []

    // 如果关键词为空,则不进行搜索
    if (!this.keyword.trim()) {
      return
    }

    // 定义正则表达式,进行匹配
    const regEx = new RegExp(this.keyword, 'gi')

    // 遍历数据,匹配关键词
    this.dataList.forEach(originalData => {
      const result = {}

      if (originalData.title.match(regEx)) {
        result.title = originalData.title.replace(regEx, '<b class="highlight">$&</b>')
      } else {
        result.title = originalData.title
      }

      if (originalData.content.match(regEx)) {
        result.content = originalData.content.replace(regEx, '<b class="highlight">$&</b>')
      } else {
        result.content = originalData.content
      }

      this.searchResults.push(result)
    })
  }
}

在上述代码中,我们先清空searchResults数组,然后检查搜索关键词是否非空。接着,使用RegExp对象定义一个正则表达式,进行关键词匹配。遍历数据列表,使用match方法进行匹配,将匹配到的关键词用html标签高亮显示。最后,将搜索结果保存在searchResults数组中。

4. CSS样式设置

最后,我们需要对高亮的关键词进行CSS样式的设置,使其明显突出。

.highlight {
  color: red;
}

三、示例

下面我们来看两个示例,分别是实现搜索歌曲和搜索文章的功能。

示例1:搜索歌曲

假设我们有一个歌曲列表,列表中包含歌曲名称和歌手名称。用户可以搜索歌曲或歌手名称,将匹配到的歌曲名称和歌手名称高亮显示。

HTML结构

<div class="search-container">
  <!-- 用于显示搜索结果的容器 -->
  <ul class="search-ul">
    <li v-for="(result, index) in searchResults" :key="index">
      <!-- 高亮显示歌曲名称的地方 -->
      <span v-html="result.songNameHighlight"></span>
      -
      <!-- 高亮显示歌手名称的地方 -->
      <span v-html="result.singerNameHighlight"></span>
    </li>
  </ul>

  <!-- 搜索框 -->
  <input type="text" v-model="keyword" @keyup="searchKeyword" placeholder="请输入搜索关键词" />
</div>

数据结构定义

data() {
  return {
    keyword: '', // 搜索关键词
    searchResults: [], // 搜索结果
    dataList: [ // 歌曲列表数据
      { songName: '稻香', singerName: '周杰伦' },
      { songName: '听妈妈的话', singerName: '周杰伦' },
      { songName: '晴天', singerName: '周杰伦' },
      { songName: '七里香', singerName: '周杰伦' },
      { songName: '告白气球', singerName: '周杰伦' },
      { songName: '爱情转移', singerName: '陈奕迅' },
      { songName: '一路向北', singerName: '周杰伦' },
      { songName: '以父之名', singerName: '周杰伦' },
      { songName: '牛仔很忙', singerName: '周杰伦' },
      { songName: '青花瓷', singerName: '周杰伦' }
    ]
  }
}

搜索方法实现

methods: {
  searchKeyword() {
    // 清空之前的搜索结果
    this.searchResults = []

    // 如果关键词为空,则不进行搜索
    if (!this.keyword.trim()) {
      return
    }

    // 定义正则表达式,进行匹配
    const regEx = new RegExp(this.keyword, 'gi')

    // 遍历数据,匹配关键词
    this.dataList.forEach(data => {
      const result = {}

      if (data.songName.match(regEx)) {
        // 高亮歌曲名称
        result.songNameHighlight = data.songName.replace(regEx, '<b class="highlight">$&</b>')
      } else {
        result.songNameHighlight = data.songName
      }

      if (data.singerName.match(regEx)) {
        // 高亮歌手名称
        result.singerNameHighlight = data.singerName.replace(regEx, '<b class="highlight">$&</b>')
      } else {
        result.singerNameHighlight = data.singerName
      }

      this.searchResults.push(result)
    })
  }
}

CSS样式设置

.highlight {
  color: red;
}

示例2:搜索文章

假设我们有一个博客文章列表,列表中包含文章标题和文章内容。用户可以搜索文章标题或文章内容,将匹配到的标题和内容高亮显示。

HTML结构

<div class="search-container">
  <!-- 用于显示搜索结果的容器 -->
  <ul class="search-ul">
    <li v-for="(result, index) in searchResults" :key="index">
      <!-- 高亮显示文章标题的地方 -->
      <span v-html="result.titleHighlight"></span>
      <br />
      <!-- 高亮显示文章内容的地方 -->
      <span v-html="result.contentHighlight"></span>
    </li>
  </ul>

  <!-- 搜索框 -->
  <input type="text" v-model="keyword" @keyup="searchKeyword" placeholder="请输入搜索关键词" />
</div>

数据结构定义

data() {
  return {
    keyword: '', // 搜索关键词
    searchResults: [], // 搜索结果
    dataList: [ // 文章列表数据
      { title: '如何学习JavaScript', content: 'JavaScript是一门动态、弱类型的编程语言...' },
      { title: 'Vue.js教程', content: 'Vue.js是一款渐进式JavaScript框架...' },
      { title: 'React教程', content: 'React是由Facebook开发的一款JavaScript库...' },
      { title: 'JavaScript基础知识', content: 'JavaScript是一门动态、弱类型的编程语言...' },
      { title: '前端工程化实践', content: '前端工程化是指将开发中的业务逻辑和功能,...' },
      { title: 'Node.js基础知识', content: 'Node.js是一个基于Chrome V8引擎的JavaScript运行环境...' }
    ]
  }
}

搜索方法实现

methods: {
  searchKeyword() {
    // 清空之前的搜索结果
    this.searchResults = []

    // 如果关键词为空,则不进行搜索
    if (!this.keyword.trim()) {
      return
    }

    // 定义正则表达式,进行匹配
    const regEx = new RegExp(this.keyword, 'gi')

    // 遍历数据,匹配关键词
    this.dataList.forEach(data => {
      const result = {}

      if (data.title.match(regEx)) {
        // 高亮文章标题
        result.titleHighlight = data.title.replace(regEx, '<b class="highlight">$&</b>')
      } else {
        result.titleHighlight = data.title
      }

      if (data.content.match(regEx)) {
        // 高亮文章内容
        result.contentHighlight = data.content.replace(regEx, '<b class="highlight">$&</b>')
      } else {
        result.contentHighlight = data.content
      }

      this.searchResults.push(result)
    })
  }
}

CSS样式设置

.highlight {
  color: red;
}

四、总结

总体来说,我们实现搜索关键词高亮的功能,需要完成以下步骤:

  1. 在HTML结构中准备好容器,设置搜索框和搜索结果的显示方式;
  2. 定义数据结构,包含原始文本和高亮文本;
  3. 实现搜索方法,使用正则表达式进行关键词匹配,通过html标签将匹配的关键词高亮显示;
  4. 设置CSS样式,对高亮显示的关键词进行样式设置。

这项工作在Vue.js中实现非常简单,通过指令和数据绑定,我们可以轻松地实现搜索关键词高亮这一功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue实现搜索关键词高亮的详细教程 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • Vue中render方法的使用详解

    接下来我将详细讲解“Vue中render方法的使用详解”的完整攻略。 什么是render方法? render 方法是 Vue 2.0 中引入的一个新特性,主要作用是代替模板,通过 render 方法直接操作 DOM 元素。采用 render 方法编写组件的方式被称为函数式编程,相对于之前的声明式编程方式,具有更强的可控性和扩展性。 render方法的参数 r…

    Vue 2023年5月28日
    00
  • vue组件传值(高级)、属性传值、反向传值、跨级传值实例详解

    Vue组件传值(高级)、属性传值、反向传值、跨级传值实例详解 在Vue中,组件传值是必不可少的一部分。组件间的传值分为父子组件传值、同级组件传值以及跨级传值等等,下面将详细介绍Vue组件传值的不同方式和实例。 属性传值 属性传值是父组件向子组件传递数据的一种方式,通过在父组件中使用子组件时设置props属性并传入数据,子组件在接收到数据后可以通过this.p…

    Vue 2023年5月27日
    00
  • Vue详细讲解Vuex状态管理的实现

    Vue详细讲解Vuex状态管理的实现 什么是Vuex Vuex是Vue.js的官方状态管理插件,它将组件之间共享的状态抽取出来,以一个全局单例模式管理,实现了在共享状态时一些问题的规避,使代码更容易理解和维护。 Vuex的状态管理机制 Vuex的状态管理机制可以从以下三个方面来解释: State 状态是存储在Vuex store上的单一状态树,相当于Vue模…

    Vue 2023年5月27日
    00
  • vue.js实现只能输入数字的输入框

    实现只能输入数字的输入框可以通过如下步骤来完成: 步骤一:定义只允许输入数字的指令 在Vue.js中,我们可以通过定义指令来限制输入框的输入内容。下面是一个自定义的v-only-number指令,它可以确保输入框只接受数字: <template> <div> <input v-only-number type="tex…

    Vue 2023年5月27日
    00
  • Vue前端框架搭建过程

    下面是关于”Vue前端框架搭建过程”的完整攻略: 1. 准备工作 1.1 下载安装Node.js 首先,我们需要确保电脑中已经安装了Node.js的环境,如果还没有,可以在官网上下载并安装。 Node.js官网:https://nodejs.org/en/ 安装完成后,可以在终端或命令行中输入以下命令,检查Node.js版本: node -v 1.2 安装V…

    Vue 2023年5月27日
    00
  • 在vue项目中优雅的使用SVG的方法实例详解

    让我来为你详细讲解一下在Vue项目中优雅地使用SVG的方法。 在Vue项目中优雅地使用SVG的方法 什么是SVG? SVG(Scalable Vector Graphics)是一种基于XML语法的矢量图形格式,用于描述二维图形和绘图程序。相对于传统的像素图形格式(如JPG、PNG、BMP等),SVG图像拥有无限的放大缩小比例,因此可以良好地适应各种分辨率的设…

    Vue 2023年5月28日
    00
  • vue预览 pdf、word、xls、ppt、txt文件的实现方法

    实现网页预览PDF、Word、Excel、PPT、TXT等各种文件格式,一般需要使用第三方库进行实现。本文将介绍如何使用Vue和依赖库来预览这些文件格式。 1. 安装vue2-pdf预览库 Vue2-pdf 是一个基于 Vue 2.0 开发的 PDF 预览组件,支持PDF的浏览、缩放、翻页和导出等操作。具体实现步骤: 安装依赖 npm install vue…

    Vue 2023年5月28日
    00
  • vue button的@click方法无效钩子函数没有执行问题

    以下是详细讲解“vue button的@click方法无效钩子函数没有执行问题”的完整攻略。 问题描述 在Vue中使用按钮监听点击事件时,有时会出现@click方法无效的情况。此时,钩子函数也不会执行,导致按钮无法正常工作。这种情况是什么原因引起的呢? 解决方案 出现上述问题时,需要检查以下几点: 1、确保按钮的点击事件和钩子函数定义在同一组件内 如果按钮和…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部