当前位置:首页 > VUE

vue 实现商品列表

2026-03-10 05:47:16VUE

实现商品列表的基本结构

在Vue中实现商品列表,通常需要创建一个组件来展示商品数据。商品数据可以存储在组件的data属性中,或者通过API从后端获取。以下是一个基本的商品列表实现示例:

<template>
  <div class="product-list">
    <div v-for="product in products" :key="product.id" class="product-item">
      <img :src="product.image" :alt="product.name" />
      <h3>{{ product.name }}</h3>
      <p>{{ product.price }}</p>
      <button @click="addToCart(product)">Add to Cart</button>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      products: [
        { id: 1, name: 'Product 1', price: '$10', image: 'image1.jpg' },
        { id: 2, name: 'Product 2', price: '$20', image: 'image2.jpg' },
        { id: 3, name: 'Product 3', price: '$30', image: 'image3.jpg' }
      ]
    }
  },
  methods: {
    addToCart(product) {
      console.log('Added to cart:', product)
    }
  }
}
</script>

<style scoped>
.product-list {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: 20px;
}
.product-item {
  border: 1px solid #ddd;
  padding: 10px;
  text-align: center;
}
</style>

从API获取商品数据

实际项目中,商品数据通常从后端API获取。可以使用axiosfetch来请求数据:

<script>
import axios from 'axios'

export default {
  data() {
    return {
      products: [],
      isLoading: false,
      error: null
    }
  },
  async created() {
    try {
      this.isLoading = true
      const response = await axios.get('https://api.example.com/products')
      this.products = response.data
    } catch (error) {
      this.error = error.message
    } finally {
      this.isLoading = false
    }
  }
}
</script>

添加分页功能

对于大量商品数据,实现分页可以提高性能:

<template>
  <div>
    <product-list :products="currentPageProducts" />
    <div class="pagination">
      <button 
        v-for="page in totalPages" 
        :key="page" 
        @click="currentPage = page"
        :class="{ active: currentPage === page }"
      >
        {{ page }}
      </button>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      products: [], // 所有商品数据
      currentPage: 1,
      itemsPerPage: 10
    }
  },
  computed: {
    totalPages() {
      return Math.ceil(this.products.length / this.itemsPerPage)
    },
    currentPageProducts() {
      const start = (this.currentPage - 1) * this.itemsPerPage
      const end = start + this.itemsPerPage
      return this.products.slice(start, end)
    }
  }
}
</script>

实现商品搜索和过滤

添加搜索和过滤功能可以让用户更容易找到所需商品:

<template>
  <div>
    <input v-model="searchQuery" placeholder="Search products..." />
    <select v-model="selectedCategory">
      <option value="">All Categories</option>
      <option v-for="category in categories" :value="category">
        {{ category }}
      </option>
    </select>

    <product-list :products="filteredProducts" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: '',
      selectedCategory: '',
      categories: ['Electronics', 'Clothing', 'Books']
    }
  },
  computed: {
    filteredProducts() {
      return this.products.filter(product => {
        const matchesSearch = product.name.toLowerCase().includes(
          this.searchQuery.toLowerCase()
        )
        const matchesCategory = !this.selectedCategory || 
          product.category === this.selectedCategory
        return matchesSearch && matchesCategory
      })
    }
  }
}
</script>

优化商品列表性能

对于大型商品列表,可以使用虚拟滚动来提高性能:

<template>
  <RecycleScroller
    class="scroller"
    :items="products"
    :item-size="100"
    key-field="id"
    v-slot="{ item }"
  >
    <div class="product-item">
      <img :src="item.image" :alt="item.name" />
      <h3>{{ item.name }}</h3>
      <p>{{ item.price }}</p>
    </div>
  </RecycleScroller>
</template>

<script>
import { RecycleScroller } from 'vue-virtual-scroller'
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'

export default {
  components: {
    RecycleScroller
  }
}
</script>

添加商品排序功能

允许用户按不同条件排序商品:

vue 实现商品列表

<template>
  <div>
    <select v-model="sortBy">
      <option value="name">Name</option>
      <option value="price">Price</option>
      <option value="rating">Rating</option>
    </select>
    <select v-model="sortDirection">
      <option value="asc">Ascending</option>
      <option value="desc">Descending</option>
    </select>

    <product-list :products="sortedProducts" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      sortBy: 'name',
      sortDirection: 'asc'
    }
  },
  computed: {
    sortedProducts() {
      return [...this.products].sort((a, b) => {
        let modifier = this.sortDirection === 'asc' ? 1 : -1
        if (a[this.sortBy] < b[this.sortBy]) return -1 * modifier
        if (a[this.sortBy] > b[this.sortBy]) return 1 * modifier
        return 0
      })
    }
  }
}
</script>

这些方法提供了实现商品列表的核心功能,可以根据实际项目需求进行组合和扩展。

标签: 商品列表
分享给朋友:

相关文章

vue实现搜索列表

vue实现搜索列表

Vue 实现搜索列表 在 Vue 中实现搜索列表功能,通常需要结合数据绑定、计算属性和事件监听。以下是一个完整的实现方案: 数据准备与模板结构 <template> <div&…

vue实现列表循环

vue实现列表循环

列表循环的实现方式 在Vue中实现列表循环主要依赖于v-for指令,该指令基于源数据多次渲染元素或模板块。 基础数组循环 使用v-for遍历数组时,语法为item in items或(item, i…

vue实现悬浮列表

vue实现悬浮列表

Vue 实现悬浮列表的方法 使用 CSS 固定定位 通过 CSS 的 position: fixed 属性实现悬浮效果。在 Vue 模板中,为列表容器添加固定定位样式,并设置 top、left 等属…

vue实现搜索商品

vue实现搜索商品

Vue 实现商品搜索功能 在 Vue 中实现商品搜索功能,可以通过以下步骤完成。假设已有商品列表数据,需要实现前端搜索过滤功能。 数据准备 准备商品列表数据,通常从 API 获取或本地定义: da…

vue列表展开实现

vue列表展开实现

Vue 列表展开实现方法 使用 v-for 和 v-show 控制展开状态 通过 v-for 渲染列表项,配合 v-show 控制子内容的显示隐藏。需要为每个列表项维护一个展开状态。 <tem…

vue实现列表滚动

vue实现列表滚动

Vue 实现列表滚动的方法 使用 CSS 实现滚动 通过 CSS 的 overflow 属性可以轻松实现列表滚动。在 Vue 的模板中,为列表容器添加 overflow-y: auto 或 overf…