Vue3.0 简单商城—购物车组件
原文链接:Vue3.0 简单商城—购物车组件 – 每天进步一点点
上一篇文章完成了基础的商品列表:Vue3.0 简单商城—商品列表组件 – 每天进步一点点
这篇文章介绍一下购物车组件。
基本逻辑:当我们点击“加入购物车时”,会把相应的产品加入到购物车中。
一、修改商品列表组件
我们修改商品列表组件,完善“加入购物车”功能,使用户点击“加入购物车”时,可以将相应的数据存入到本地缓存中。
先修改商品信息,增加num 字段,用来表示商品的数量。
id:'1003',
name: '西瓜',
price: 30,
description: '新鲜的大西瓜',
image: 'https://img2.baidu.com/it/u=3734188370,3061921446&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200',
num:0,
那么,整个商品列表组件修改为如下:
<template>
<div>
<el-row :gutter="20">
<el-col :span="6" v-for="(product, index) in products" :key="index">
<el-card :body-style="{ padding: '0px' }" class="product-card">
<img :src="product.image" class="image" />
<div style="padding: 14px">
<span>{{ product.name }}</span>
<div class="bottom">
<span class="price">¥{{ product.price }}</span>
<el-button type="text" class="button">查看详情</el-button>
<el-button type="text" class="button" @click="addToCar(product)"
>加入购物车</el-button
>
</div>
</div>
</el-card>
</el-col>
</el-row>
</div>
</template>
<script>
// import homeApi from "../../api/homeApi";
export default {
data() {
return {
products: [
{
id: "1001",
name: "草莓",
price: 37,
description: "新鲜的大草莓",
image:
"https://img0.baidu.com/it/u=1884825130,1214737831&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200",
num: 0,
},
{
id: "1002",
name: "苹果",
price: 15,
description: "新鲜的苹果",
image:
"https://img0.baidu.com/it/u=3289470460,166095271&fm=253&fmt=auto&app=120&f=JPEG?w=183&h=183",
num: 0,
},
{
id: "1003",
name: "西瓜",
price: 30,
description: "新鲜的大西瓜",
image:
"https://img2.baidu.com/it/u=3734188370,3061921446&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200",
num: 0,
},
{
id: "1004",
name: "香蕉",
price: 8.5,
description: "新鲜的香蕉",
image:
"https://img0.baidu.com/it/u=3106970920,4028332390&fm=253&fmt=auto&app=120&f=JPEG?w=193&h=193",
num: 0,
},
{
id: "1005",
name: "哈密瓜",
price: 17,
description: "新鲜的哈密瓜",
image:
"https://img1.baidu.com/it/u=3415357883,3105635612&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200",
num: 0,
},
],
};
},
methods: {
//添加到购物车(使用localStorage存储)
addToCar(e) {
this.$message.success('添加'+e.name+"到购物车成功");
//console.log(e);
//根据id,每有一个,就增加一个num属性,
let flag = false;
//先检查有没有这个数据
if (localStorage.getItem("carList")) {
let carList = [];
carList = JSON.parse(localStorage.getItem("carList"));
console.log(carList);
//看看数组里面有没有当前这个数组
for (let index = 0; index < carList.length; index++) {
const element = carList[index];
//console.log(element);
if (e.id == element.id) {
carList[index].num++;
flag = true; //能匹配上
}
console.log(carList[index]);
}
if (flag == false) {
//没有匹配就新增
carList.push(e);
}
localStorage.setItem("carList", JSON.stringify(carList));
} else {
let carList = [];
carList.push(e);
localStorage.setItem("carList", JSON.stringify(carList)); // 将数据存入到本地存储中。
}
},
},
mounted() {
//homeApi.methods.getWeather(101120201);
},
};
</script>
<style >
.product-card {
margin-bottom: 20px;
}
.image {
width: 100%;
display: block;
}
.bottom {
margin-top: 13px;
line-height: 12px;
display: flex;
justify-content: space-between;
align-items: center;
}
.price {
font-size: 18px;
color: #f56c6c;
}
.button {
padding: 0;
min-height: auto;
}
</style>
效果如下:

二、购物车组件
购物车组件的基本逻辑是:当组件加载时,先从本地缓存中获取购物车数据,然后将数据渲染到页面上,最后统一计算数据。
我们使用table组件来表示购物车功能。
基础参考代码如下:
<template>
<div>
<el-card>
<el-table :data="cart" style="width: 100%">
<el-table-column
prop="name"
label="商品名称"
width="180"
></el-table-column>
<el-table-column
prop="price"
label="价格"
width="180"
></el-table-column>
<el-table-column label="数量" prop="num">
<template v-slot="scope">
<el-input-number
v-model="scope.row.num"
:min="1"
:max="99"
@change="updateTotalPrice"
></el-input-number>
</template>
</el-table-column>
<el-table-column label="操作">
<template v-slot="scope">
<el-button @click="removeFromCart(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-row :gutter="20">
<el-col :span="12">总价: {{ totalPrice }}</el-col>
<el-col :span="12">
<el-button type="primary">合并付款</el-button></el-col>
</el-row>
</el-card>
</div>
</template>
<script>
export default {
data() {
return {
cart: [], //购物车数据
totalPrice:0
};
},
components: {},
methods: {},
mounted() {
if (localStorage.getItem("carList")) {
this.cart = JSON.parse(localStorage.getItem("carList"));
//初次加载需要计算价格
var sum=0
for (let index = 0; index < this.cart .length; index++) {
const element = this.cart [index];
sum+=element.price * element.num;
}
this.totalPrice=sum;
}
},
};
</script>
<style >
</style>

