当前位置:首页 > 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>

搜索建议功能

实现输入时的搜索建议

<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实现iframe

vue实现iframe

Vue 中实现 iframe 的方法 在 Vue 项目中,可以通过多种方式实现 iframe 的嵌入。以下是几种常见的方法: 使用原生 HTML iframe 标签 直接在 Vue 组件的模板中使…

vue 实现pdf

vue 实现pdf

在Vue中实现PDF功能 在Vue项目中实现PDF功能通常涉及PDF生成、预览或下载。以下是几种常见实现方式: 使用vue-pdf库预览PDF 安装依赖: npm install vue-pdf…

vue实现画图

vue实现画图

Vue 实现画图功能 在 Vue 中实现画图功能通常需要结合 HTML5 的 <canvas> 元素或第三方库。以下是几种常见的方法: 使用原生 Canvas API 通过 Vue 直接…

vue实现素材

vue实现素材

Vue 实现素材的方法 使用 Vue 组件管理素材 在 Vue 项目中,可以通过组件化的方式管理素材。创建一个专门的组件来加载和显示素材,例如图片、视频或音频文件。组件可以接收素材的路径或 URL 作…

vue 实现视频

vue 实现视频

Vue 实现视频播放功能 使用 Vue 实现视频播放功能可以通过 HTML5 的 <video> 标签或第三方库(如 video.js)来实现。以下是两种常见的方法: 使用 HTML5…

vue实现抽奖

vue实现抽奖

Vue 实现抽奖功能 基本抽奖逻辑 创建一个Vue组件,包含奖品列表、抽奖按钮和结果显示区域。使用随机数生成器选择奖品。 <template> <div> <…