当前位置:首页 > VUE

vue搜索功能实现

2026-01-08 04:34:56VUE

Vue搜索功能实现方法

在Vue中实现搜索功能可以通过多种方式完成,以下是几种常见的方法:

使用计算属性实现搜索

计算属性非常适合处理需要根据输入值动态过滤数据的情况。创建一个计算属性,根据搜索关键词返回过滤后的列表。

<template>
  <input v-model="searchQuery" placeholder="Search...">
  <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>

使用watch和methods实现搜索

对于更复杂的搜索逻辑,可以使用watch监听搜索词变化,并调用methods中的方法处理数据。

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

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

使用Vuex管理搜索状态

在大型应用中,可以使用Vuex集中管理搜索状态和逻辑。

// store.js
export default new Vuex.Store({
  state: {
    searchQuery: '',
    items: [
      { id: 1, name: 'Apple' },
      { id: 2, name: 'Banana' },
      { id: 3, name: 'Orange' }
    ]
  },
  getters: {
    filteredItems: state => {
      return state.items.filter(item =>
        item.name.toLowerCase().includes(state.searchQuery.toLowerCase())
      )
    }
  },
  mutations: {
    setSearchQuery(state, query) {
      state.searchQuery = query
    }
  }
})

// Component
<template>
  <input 
    :value="searchQuery" 
    @input="updateSearchQuery($event.target.value)" 
    placeholder="Search..."
  >
  <ul>
    <li v-for="item in filteredItems" :key="item.id">
      {{ item.name }}
    </li>
  </ul>
</template>

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

export default {
  computed: {
    ...mapGetters(['filteredItems']),
    searchQuery() {
      return this.$store.state.searchQuery
    }
  },
  methods: {
    ...mapMutations(['setSearchQuery']),
    updateSearchQuery(query) {
      this.setSearchQuery(query)
    }
  }
}
</script>

实现防抖搜索

对于性能优化,可以添加防抖功能,避免频繁触发搜索逻辑。

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

<script>
import _ from 'lodash'

export default {
  data() {
    return {
      searchQuery: '',
      filteredItems: [],
      items: [
        { id: 1, name: 'Apple' },
        { id: 2, name: 'Banana' },
        { id: 3, name: 'Orange' }
      ]
    }
  },
  watch: {
    searchQuery: _.debounce(function(newVal) {
      this.filterItems(newVal)
    }, 500)
  },
  methods: {
    filterItems(query) {
      this.filteredItems = this.items.filter(item =>
        item.name.toLowerCase().includes(query.toLowerCase())
      )
    }
  },
  created() {
    this.filteredItems = [...this.items]
  }
}
</script>

服务器端搜索实现

对于大量数据,可以实现服务器端搜索,通过API请求获取搜索结果。

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

<script>
import axios from 'axios'

export default {
  data() {
    return {
      searchQuery: '',
      searchResults: []
    }
  },
  methods: {
    search: _.debounce(function() {
      if (this.searchQuery.length < 2) {
        this.searchResults = []
        return
      }
      axios.get('/api/search', {
        params: {
          q: this.searchQuery
        }
      }).then(response => {
        this.searchResults = response.data
      })
    }, 500)
  }
}
</script>

以上方法可以根据具体需求选择使用,计算属性方式适合简单客户端搜索,Vuex适合大型应用状态管理,服务器端搜索适合处理大量数据。

vue搜索功能实现

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

相关文章

vue实现菜单调用

vue实现菜单调用

Vue 实现动态菜单的常见方法 基于路由配置生成菜单 Vue Router 的路由配置可以天然转化为菜单结构,适合权限与路由绑定的系统: // router/index.js const rout…

vue实现后退

vue实现后退

Vue 实现后退功能的方法 在 Vue 中实现后退功能通常可以通过以下几种方式完成,具体取决于应用场景和需求。 使用 window.history API 通过原生 JavaScript 的 wi…

vue实现语音

vue实现语音

Vue 实现语音功能的方法 使用 Web Speech API Vue 可以结合 Web Speech API 实现语音识别和合成功能。Web Speech API 包含 SpeechRecognit…

vue实现drag

vue实现drag

Vue 实现拖拽功能的方法 在 Vue 中实现拖拽功能可以通过原生 HTML5 的拖拽 API 或第三方库如 vuedraggable 来完成。以下是两种常见方法的实现方式。 使用 HTML5 拖…

vue实现路由

vue实现路由

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

vue实现导航

vue实现导航

使用 Vue Router 实现导航 Vue Router 是 Vue.js 官方提供的路由管理器,用于构建单页应用(SPA)的导航系统。以下是实现导航的基本步骤。 安装 Vue Router n…