当前位置:首页 > VUE

vue实现商品搜索

2026-02-17 01:50:01VUE

实现商品搜索功能

在Vue中实现商品搜索功能,可以通过以下方法完成。这里假设有一个商品列表数据,需要实现前端搜索过滤功能。

基础实现方案

创建计算属性过滤商品列表

<template>
  <div>
    <input v-model="searchQuery" placeholder="搜索商品...">
    <ul>
      <li v-for="product in filteredProducts" :key="product.id">
        {{ product.name }} - {{ product.price }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: '',
      products: [
        { id: 1, name: '手机', price: 2999 },
        { id: 2, name: '笔记本电脑', price: 5999 },
        { id: 3, name: '耳机', price: 399 }
      ]
    }
  },
  computed: {
    filteredProducts() {
      return this.products.filter(product => {
        return product.name.toLowerCase().includes(
          this.searchQuery.toLowerCase()
        )
      })
    }
  }
}
</script>

增强搜索功能

添加多字段搜索和防抖优化

<template>
  <div>
    <input 
      v-model="searchQuery" 
      placeholder="搜索商品名称或描述..."
      @input="onSearchInput"
    >
  </div>
</template>

<script>
import { debounce } from 'lodash'

export default {
  data() {
    return {
      searchQuery: '',
      products: [],
      allProducts: []
    }
  },
  created() {
    this.fetchProducts()
  },
  methods: {
    fetchProducts() {
      // API调用获取所有商品
      this.allProducts = [
        { id: 1, name: '手机', description: '智能手机', price: 2999 },
        { id: 2, name: '笔记本', description: '轻薄本', price: 5999 }
      ]
      this.products = [...this.allProducts]
    },
    searchProducts: debounce(function() {
      const query = this.searchQuery.toLowerCase()
      if (!query) {
        this.products = [...this.allProducts]
        return
      }

      this.products = this.allProducts.filter(product => {
        return (
          product.name.toLowerCase().includes(query) ||
          product.description.toLowerCase().includes(query)
        )
      })
    }, 300),
    onSearchInput() {
      this.searchProducts()
    }
  }
}
</script>

服务端搜索实现

对于大量数据,建议使用服务端搜索

<template>
  <div>
    <input 
      v-model="searchQuery" 
      placeholder="搜索商品..."
      @input="onSearchInput"
    >
    <div v-if="loading">加载中...</div>
    <ul v-else>
      <li v-for="product in products" :key="product.id">
        {{ product.name }}
      </li>
    </ul>
  </div>
</template>

<script>
import axios from 'axios'
import { debounce } from 'lodash'

export default {
  data() {
    return {
      searchQuery: '',
      products: [],
      loading: false
    }
  },
  methods: {
    fetchProducts: debounce(async function() {
      if (!this.searchQuery.trim()) {
        this.products = []
        return
      }

      this.loading = true
      try {
        const response = await axios.get('/api/products/search', {
          params: { q: this.searchQuery }
        })
        this.products = response.data
      } catch (error) {
        console.error('搜索失败:', error)
      } finally {
        this.loading = false
      }
    }, 500),
    onSearchInput() {
      this.fetchProducts()
    }
  }
}
</script>

高级搜索功能

实现带分类筛选的搜索

<template>
  <div>
    <input v-model="searchQuery" placeholder="商品名称">
    <select v-model="selectedCategory">
      <option value="">所有分类</option>
      <option v-for="cat in categories" :value="cat.id" :key="cat.id">
        {{ cat.name }}
      </option>
    </select>
    <button @click="search">搜索</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: '',
      selectedCategory: '',
      categories: [
        { id: 1, name: '电子产品' },
        { id: 2, name: '家居用品' }
      ],
      products: []
    }
  },
  methods: {
    async search() {
      const params = {
        q: this.searchQuery
      }
      if (this.selectedCategory) {
        params.category = this.selectedCategory
      }

      const response = await axios.get('/api/products/search', { params })
      this.products = response.data
    }
  }
}
</script>

搜索建议功能

实现输入时的搜索建议

vue实现商品搜索

<template>
  <div>
    <input 
      v-model="searchQuery" 
      placeholder="搜索商品..."
      @input="getSuggestions"
    >
    <ul v-if="suggestions.length">
      <li 
        v-for="suggestion in suggestions" 
        :key="suggestion.id"
        @click="selectSuggestion(suggestion)"
      >
        {{ suggestion.name }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: '',
      suggestions: []
    }
  },
  methods: {
    getSuggestions: debounce(async function() {
      if (this.searchQuery.length < 2) {
        this.suggestions = []
        return
      }

      const response = await axios.get('/api/products/suggest', {
        params: { q: this.searchQuery }
      })
      this.suggestions = response.data
    }, 300),
    selectSuggestion(suggestion) {
      this.searchQuery = suggestion.name
      this.suggestions = []
      this.searchProducts()
    }
  }
}
</script>

以上实现方案可根据实际项目需求进行组合和调整。对于小型项目,前端过滤足够;对于大型商品目录,建议使用服务端搜索。防抖函数能优化性能,避免频繁请求。

标签: 商品vue
分享给朋友:

相关文章

vue实现遮罩

vue实现遮罩

Vue 实现遮罩层的方法 在 Vue 中实现遮罩层可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 v-show 或 v-if 控制显示 通过 Vue 的指令动态控制遮罩层的显示与隐藏。…

computed vue 实现

computed vue 实现

computed 在 Vue 中的基本用法 Vue 的 computed 属性用于声明依赖于其他数据的计算属性。当依赖的数据变化时,计算属性会自动重新计算并缓存结果。 export defaul…

vue插件实现

vue插件实现

Vue 插件实现方法 Vue 插件是一种向 Vue 应用程序添加全局功能的机制。插件可以包含全局指令、过滤器、混入、实例方法等。 插件的基本结构 一个 Vue 插件通常是一个对象或函数,需要暴露一个…

vue实现RTMP

vue实现RTMP

Vue 中实现 RTMP 流播放 RTMP(Real-Time Messaging Protocol)是一种用于实时音视频流传输的协议。在 Vue 中实现 RTMP 播放通常需要借助第三方库或播放器。…

vue 实现评分

vue 实现评分

Vue 实现评分功能 在 Vue 中实现评分功能可以通过多种方式完成,包括使用第三方组件库或自定义实现。以下是两种常见的方法: 使用第三方组件库(如 Element UI) Element UI 提…

vue实现curd

vue实现curd

Vue实现CRUD操作 初始化Vue项目 使用Vue CLI创建新项目,安装必要依赖如axios用于HTTP请求 vue create crud-demo cd crud-demo npm inst…