当前位置:首页 > VUE

vue 实现搜索

2026-01-13 01:00:06VUE

Vue 实现搜索功能

基础搜索实现

在 Vue 中实现搜索功能通常需要结合 v-model 和计算属性或方法过滤数据。以下是一个基础实现示例:

vue 实现搜索

<template>
  <div>
    <input v-model="searchQuery" placeholder="Search..." />
    <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: 'Apple' },
        { id: 2, name: 'Banana' },
        { id: 3, name: 'Orange' }
      ]
    }
  },
  computed: {
    filteredItems() {
      return this.items.filter(item =>
        item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
      )
    }
  }
}
</script>

异步搜索实现

对于需要从API获取搜索结果的场景,可以使用 watchmethods 配合防抖:

vue 实现搜索

<template>
  <div>
    <input v-model="searchQuery" placeholder="Search..." />
    <ul v-if="results.length">
      <li v-for="result in results" :key="result.id">
        {{ result.title }}
      </li>
    </ul>
    <p v-else>No results found</p>
  </div>
</template>

<script>
import _ from 'lodash'

export default {
  data() {
    return {
      searchQuery: '',
      results: []
    }
  },
  watch: {
    searchQuery: _.debounce(function(newVal) {
      if (newVal.length > 2) {
        this.searchAPI(newVal)
      }
    }, 500)
  },
  methods: {
    async searchAPI(query) {
      try {
        const response = await fetch(`https://api.example.com/search?q=${query}`)
        this.results = await response.json()
      } catch (error) {
        console.error(error)
      }
    }
  }
}
</script>

高级搜索功能

实现多条件搜索可以结合多个输入字段和更复杂的过滤逻辑:

<template>
  <div>
    <input v-model="filters.name" placeholder="Name" />
    <select v-model="filters.category">
      <option value="">All Categories</option>
      <option value="fruit">Fruit</option>
      <option value="vegetable">Vegetable</option>
    </select>

    <ul>
      <li v-for="item in filteredItems" :key="item.id">
        {{ item.name }} ({{ item.category }})
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      filters: {
        name: '',
        category: ''
      },
      items: [
        { id: 1, name: 'Apple', category: 'fruit' },
        { id: 2, name: 'Carrot', category: 'vegetable' },
        { id: 3, name: 'Orange', category: 'fruit' }
      ]
    }
  },
  computed: {
    filteredItems() {
      return this.items.filter(item => {
        const nameMatch = item.name.toLowerCase().includes(
          this.filters.name.toLowerCase()
        )
        const categoryMatch = !this.filters.category || 
          item.category === this.filters.category
        return nameMatch && categoryMatch
      })
    }
  }
}
</script>

使用Vuex管理搜索状态

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

// store.js
export default new Vuex.Store({
  state: {
    searchQuery: '',
    searchResults: []
  },
  mutations: {
    SET_SEARCH_QUERY(state, query) {
      state.searchQuery = query
    },
    SET_SEARCH_RESULTS(state, results) {
      state.searchResults = results
    }
  },
  actions: {
    async search({ commit, state }) {
      if (state.searchQuery.length > 2) {
        const response = await fetch(`/api/search?q=${state.searchQuery}`)
        commit('SET_SEARCH_RESULTS', await response.json())
      }
    }
  }
})

组件中使用Vuex搜索

<template>
  <div>
    <input 
      v-model="searchQuery" 
      @input="updateSearch"
      placeholder="Search..."
    />
    <ul>
      <li v-for="result in searchResults" :key="result.id">
        {{ result.name }}
      </li>
    </ul>
  </div>
</template>

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

export default {
  computed: {
    ...mapState(['searchResults']),
    searchQuery: {
      get() {
        return this.$store.state.searchQuery
      },
      set(value) {
        this.$store.commit('SET_SEARCH_QUERY', value)
      }
    }
  },
  methods: {
    ...mapActions(['search']),
    updateSearch() {
      this.search()
    }
  }
}
</script>

这些方法涵盖了从基础到高级的Vue搜索实现,可以根据具体需求选择合适的方案。

标签: vue
分享给朋友:

相关文章

vue 实现多选

vue 实现多选

Vue 实现多选的方法 在 Vue 中实现多选功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 v-model 绑定数组 Vue 的 v-model 指令可以与复选框结合使用,绑定到一个数…

vue实现图片搜索

vue实现图片搜索

Vue实现图片搜索功能 使用HTML5的File API获取图片 通过<input type="file">元素让用户选择图片文件,使用FileReader对象读取图片数据。 <t…

vue实现多选联动

vue实现多选联动

vue实现多选联动的方法 使用v-model绑定数组 在Vue中,可以通过v-model绑定一个数组来实现多选联动。当复选框被选中或取消选中时,数组会自动更新。 <template>…

vue伪函数实现

vue伪函数实现

Vue 伪函数实现方法 伪函数(Mock Function)在 Vue 中常用于测试或模拟某些逻辑,以下是几种常见的实现方式: 使用 Jest 的 jest.fn() 在单元测试中,可以通过 Je…

vue实现多层评论回复

vue实现多层评论回复

Vue 实现多层评论回复 数据结构设计 多层评论通常采用嵌套结构,每个评论对象包含子评论数组。示例数据结构如下: comments: [ { id: 1, content: '…

vue实现滚动截屏

vue实现滚动截屏

实现滚动截屏的基本思路 滚动截屏通常指对超出可视区域的长页面进行完整截图。在Vue中,可以通过结合DOM操作、Canvas绘制及第三方库实现。以下是具体方法: 使用html2canvas库实现 安装…