当前位置:首页 > VUE

vue实现模糊搜索

2026-02-20 02:15:42VUE

实现模糊搜索的基本思路

模糊搜索通常通过监听用户输入,对数据进行筛选匹配。Vue中可以利用计算属性或方法结合数组的filter和字符串的includes(或正则表达式)实现。

使用计算属性实现

通过计算属性动态过滤数据,依赖输入的关键字:

<template>
  <input v-model="searchQuery" placeholder="搜索...">
  <ul>
    <li v-for="item in filteredItems" :key="item.id">{{ item.name }}</li>
  </ul>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: '',
      items: [
        { id: 1, name: 'Apple' },
        { id: 2, name: 'Banana' },
        { id: 3, name: 'Orange' }
      ]
    }
  },
  computed: {
    filteredItems() {
      return this.items.filter(item => 
        item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
      )
    }
  }
}
</script>

使用方法实现

若需更复杂的逻辑(如异步请求),可在方法中处理:

methods: {
  filterItems(query) {
    return this.items.filter(item =>
      item.name.toLowerCase().includes(query.toLowerCase())
    )
  }
}

支持多字段搜索

扩展计算属性,同时匹配多个字段:

computed: {
  filteredItems() {
    const query = this.searchQuery.toLowerCase()
    return this.items.filter(item => 
      item.name.toLowerCase().includes(query) || 
      item.description.toLowerCase().includes(query)
    )
  }
}

使用正则表达式实现高级匹配

通过正则表达式实现更灵活的匹配(如忽略大小写、部分匹配):

computed: {
  filteredItems() {
    const regex = new RegExp(this.searchQuery, 'i')
    return this.items.filter(item => regex.test(item.name))
  }
}

结合第三方库(如Fuse.js)

对于大型数据集或复杂模糊搜索,可使用专用库:

  1. 安装Fuse.js:

    npm install fuse.js
  2. 在组件中使用:

    
    import Fuse from 'fuse.js'

export default { data() { return { fuse: null, searchQuery: '', items: [/ 数据 /] } }, mounted() { this.fuse = new Fuse(this.items, { keys: ['name', 'description'], threshold: 0.4 }) }, computed: { filteredItems() { return this.searchQuery ? this.fuse.search(this.searchQuery).map(r => r.item) : this.items } } }

vue实现模糊搜索


### 性能优化建议

- 对静态数据预建索引(如Fuse.js的`mounted`阶段)
- 使用防抖(lodash的`debounce`)避免频繁触发搜索
- 对于超大数据集考虑分页或虚拟滚动

### 完整示例代码

结合防抖和Fuse.js的完整实现:

```javascript
<template>
  <input 
    v-model="searchQuery" 
    @input="onSearchInput" 
    placeholder="模糊搜索..."
  >
  <ul>
    <li v-for="result in results" :key="result.id">
      {{ result.name }} - {{ result.description }}
    </li>
  </ul>
</template>

<script>
import _ from 'lodash'
import Fuse from 'fuse.js'

export default {
  data() {
    return {
      searchQuery: '',
      items: [/* 原始数据 */],
      fuse: null,
      results: []
    }
  },
  mounted() {
    this.fuse = new Fuse(this.items, {
      keys: ['name', 'description'],
      includeScore: true,
      threshold: 0.4
    })
    this.results = [...this.items]
  },
  methods: {
    onSearchInput: _.debounce(function() {
      this.results = this.searchQuery 
        ? this.fuse.search(this.searchQuery).map(r => r.item)
        : [...this.items]
    }, 300)
  }
}
</script>

标签: 模糊vue
分享给朋友:

相关文章

vue实现收起展开面板

vue实现收起展开面板

实现收起展开面板的方法 在Vue中实现收起展开面板功能可以通过多种方式完成,以下是几种常见的实现方法: 使用v-show或v-if控制显示隐藏 利用Vue的指令可以轻松实现面板的展开和收起: &l…

vue 实现弹幕

vue 实现弹幕

vue 实现弹幕的方法 使用 CSS 动画和动态渲染 在 Vue 中实现弹幕效果,可以通过动态渲染弹幕元素并结合 CSS 动画实现。以下是具体步骤: 数据准备 创建一个数组存储弹幕数据,每条弹幕包…

vue实现公式

vue实现公式

在Vue中实现公式展示或计算可以通过多种方式实现,以下为具体方法: 使用模板插值与计算属性 若公式较简单,可直接在模板中使用插值表达式或计算属性。例如计算圆的面积: <templat…

vue滚动实现

vue滚动实现

Vue 滚动实现方法 使用原生滚动 在 Vue 中可以通过 ref 获取 DOM 元素,调用原生滚动方法实现滚动效果。适用于简单场景。 <template> <div ref=…

vue实现发帖

vue实现发帖

使用 Vue 实现发帖功能 前端实现 创建发帖表单组件,包含标题和内容输入框,以及提交按钮。使用 v-model 绑定表单数据。 <template> <div>…

vue实现画廊

vue实现画廊

Vue实现画廊的基本方法 使用Vue.js实现画廊功能可以通过多种方式完成,以下是一种常见的实现方案: 安装必要依赖 npm install vue-gallery --save 引入组件并注册…