vue商品展示如何实现
商品展示实现方法
在Vue中实现商品展示功能,可以通过组件化开发结合状态管理来完成。以下是一个典型的实现方案:
创建商品组件 开发一个独立的商品卡片组件,包含图片、名称、价格等基本信息。组件应接收商品数据作为props,并保持样式一致性。
<template>
<div class="product-card">
<img :src="product.image" :alt="product.name">
<h3>{{ product.name }}</h3>
<p>¥{{ product.price }}</p>
<button @click="addToCart">加入购物车</button>
</div>
</template>
<script>
export default {
props: ['product'],
methods: {
addToCart() {
this.$emit('add-to-cart', this.product)
}
}
}
</script>
商品列表渲染 在父组件中获取商品数据并循环渲染商品卡片。数据可以来自API请求或本地状态管理。

<template>
<div class="product-list">
<product-card
v-for="product in products"
:key="product.id"
:product="product"
@add-to-cart="handleAddToCart"
/>
</div>
</template>
<script>
import ProductCard from './ProductCard.vue'
export default {
components: { ProductCard },
data() {
return {
products: []
}
},
created() {
this.fetchProducts()
},
methods: {
fetchProducts() {
// API请求获取商品数据
axios.get('/api/products').then(response => {
this.products = response.data
})
},
handleAddToCart(product) {
// 处理添加到购物车逻辑
}
}
}
</script>
高级功能实现
商品筛选与排序 添加筛选和排序功能提升用户体验。可以使用计算属性实现动态过滤和排序。
<template>
<div>
<select v-model="sortBy">
<option value="price">按价格</option>
<option value="sales">按销量</option>
</select>
<input v-model="searchQuery" placeholder="搜索商品">
<product-card
v-for="product in filteredProducts"
:key="product.id"
:product="product"
/>
</div>
</template>
<script>
export default {
data() {
return {
sortBy: 'price',
searchQuery: ''
}
},
computed: {
filteredProducts() {
let products = [...this.products]
if (this.searchQuery) {
products = products.filter(p =>
p.name.includes(this.searchQuery)
)
}
return products.sort((a, b) => a[this.sortBy] - b[this.sortBy])
}
}
}
</script>
商品详情页 通过Vue Router实现商品详情页的路由跳转,展示更详细的商品信息。

// router.js
{
path: '/product/:id',
component: ProductDetail,
props: true
}
<!-- ProductDetail.vue -->
<template>
<div v-if="product">
<h1>{{ product.name }}</h1>
<img :src="product.image" :alt="product.name">
<p>{{ product.description }}</p>
<p>¥{{ product.price }}</p>
</div>
</template>
<script>
export default {
props: ['id'],
data() {
return {
product: null
}
},
created() {
this.fetchProduct()
},
methods: {
fetchProduct() {
axios.get(`/api/products/${this.id}`).then(response => {
this.product = response.data
})
}
}
}
</script>
性能优化建议
图片懒加载 使用vue-lazyload等插件实现图片懒加载,提升页面加载速度。
// main.js
import VueLazyload from 'vue-lazyload'
Vue.use(VueLazyload, {
preLoad: 1.3,
loading: 'placeholder-image.jpg'
})
<img v-lazy="product.image" :alt="product.name">
分页加载 对于大量商品数据,实现分页或无限滚动加载。
<template>
<div>
<product-card v-for="product in visibleProducts" :key="product.id" :product="product"/>
<button v-if="hasMore" @click="loadMore">加载更多</button>
</div>
</template>
<script>
export default {
data() {
return {
page: 1,
pageSize: 10,
allProducts: []
}
},
computed: {
visibleProducts() {
return this.allProducts.slice(0, this.page * this.pageSize)
},
hasMore() {
return this.visibleProducts.length < this.allProducts.length
}
},
methods: {
loadMore() {
this.page++
}
}
}
</script>
缓存商品数据 使用Vuex或本地存储缓存商品数据,减少重复请求。
// store.js
state: {
products: []
},
mutations: {
setProducts(state, products) {
state.products = products
}
},
actions: {
async fetchProducts({ commit }) {
const response = await axios.get('/api/products')
commit('setProducts', response.data)
}
}






