当前位置:首页 > VUE

vue实现商品搜索

2026-02-17 01:50:01VUE

实现商品搜索功能

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

基础实现方案

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

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>

服务端搜索实现

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

vue实现商品搜索

<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>

搜索建议功能

实现输入时的搜索建议

<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-if或v-show控制组件显示/隐藏,适用于局部组件:…

vue实现rtc

vue实现rtc

Vue 实现 RTC 的步骤 安装依赖 在 Vue 项目中安装 WebRTC 相关依赖,如 simple-peer 或 peerjs,用于简化 WebRTC 的实现。 运行以下命令安装 simple-…

通过vue实现

通过vue实现

Vue 实现方法 安装 Vue 确保已安装 Node.js 和 npm,通过以下命令安装 Vue CLI: npm install -g @vue/cli 创建 Vue 项目 使用 Vue CLI…

vue实现波形

vue实现波形

实现波形效果的方法 在Vue中实现波形效果可以通过多种方式完成,常见的方法包括使用Canvas绘制、CSS动画或第三方库。以下是几种实现方案: 使用Canvas绘制波形 通过Canvas API动态…

vue实现树

vue实现树

Vue 实现树形结构的方法 使用递归组件实现树形结构 递归组件是Vue中实现树形结构的常见方式。通过组件调用自身,可以轻松构建多层嵌套的树形数据。 <template> <ul…

vue实现uuid

vue实现uuid

使用 uuid 库生成 UUID 在 Vue 项目中,可以使用 uuid 库来生成 UUID。安装依赖: npm install uuid 在 Vue 组件中使用: import { v4 as…