三、完善数量变化与删除操作
我们增加计算总价格的函数:
//重新计算价格的方法:
caclPrice(){
var sum=0
for (let index = 0; index < this.cart .length; index++) {
const element = this.cart [index];
sum+=element.price * element.num;
}
this.totalPrice=sum;
},
那么不论我们是删除数据,还是更新商品的数量,都会重新计算价格。
参考代码如下:
vue.car
<template>
<div>
<el-card>
<el-table :data="cart" style="width: 100%">
<el-table-column
prop="name"
label="商品名称"
width="180"
></el-table-column>
<el-table-column
prop="price"
label="价格"
width="180"
></el-table-column>
<el-table-column label="数量" prop="num">
<template v-slot="scope">
<el-input-number
v-model="scope.row.num"
:min="1"
:max="99"
@change="updateTotalPrice()"
></el-input-number>
</template>
</el-table-column>
<el-table-column label="操作">
<template v-slot="scope">
<el-button @click="removeFromCart(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-row :gutter="20">
<el-col :span="12">总价: {{ totalPrice }}</el-col>
<el-col :span="12">
<el-button type="primary">合并付款</el-button></el-col>
</el-row>
</el-card>
</div>
</template>
<script>
export default {
data() {
return {
cart: [], //购物车数据
totalPrice:0
};
},
components: {},
methods: {
//移除一条数据
removeFromCart(row){
const index = this.cart.findIndex(item => item.id === row.id);
if (index !== -1) {
this.cart.splice(index, 1);
//重新计算价格
this.caclPrice()
//更新缓存数据
localStorage.setItem("carList", JSON.stringify(this.cart));
}
},
//重新计算价格的方法:
caclPrice(){
var sum=0
for (let index = 0; index < this.cart .length; index++) {
const element = this.cart [index];
sum+=element.price * element.num;
}
this.totalPrice=sum;
},
updateTotalPrice(){
console.log(11)
//重新计算价格
this.caclPrice()
//更新缓存
localStorage.setItem("carList", JSON.stringify(this.cart));
}
},
mounted() {
if (localStorage.getItem("carList")) {
this.cart = JSON.parse(localStorage.getItem("carList"));
//初次加载需要计算价格
var sum=0
for (let index = 0; index < this.cart .length; index++) {
const element = this.cart [index];
sum+=element.price * element.num;
}
this.totalPrice=sum;
}
},
};
</script>
<style >
</style>
效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/979935.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
2025年空气滤芯厂商权威推荐榜单:离心式空气滤芯/油浴式空气滤芯/过滤式空气滤芯源头厂家精选
在工业制造、洁净车间和通风系统领域,空气滤芯作为保障空气品质和设备稳定运行的关键耗材,其过滤精度与使用寿命直接关系到生产环境的洁净等级与设备维护成本。
根据行业数据,优质高效空气滤芯对0.3微米颗粒物的过滤…
2025年高压负载箱工厂权威推荐榜单:智能负载箱/交流负载箱/rcd负载箱源头工厂精选
在新能源与电力设备测试领域,高压负载箱作为关键测试设备,其性能直接关系到产品认证效率与质量可靠性。
根据行业数据统计,高压负载箱在全球测试设备市场中占比已达18%,其中可编程与大功率型号需求增长尤为显著,年…
2025 温度循环试验箱厂家推荐指南!技术实力与行业方案深度解析
温度循环试验箱作为验证产品在温度交替变化下可靠性的关键设备,广泛应用于电子、汽车、新能源、航空航天等领域。不同行业对设备的温变速率、循环次数、控温精度及环境兼容性需求差异显著,选择适配的厂家直接影响测试…
源码解析:CRMEB移动端订单模块的架构设计与数据同步机制
在电商运营中,能否及时响应并处理订单,直接影响到用户体验和店铺运营效率。CRMEB标准版 v5.6 的 **「移动端订单管理」** 功能,正是为解决这一问题而生。本文将带您详细了解如何通过移动端轻松管理订单,实现真正…
进销存系统好不好,只看三个指标:需求、库存、流转
进销存做不好,所有人都很痛苦:销售天天解释为什么缺货,
仓库每天翻箱找货,
采购永远被动补货。你问一句“问题出在哪”,大家都会指向别人,好像谁都没问题,但业务就是乱。
所以我评价一个进销存系统行不行,只看…
2026完全永久免费客服系统整理
2026完全永久免费客服系统整理 明确需求:先问自己需要多少客服坐席、是否需要APP、是否需要去除品牌LOGO、需要多少聊天记录存储空间。
关注限制:免费版的核心限制通常在 “同时在线坐席数”、“功能阉割” 和 “品牌…
2025年最受欢迎的机床钣金外壳生产商TOP榜,机床钣金外壳品牌赋能企业生产效率提升与成本优化
行业背景分析
随着制造业智能化转型加速,机床钣金外壳作为工业设备的重要组成部分,其质量与精度直接影响设备整体性能。当前市场对钣金外壳的需求呈现专业化、精密化、定制化趋势,具备完善生产体系与技术创新能力的…
2025 年补锌厂家最新推荐榜,技术实力与市场口碑深度解析,筛选高品质补锌优选品牌儿童补锌/孕妇补锌/厌奶补锌/厌食补锌产品公司推荐
引言
锌作为人体必需微量元素,对生长发育、免疫调节等生理过程至关重要,缺锌易引发食欲减退、生长迟缓等问题,科学补锌成为家庭健康管理关键。2025 年补锌市场品牌众多,为筛选优质产品,本次推荐榜参考国际微量元素…
Vue3.0 简单商城—商品列表组件
Vue3.0 简单商城—商品列表组件原文链接:Vue3.0 简单商城—商品列表组件 – 每天进步一点点上一篇文章
已引入了Home组件Vue3.0 简单商城—购物主页组件编写 – 每天进步一点点
已经完成了简单Home组件,Home组件下面…
国标GB28181算法算力平台EasyGBS视频监控一体化平台设计与实践
国标GB28181算法算力平台EasyGBS视频监控一体化平台设计与实践在当今快速发展的科技时代,视频监控技术作为安全防范的重要手段,已经广泛应用于各行各业。从公共场所的安全监控到企业内部的生产监管,再到智能家居的日…
报错initscripts conflicts with redhat-release-server-7.0-1.el7.x86_64
报错解决
删除冲突的 rpm 包即可
rpm -e redhat-release-server-7.0-1.el7.x86_64 --nodeps
Vue3.0 简单商城—Header组件与登录模块编写
Vue3.0 简单商城—Header组件与登录模块编写原文链接:Vue3.0 简单商城—Header组件与登录模块编写 – 每天进步一点点</template> <script>export default {name: "Login",data() {return {use…
2025年湖北CNC加工中心操机培训机构权威推荐榜单:UG学习培训/UG培训/UG编程培训源头机构精选
在制造业智能化升级与高技能人才需求增长的推动下,CNC加工中心操机培训凭借其实操性强、就业面广、薪资潜力大的特点,成为技术人才提升职业竞争力的重要途径。为帮助学员精准筛选优质培训机构,本文基于教学体系、师…
从纳米刀到EMP模拟:加能CMTI脉冲电源如何重新定义“功率极限”? - FORCREAT
引言
在工业自动化、电机驱动、机器人控制等高可靠性系统中,隔离器件的性能直接决定了系统在复杂电磁环境下的稳定性和安全性。而共模瞬变抗扰度(Common Mode Transient Immunity, CMTI),正是衡量隔离器件在强干扰…
Spring MVC项目配置tomcat
Spring MVC项目配置tomcat原文链接:Spring MVC项目配置tomcat – 每天进步一点点1.下载
首先去tomcat官网:Apache Tomcat – Welcome!
往下找到最小的版本,点击64位下载。下载后解压如下:二、IDEA配置tomcat
我们复…
2025年下半年江苏干式变压器、油浸式变压器、变电站、配电箱、电表箱厂家综合推荐指南:五大优质供应商深度解析
摘要
随着2025年下半年江苏地区电力基础设施建设的加速推进,干式变压器市场需求持续增长。本文基于行业调研数据,为您推荐五家在技术创新、产品质量和服务体系方面表现突出的干式变压器企业。本排名仅作参考,不区分…
IDEA+MyBatis实现增删改查(1)
IDEA+MyBatis实现增删改查(1)原文链接:
IDEA+MyBatis实现增删改查(1) – 每天进步一点点
0.工具
IDEA 2024.2
MySql 8.0.11
Maven 3.6.3
MyBatis 3.5.2
Navicat 或者其他能访问数据库的工具
JDK 1.8
1.数据库准备
创建…
2025 瓷砖十大品牌权威推荐:榜单品牌实力护航
开篇:权威榜单出炉!2025 瓷砖品牌选对不踩坑
瓷砖作为家装与商业空间的核心建材,其品质直接关系到居住体验与空间质感。2025 年,中国陶瓷网权威发布 “建筑卫生陶瓷十大品牌榜・瓷砖十大品牌”,为消费者提供了专业…
VUE3.0项目结构
VUE3.0项目结构原文链接:VUE3.0项目结构 – 每天进步一点点通过vue cli工具创建完项目后,项目结构如下:my-vue-project/
|-- node_modules/ // 依赖包
|-- public/ …