vue实现商品的渲染
商品渲染的基本结构
在Vue中渲染商品列表通常需要结合v-for指令遍历商品数据数组,动态生成DOM元素。基础模板结构如下:
<template>
<div class="product-list">
<div v-for="product in products" :key="product.id" class="product-card">
<img :src="product.image" :alt="product.name">
<h3>{{ product.name }}</h3>
<p>价格: {{ product.price }}元</p>
<button @click="addToCart(product)">加入购物车</button>
</div>
</div>
</template>
数据绑定与状态管理
商品数据通常通过data属性或Vuex/Pinia进行管理。以下是组件内管理数据的示例:
<script>
export default {
data() {
return {
products: [
{ id: 1, name: '商品A', price: 99, image: '/path/to/image.jpg' },
{ id: 2, name: '商品B', price: 199, image: '/path/to/image2.jpg' }
]
}
},
methods: {
addToCart(product) {
// 购物车逻辑
}
}
}
</script>
动态样式与交互效果
通过Vue的响应式特性可以实现悬停效果、价格筛选等交互功能。示例CSS:

.product-list {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 20px;
}
.product-card {
border: 1px solid #ddd;
padding: 15px;
transition: transform 0.3s;
}
.product-card:hover {
transform: translateY(-5px);
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
}
异步数据加载
实际项目中商品数据通常通过API获取,推荐使用axios配合生命周期钩子:
<script>
import axios from 'axios';
export default {
data() {
return {
products: [],
loading: false
}
},
async created() {
this.loading = true;
try {
const response = await axios.get('/api/products');
this.products = response.data;
} finally {
this.loading = false;
}
}
}
</script>
商品筛选与排序
添加计算属性实现商品筛选和排序功能:

computed: {
filteredProducts() {
return this.products
.filter(p => p.price < this.maxPriceFilter)
.sort((a, b) => this.sortBy === 'price' ? a.price - b.price : 0);
}
}
组件化开发
对于复杂电商系统,建议将商品卡片拆分为独立组件:
<!-- ProductCard.vue -->
<template>
<div class="product-card">
<!-- 商品卡片内容 -->
</div>
</template>
<script>
export default {
props: {
product: {
type: Object,
required: true
}
}
}
</script>
性能优化技巧
对于大型商品列表,建议使用虚拟滚动技术:
<template>
<RecycleScroller
class="scroller"
:items="products"
:item-size="300"
key-field="id"
>
<template v-slot="{ item }">
<ProductCard :product="item" />
</template>
</RecycleScroller>
</template>
<script>
import { RecycleScroller } from 'vue-virtual-scroller';
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css';
</script>






