当前位置:首页 > VUE

vue实现input搜索功能

2026-02-23 17:14:59VUE

实现基础搜索功能

在Vue中实现input搜索功能可以通过v-model绑定输入值,结合计算属性或方法过滤数据。以下是一个基础实现示例:

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

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

添加防抖优化性能

频繁触发搜索会影响性能,可以使用lodash的debounce方法实现防抖:

vue实现input搜索功能

import { debounce } from 'lodash'

export default {
  data() {
    return {
      searchQuery: '',
      filteredItems: []
    }
  },
  watch: {
    searchQuery: debounce(function(newVal) {
      this.filterItems(newVal)
    }, 500)
  },
  methods: {
    filterItems(query) {
      this.filteredItems = this.items.filter(item =>
        item.name.toLowerCase().includes(query.toLowerCase())
      )
    }
  }
}

异步搜索API数据

当需要从API获取搜索结果时,可以使用axios等HTTP库:

export default {
  methods: {
    async searchItems() {
      try {
        const response = await axios.get('/api/items', {
          params: { q: this.searchQuery }
        })
        this.results = response.data
      } catch (error) {
        console.error('搜索失败:', error)
      }
    }
  },
  watch: {
    searchQuery: 'searchItems'
  }
}

添加加载状态和空状态

改善用户体验,添加加载和空状态提示:

vue实现input搜索功能

<template>
  <div>
    <input v-model="searchQuery" placeholder="搜索..." />
    <div v-if="loading">加载中...</div>
    <div v-else-if="filteredItems.length === 0">没有找到匹配的结果</div>
    <ul v-else>
      <li v-for="item in filteredItems" :key="item.id">
        {{ item.name }}
      </li>
    </ul>
  </div>
</template>

多字段搜索

支持多个字段的搜索功能:

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

使用Vuex管理搜索状态

在大型应用中,可以使用Vuex集中管理搜索状态:

// store.js
export default new Vuex.Store({
  state: {
    searchQuery: '',
    items: []
  },
  getters: {
    filteredItems: state => {
      return state.items.filter(item =>
        item.name.toLowerCase().includes(state.searchQuery.toLowerCase())
      )
    }
  }
})
<!-- 组件中使用 -->
<template>
  <input v-model="searchQuery" @input="updateSearch" />
</template>

<script>
import { mapState, mapGetters } from 'vuex'

export default {
  computed: {
    ...mapState(['items']),
    ...mapGetters(['filteredItems']),
    searchQuery: {
      get() { return this.$store.state.searchQuery },
      set(value) { this.$store.commit('UPDATE_SEARCH', value) }
    }
  }
}
</script>

标签: 搜索功能vue
分享给朋友:

相关文章

vue多选实现

vue多选实现

Vue 多选实现方法 基础实现(v-model + multiple) 在 Vue 中实现多选可以通过 <select> 元素的 multiple 属性结合 v-model 完成。v-mo…

vue 实现上传

vue 实现上传

Vue 实现文件上传 使用 Vue 实现文件上传可以通过原生 HTML 的 <input type="file"> 或第三方库(如 axios、vue-upload-component)完…

vue模版实现

vue模版实现

Vue 模板实现方法 Vue 模板是 Vue.js 的核心特性之一,用于声明式地将 DOM 绑定至底层 Vue 实例的数据。以下是几种常见的 Vue 模板实现方式: 单文件组件(SFC) 使用 .v…

vue实现openoffice

vue实现openoffice

Vue 中集成 OpenOffice 的实现方法 在 Vue 项目中集成 OpenOffice 通常需要通过后端服务或现有库实现文档的预览和编辑功能。以下是几种常见的实现方式: 使用 OnlyOff…

vue实现秒表

vue实现秒表

实现秒表功能 在Vue中实现秒表功能需要处理时间显示、开始、暂停和重置逻辑。以下是具体实现方式: 基础实现代码 <template> <div> <div&…

vue实现type切换

vue实现type切换

Vue 实现 Type 切换的实现方法 在 Vue 中实现 Type 切换功能可以通过动态组件、条件渲染或路由切换等方式实现。以下是几种常见方法: 使用 v-if 或 v-show 条件渲染 通过绑…