当前位置:首页 > VUE

vue实现商品卡片

2026-02-19 06:09:46VUE

Vue 实现商品卡片的方法

基本组件结构

创建一个名为 ProductCard.vue 的单文件组件,包含模板、脚本和样式部分。模板部分定义卡片的布局,脚本部分处理数据逻辑,样式部分定义卡片的外观。

<template>
  <div class="product-card">
    <img :src="product.image" :alt="product.name" class="product-image">
    <h3 class="product-name">{{ product.name }}</h3>
    <p class="product-price">{{ product.price }}</p>
    <button @click="addToCart" class="add-to-cart">加入购物车</button>
  </div>
</template>

<script>
export default {
  props: {
    product: {
      type: Object,
      required: true
    }
  },
  methods: {
    addToCart() {
      this.$emit('add-to-cart', this.product);
    }
  }
};
</script>

<style scoped>
.product-card {
  border: 1px solid #ddd;
  border-radius: 8px;
  padding: 16px;
  text-align: center;
  max-width: 200px;
  margin: 10px;
}

.product-image {
  max-width: 100%;
  height: auto;
  border-radius: 4px;
}

.product-name {
  margin: 10px 0;
  font-size: 16px;
}

.product-price {
  color: #e63946;
  font-weight: bold;
}

.add-to-cart {
  background-color: #4CAF50;
  color: white;
  border: none;
  padding: 8px 16px;
  border-radius: 4px;
  cursor: pointer;
}

.add-to-cart:hover {
  background-color: #45a049;
}
</style>

使用动态数据

在父组件中传递商品数据到 ProductCard 组件,并处理购物车逻辑。

vue实现商品卡片

<template>
  <div class="product-list">
    <ProductCard 
      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: [
        { id: 1, name: '商品1', price: '¥100', image: 'https://via.placeholder.com/150' },
        { id: 2, name: '商品2', price: '¥200', image: 'https://via.placeholder.com/150' }
      ]
    };
  },
  methods: {
    handleAddToCart(product) {
      console.log('加入购物车:', product);
    }
  }
};
</script>

<style scoped>
.product-list {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}
</style>

添加动画效果

通过 Vue 的过渡效果为卡片添加悬停动画,增强用户体验。

<template>
  <div class="product-card" @mouseover="hover = true" @mouseleave="hover = false">
    <transition name="fade">
      <div v-if="hover" class="overlay">查看详情</div>
    </transition>
    <img :src="product.image" :alt="product.name" class="product-image">
    <h3 class="product-name">{{ product.name }}</h3>
    <p class="product-price">{{ product.price }}</p>
    <button @click="addToCart" class="add-to-cart">加入购物车</button>
  </div>
</template>

<script>
export default {
  props: {
    product: {
      type: Object,
      required: true
    }
  },
  data() {
    return {
      hover: false
    };
  },
  methods: {
    addToCart() {
      this.$emit('add-to-cart', this.product);
    }
  }
};
</script>

<style scoped>
.product-card {
  position: relative;
  border: 1px solid #ddd;
  border-radius: 8px;
  padding: 16px;
  text-align: center;
  max-width: 200px;
  margin: 10px;
  transition: transform 0.3s;
}

.product-card:hover {
  transform: scale(1.05);
}

.overlay {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: rgba(0, 0, 0, 0.5);
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 8px;
}

.fade-enter-active, .fade-leave-active {
  transition: opacity 0.5s;
}

.fade-enter, .fade-leave-to {
  opacity: 0;
}
</style>

响应式设计

通过媒体查询确保卡片在不同屏幕尺寸下显示良好。

vue实现商品卡片

@media (max-width: 768px) {
  .product-card {
    max-width: 150px;
    padding: 10px;
  }

  .product-name {
    font-size: 14px;
  }

  .add-to-cart {
    padding: 6px 12px;
    font-size: 12px;
  }
}

集成 Vuex 管理状态

如果项目使用 Vuex 管理购物车状态,可以通过 Vuex 的 mutations 和 actions 处理购物车逻辑。

// store.js
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    cart: []
  },
  mutations: {
    addToCart(state, product) {
      state.cart.push(product);
    }
  },
  actions: {
    addToCart({ commit }, product) {
      commit('addToCart', product);
    }
  }
});

在组件中调用 Vuex 的 action:

<script>
import { mapActions } from 'vuex';

export default {
  props: {
    product: {
      type: Object,
      required: true
    }
  },
  methods: {
    ...mapActions(['addToCart']),
    handleAddToCart() {
      this.addToCart(this.product);
    }
  }
};
</script>

通过以上方法,可以灵活实现一个功能完善且美观的商品卡片组件。

标签: 卡片商品
分享给朋友:

相关文章

vue实现卡片

vue实现卡片

Vue实现卡片的基本方法 使用Vue实现卡片组件可以通过多种方式,以下是几种常见的方法: 使用原生HTML和CSS结合Vue数据绑定 <template> <div clas…

vue实现商品详解

vue实现商品详解

Vue 实现商品详情页功能 技术栈选择 Vue 3 + Vue Router + Pinia(状态管理)+ Axios(数据请求)+ Element UI/Vant(可选UI库) 核心功能模块 数…

vue实现卡片平铺

vue实现卡片平铺

Vue 实现卡片平铺布局 使用 Vue 实现卡片平铺布局通常结合 CSS Grid 或 Flexbox 实现响应式排列,以下是两种常见方法: 使用 CSS Grid 布局 通过 display: g…

vue商品多规格实现

vue商品多规格实现

实现商品多规格的常见方法 在Vue中实现商品多规格(如颜色、尺寸等)的选择功能,通常需要处理规格组合、库存联动、价格变化等逻辑。以下是几种常见的实现方案: 数据结构设计 商品规格数据通常采用树形结构…

vue实现卡片自适应

vue实现卡片自适应

Vue实现卡片自适应的常用方法 使用Flex布局结合响应式设计 通过CSS的Flex布局可以轻松实现卡片的自适应排列。在Vue组件中为卡片容器设置display:flex和flex-wrap:wrap…

vue实现商品添加功能

vue实现商品添加功能

Vue 实现商品添加功能 数据绑定与表单结构 使用 Vue 的 v-model 实现表单数据的双向绑定,构建商品添加表单的基础结构。表单通常包含商品名称、价格、库存、描述等字段。 <templ…