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

yizhihongxing

下面是“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路由管理器Vue-router的使用方法详解

    Vue路由管理器Vue-router的使用方法详解 一、Vue-router简介 Vue-router是Vue.js官方的路由管理器,它与Vue.js深度集成,可以方便地实现单页面应用程序(SPA)中的路由控制,同时支持多种路由解析模式,并提供了很多高级功能,如路由嵌套、路由参数、路由导航守卫等。 二、Vue-router的安装和配置 在使用Vue-rout…

    Vue 2023年5月27日
    00
  • vue 实现购物车总价计算

    下面我会详细讲解Vue实现购物车总价计算的完整攻略。 确定购物车数据格式 首先需要明确购物车数据的格式,常见的数据结构是一个数组,每个元素表示一件商品,包含以下字段: { id: String, // 商品id name: String, // 商品名称 price: Number, // 单价 count: Number // 数量 } 创建一个购物车组件…

    Vue 2023年5月29日
    00
  • vue实现简易的计算器功能

    Vue.js 实现简易计算器 在这个例子中,我们将使用Vue.js来构建一个简单的计算器应用。 步骤1:创建Vue实例 首先,我们需要引入Vue.js库。我们可以直接将vue.js文件引入到HTML页面中。 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">&…

    Vue 2023年5月27日
    00
  • 详解django模板与vue.js冲突问题

    我将为你讲解 “详解django模板与vue.js冲突问题”的完整攻略。 在前端开发过程中,我们常常使用前端框架来实现快速的开发,而Vue.js是一款非常流行的前端框架,许多项目中都会使用到它,但是在使用Vue.js的同时又要使用Django模板渲染时,就容易发生冲突问题。 1. Vue.js与Django模板的冲突原因 在Vue.js中,它使用“双花括号”…

    Vue 2023年5月28日
    00
  • Vue.extend构造器的详解

    下面是“Vue.extend构造器的详解”的攻略。 什么是Vue.extend构造器? Vue.extend构造器是Vue.js中的一个重要的API。通过使用Vue.extend构造器,我们可以创建一个Vue.js的子类,也称为Vue组件。Vue组件可以方便地复用,并且可以提高应用程序的性能。 Vue.extend构造器的语法 Vue.extend构造器的语…

    Vue 2023年5月28日
    00
  • vant开发微信小程序安装以及简单使用教程

    安装 (1)首先需要安装Node.js,安装完毕后可以通过以下命令检查Node.js是否安装成功: node -v (2)然后在命令行窗口中输入以下命令,安装@vant/weapp: npm i @vant/weapp -S –production 开发 (1)将vant组件导入小程序中,在需要使用vant的页面的json文件中引入vant组件: { &q…

    Vue 2023年5月27日
    00
  • js前端对于大量数据的展示方式及处理方法

    针对JavaScript前端对于大量数据的展示方式及处理方法,我们可以有以下攻略: 一、数据的分页处理 在面对大量的数据时,我们需要将其分页显示。这样可以减轻前端页面的压力,缩短数据的加载时间。一般情况下,我们将数据按照每页显示的个数进行分页处理,在页面中显示出分页器和分页数据。 示例 我们可以使用Vue.js和Vue-cli进行示例说明。首先,我们需要安装…

    Vue 2023年5月28日
    00
  • vue 之 css module的使用方法

    我来给你详细讲解一下“vue之CSS Module的使用方法”的完整攻略。 1. 什么是CSS Module CSS Module是CSS的一种模块化方案,与其它CSS的模块化方案如Sass、Less等不同的是,它是由JavaScript模块化方案驱动的,而不是依赖于编译器或预处理器。CSS Module可以帮助我们解决CSS全局污染的问题,让我们的CSS样…

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