当前位置:首页 > VUE

vue实现input模糊搜索

2026-02-20 21:48:34VUE

Vue 实现 input 模糊搜索

基本实现思路

在 Vue 中实现 input 模糊搜索通常需要以下几个步骤:监听输入框变化、过滤数据列表、展示搜索结果。以下是一个完整的实现示例。

代码实现

<template>
  <div>
    <input 
      v-model="searchQuery" 
      placeholder="输入关键词搜索" 
      @input="handleSearch"
    />
    <ul v-if="filteredItems.length">
      <li v-for="item in filteredItems" :key="item.id">
        {{ item.name }}
      </li>
    </ul>
    <p v-else>暂无结果</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: '',
      items: [
        { id: 1, name: '苹果' },
        { id: 2, name: '香蕉' },
        { id: 3, name: '橙子' }
      ],
      filteredItems: []
    }
  },
  methods: {
    handleSearch() {
      if (!this.searchQuery) {
        this.filteredItems = this.items;
        return;
      }
      const query = this.searchQuery.toLowerCase();
      this.filteredItems = this.items.filter(item => 
        item.name.toLowerCase().includes(query)
      );
    }
  },
  created() {
    this.filteredItems = this.items;
  }
}
</script>

关键点解析

  • v-model双向绑定:通过 v-model 将输入框的值与 searchQuery 数据绑定。
  • @input事件监听:输入时触发 handleSearch 方法。
  • 数组过滤:使用 filterincludes 方法实现模糊匹配。
  • 大小写处理:统一转为小写避免大小写敏感问题。

优化方向

  1. 防抖处理:频繁输入时使用防抖减少计算次数。

    import { debounce } from 'lodash';
    methods: {
      handleSearch: debounce(function() {
        // 搜索逻辑
      }, 300)
    }
  2. 高亮匹配文本:使用正则表达式实现搜索词高亮。

    <li v-for="item in filteredItems" :key="item.id">
      <span v-html="highlight(item.name, searchQuery)"/>
    </li>
    methods: {
      highlight(text, query) {
        return query 
          ? text.replace(new RegExp(query, 'gi'), match => `<mark>${match}</mark>`)
          : text;
      }
    }
  3. 异步搜索:当数据量较大时改用后端接口搜索。

完整组件示例

// SearchComponent.vue
<template>
  <div class="search-box">
    <input 
      v-model.trim="searchQuery" 
      class="search-input"
      placeholder="输入关键词..."
    />
    <transition-group name="fade" tag="ul" class="results">
      <li v-for="result in results" :key="result.id" @click="selectItem(result)">
        {{ result.text }}
      </li>
    </transition-group>
  </div>
</template>

<script>
export default {
  props: {
    sourceData: Array
  },
  data() {
    return {
      searchQuery: '',
      results: []
    }
  },
  watch: {
    searchQuery(newVal) {
      this.search(newVal)
    }
  },
  methods: {
    search(query) {
      this.results = query 
        ? this.sourceData.filter(item => 
            item.text.toLowerCase().includes(query.toLowerCase())
          )
        : []
    },
    selectItem(item) {
      this.$emit('selected', item)
      this.searchQuery = ''
      this.results = []
    }
  }
}
</script>

<style>
.search-box {
  position: relative;
}
.results {
  position: absolute;
  width: 100%;
}
.fade-enter-active, .fade-leave-active {
  transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
  opacity: 0;
}
</style>

使用注意事项

  • 对于大型数据集建议采用分页加载
  • 移动端需要额外处理虚拟键盘事件
  • 可添加无结果时的默认提示或推荐内容

通过以上方式可以构建一个功能完整的模糊搜索组件,根据实际需求可进一步扩展功能。

vue实现input模糊搜索

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

相关文章

vue实现好友列表

vue实现好友列表

实现好友列表的Vue组件 数据准备 在Vue组件的data中定义好友列表数据,通常是一个数组对象,每个对象包含好友的基本信息如ID、头像、昵称等。 data() { return { f…

vue实现活动倒计时

vue实现活动倒计时

实现活动倒计时的基本思路 在Vue中实现活动倒计时通常需要获取当前时间与活动结束时间的差值,并将其转换为天、小时、分钟、秒的格式展示。通过定时器每秒更新显示的时间。 定义倒计时数据 在Vue组件的d…

vue实现iframe

vue实现iframe

Vue 中实现 iframe 的方法 在 Vue 项目中,可以通过多种方式实现 iframe 的嵌入。以下是几种常见的方法: 使用原生 HTML iframe 标签 直接在 Vue 组件的模板中使…

vue实现slider

vue实现slider

Vue 实现 Slider 组件 使用 Vue 实现 Slider 组件可以通过原生开发或借助第三方库。以下是两种常见方法: 原生实现 Slider 创建一个基础的 Slider 组件,通过 v-…

vue router 实现

vue router 实现

Vue Router 的实现 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是 Vue Router 的核心实现方式。 安装 Vue Router 通过…

vue 动画实现

vue 动画实现

Vue 动画实现方式 Vue 提供了多种方式实现动画效果,主要分为内置组件和第三方库集成。 使用 Vue 内置过渡组件 Vue 的 <transition> 和 <transiti…