weixin_41452476 2023-05-30 09:43 采纳率: 27.3%
浏览 47

vue需求:模糊查询,并且高亮,希望搜索一句话中任意的词,都可以搜索到,

需求:模糊查询,并且高亮,希望搜索一句话中任意的词,都可以搜索到,
需求1举例:比如搜索西,搜索到所有带西的句子,
需求2举例: 搜索西大,可以查询到带有西或者大的句子,并且全部高亮。


<template>
  <div>
    <input v-model="keyword" placeholder="请输入搜索关键字">
    <ul>
      <li v-for="(item, index) in filteredData" :key="index" v-html="highlight(item.text)"></li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      keyword: '',
      data: [
        { text: '西安的城墙很大。' },
        { text: '西安交通大学是一所985高校。' },
        { text: '我喜欢吃西瓜。' },
        { text: '这是一份西式菜谱。' }
      ]
    }
  },
  computed: {
    filteredData() {
      const pattern = new RegExp(this.keyword.split(/\s+/).join('.*'), 'gi');
      return this.data.filter(item => pattern.test(item.text));
    }
  },
  methods: {
    highlight(text) {
      const pattern = new RegExp(this.keyword.split(/\s+/).join('|'), 'gi');
      return text.replace(pattern, '<span style="color: red">$&</span>');
    }
  }
}
</script>
  • 写回答

3条回答 默认 最新

  • 鱼弦 全栈领域优质创作者 2023-05-30 09:59
    关注
    <template>
      <div>
        <input v-model="keyword" @input="search" placeholder="请输入关键词">
        <ul>
          <li v-for="(item, index) in searchResult" :key="index">
            <p v-html="highlight(item)"></p>
          </li>
        </ul>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          keyword: '',
          sourceData: [
            '西风吹老洞庭波,一夜湘君白发多',
            '月落乌啼霜满天,江枫渔火对愁眠',
            '大漠孤烟直,长河落日圆',
            '黄沙百战穿金甲,不破楼兰终不还',
            '故人具鸡黍,邀我至田家',
            '重阳节到处飘香,采菊东篱下',
            '青山遮不住,毕竟东流去'
          ]
        }
      },
      computed: {
        // 搜索结果
        searchResult() {
          const reg = new RegExp(this.keyword, 'gi') // 忽略大小写的正则表达式
          return this.sourceData.filter(item => reg.test(item))
        }
      },
      methods: {
        // 高亮匹配的关键词
        highlight(str) {
          return str.replace(new RegExp(this.keyword, 'gi'), `<span style="color: red">${this.keyword}</span>`)
        },
        // 执行搜索
        search() {
          this.keyword = this.keyword.trim() // 去除首尾空格
        }
      }
    }
    </script>
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月30日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