Vue项目商品购物车前端本地缓存逻辑(适用H5/ipad/PC端)——前端实现购物车删除商品、购物车增减数量,清空购物车功能

一、需求

1、用户选择商品,自动回显在购物车列表中;
2、同个商品追加,购物车列表数量叠加;
3、开启赠送,选中的商品,在购物车中另增一条数据,且购物车列表价格显示为0;其实际价格在最后结算是优惠价格其值是`赠送数量*商品价格`4、页面刷新,之前添加的商品依然存在;重新选择商品,依然遵循同类商品数量叠加,新增商品追加在购物车最上面;
5、购物车手动叠加/减数量,在商品列表在选择商品可以实时更新;
6、购物车商品/赠品,单个移除;
7、清空购物车;

二、最终效果

在这里插入图片描述

三、实现逻辑

1、选择商品逻辑

1、获取本地缓存,查看是否存在购物车数据;
2、如果不存在——将点击选中的商品数据、排重且数量求和后、存到本地缓存中;
3、如果存在1、判断购物车数据中是否存在现在要加购的商品(使用数组方法find)2、存在该商品——将该商品的数量+13、不存在该商品——与已有商品一起加入到本地缓存中

2、初始化(即刷新后)----初始化获取本地缓存的数据

 mounted() {this.cacheHandler()},
methods: {// 获取缓存数据cacheHandler() {// 获取所有数据if (localStorage.getItem('finallyCartList') && JSON.parse(localStorage.getItem('finallyCartList')).length > 0) {this.finallyCartList = JSON.parse(localStorage.getItem('finallyCartList'))this.shoppingCartActive = this.finallyCartList[0]}}
}

3、数量加减——用户增减商品数量,更新本地存储数据

4、删除——filter过滤已经删除的数据,更新本地存储数据

5、清空购物车——清空本地存储数据

6、选择商品关键代码:

 // 选择商品itemHandler(item) {const cartObj = JSON.parse(JSON.stringify(item))// 商品数量cartObj.shoppingNum = 1// 是否赠品cartObj.isPresenter = this.isPresenter// 配置购物车列表的唯一值cartObj.soleId = `${cartObj.id}${cartObj.isPresenter}`// 是否配送cartObj.isDistribution = false// 查看本地是否存在购物车数据const store = JSON.parse(localStorage.getItem('finallyCartList') || '[]')if (store.length > 0) {// 判断购物车数据中是否存在现在要加购的商品const currentInfo = store.find(el => {return el.soleId == cartObj.soleId})if (currentInfo) {// 存在数量叠加1currentInfo.shoppingNum = currentInfo.shoppingNum + 1this.finallyCartList = [...store]} else {// 不存在追加在购物车列表前面this.finallyCartList = [cartObj, ...store]}} else {/*** 不存在本地购物车数据逻辑*/this.shoppingCartList = []this.shoppingCartList.push(cartObj)const shoppingCartList = JSON.parse(JSON.stringify(this.shoppingCartList))// 排重且数量求和const result = shoppingCartList.reduce((init, currentValue) => {const leng = init.findIndex(cur => cur.soleId === currentValue.soleId)if (leng != -1) {init[leng].shoppingNum += currentValue.shoppingNum} else {init.push(currentValue)}return init}, [])this.finallyCartList = [...result]}// 把最终购物车列表数据缓存在本地localStorage.setItem('finallyCartList', JSON.stringify(this.finallyCartList))// 购物车列表选中项this.shoppingCartActive = this.finallyCartList[0]// 初始化获取缓存数据this.cacheHandler()// console.log('finallyCartList', this.finallyCartList)}

四、源码

export default {name: 'Checkstand',data() {return {shoppingCartList: [], // 购物车列表finallyCartList: [], // 最终购物车列表shoppingCartActive: {shoppingNum: 1}, // 购物车选中项isPresenter: false, // 是否赠送isDistribution: false // 是否配送}},computed: {// 优惠金额discountsAmount() {return this.finallyCartList.filter(val => val.isPresenter).reduce((retailPrice, currentStudent) => {return retailPrice + (currentStudent.shoppingNum * currentStudent.retailPrice)}, 0)},// 总金额totalAmount() {return this.finallyCartList.filter(val => !val.isPresenter).reduce((retailPrice, currentStudent) => {return retailPrice + (currentStudent.shoppingNum * currentStudent.retailPrice)}, 0)}},mounted() {this.cacheHandler()},methods: {// 获取缓存数据cacheHandler() {// 获取所有数据if (localStorage.getItem('finallyCartList') && JSON.parse(localStorage.getItem('finallyCartList')).length > 0) {this.finallyCartList = JSON.parse(localStorage.getItem('finallyCartList'))this.shoppingCartActive = this.finallyCartList[0]}},// 点击购物车商品activeHandler(item) {this.shoppingCartActive = item},// 选择商品itemHandler(item) {const cartObj = JSON.parse(JSON.stringify(item))// 商品数量cartObj.shoppingNum = 1// 是否赠品cartObj.isPresenter = this.isPresenter// 配置购物车列表的唯一值cartObj.soleId = `${cartObj.id}${cartObj.isPresenter}`// 是否配送cartObj.isDistribution = false// 查看本地是否存在购物车数据const store = JSON.parse(localStorage.getItem('finallyCartList') || '[]')if (store.length > 0) {// 判断购物车数据中是否存在现在要加购的商品const currentInfo = store.find(el => {return el.soleId == cartObj.soleId})if (currentInfo) {// 存在数量叠加1currentInfo.shoppingNum = currentInfo.shoppingNum + 1this.finallyCartList = [...store]} else {// 不存在追加在购物车列表前面this.finallyCartList = [cartObj, ...store]}} else {/*** 不存在本地购物车数据逻辑*/this.shoppingCartList = []this.shoppingCartList.push(cartObj)const shoppingCartList = JSON.parse(JSON.stringify(this.shoppingCartList))// 排重且数量求和const result = shoppingCartList.reduce((init, currentValue) => {const leng = init.findIndex(cur => cur.soleId === currentValue.soleId)if (leng != -1) {init[leng].shoppingNum += currentValue.shoppingNum} else {init.push(currentValue)}return init}, [])this.finallyCartList = [...result]}// 把最终购物车列表数据缓存在本地localStorage.setItem('finallyCartList', JSON.stringify(this.finallyCartList))// 购物车列表选中项this.shoppingCartActive = this.finallyCartList[0]// 初始化获取缓存数据this.cacheHandler()// console.log('finallyCartList', this.finallyCartList)},// 清空购物车clearCart() {this.clearChche()},// 清空数据clearChche() {localStorage.setItem('finallyCartList', JSON.stringify([]))localStorage.setItem('showMemberObj', JSON.stringify({}))this.finallyCartList = []this.shoppingCartActive = {shoppingNum: 1}this.showMemberObj = { ticketCustomers: [] }},// 移除购物车商品delCommodity() {this.finallyCartList = this.finallyCartList.filter(val => this.shoppingCartActive.soleId !== val.soleId)localStorage.setItem('finallyCartList', JSON.stringify(this.finallyCartList))this.shoppingCartActive = this.finallyCartList[0] || { shoppingNum: 1 }this.cacheHandler()},// 配送选中事件changeDistribution(val) {if (!this.shoppingOrTicket) {Toast('请先选择会员!')return}this.finallyCartList.forEach(item => {if (item.id === this.shoppingCartActive.id) {item.isDistribution = val}})localStorage.setItem('finallyCartList', JSON.stringify(this.finallyCartList))},// 每次增减数量重置缓存plusminusHandle() {setTimeout(() => {localStorage.setItem('finallyCartList', JSON.stringify(this.finallyCartList))}, 300)},// 收款collection() {console.log('会员信息', this.showMemberObj)const params = {addressId: this.showMemberObj.addressId || 0,customerId: this.showMemberObj.customerId || 0,customerPhone: this.showMemberObj.customerPhone || '',address: this.showMemberObj.address || '',customerName: this.showMemberObj.customerName || '',operateType: 2,directDiscountAmount: 0,orderStatus: 0,amountReceivable: this.totalAmount,itemMessageDTOList: this.finallyCartList && this.finallyCartList.map(item => { return { itemCode: item.itemCode, qty: item.shoppingNum, itemGiftType: item.isPresenter ? 1 : 0, pickType: item.isDistribution ? 0 : 1 } })}console.log('收款最终参数--会员数据', params)// returnthis.$router.push({ path: '/settleAccounts', query: { data: JSON.stringify(params) } })}}
}

五、相关文章


Vue3 + Vite + Ts开源后台管理系统模板


基于ElementUi或AntdUI再次封装基础组件文档


基于Element-plus再次封装基础组件文档(vue3+ts)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/76732.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

16、Flink 的table api与sql之连接外部系统: 读写外部系统的连接器和格式以及FileSystem示例(1)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

安装docker配置镜像加速器,容器等

1.安装docker服务,配置镜像加速器 2.下载系统镜像(Ubuntu、 centos) 3.基于下载的镜像创建两个容器 (容器名一个为自己名字全拼,一个为首名字字母) 4.容器的启动、 停止及重启操作 5.怎么查看正在运行的容器…

无需公网IP——搭建web站点

文章目录 概述使用 Raspberry Pi Imager 安装 Raspberry Pi OS设置 Apache Web 服务器测试 web 站点安装静态样例站点将web站点发布到公网安装 Cpolar内网穿透cpolar进行token认证生成cpolar随机域名网址生成cpolar二级子域名将参数保存到cpolar配置文件中测试修改后配置文件配…

基于PaddleOCR2.7.0发布WebRest服务测试案例

基于PaddleOCR2.7.0发布WebRest服务测试案例 #WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. #警告:这是一个开发服务器。不要在生产部署中使用它。请改用生产WSGI服务器。 输出结果…

前端大屏常用的适配方案

假设我们正在开发一个可视化拖拽的搭建平台,可以拖拽生成工作台或可视化大屏,或者直接就是开发一个大屏,首先必须要考虑的一个问题就是页面如何适应屏幕,因为我们在搭建或开发时一般都会基于一个固定的宽高,但是实际的…

jmeter HTTP信息头管理器

首先,打开JMeter并创建一个新的测试计划。右键单击测试计划,选择"添加" > “线程组”,然后在线程组上右键单击,选择"添加" > “Sampler” > “HTTP请求”。 在HTTP请求中填写服务器的URL和其他必要…

编织梦想:SpringBoot AOP 教程与自定义日志切面完整实战

什么是 AOP AOP 是指通过预编译方式和运行期动态代理的方式,在不修改源代码的情况下对程序进行功能增强的一种技术。AOP 不是面向对象编程(OOP)的替代品,而是 OOP 的补充和扩展。它是一个新的维度,用来表达横切问题&a…

设计模式之组合模式(Composite)的C++实现

1、组合模式的提出 在软件开发过程中,使用者Client过多依赖所操作对象内部的实现结构,如果对象内部的实现结构频繁发生变化,则使用者的代码结构将要频繁地修改,不利于代码地维护和扩展性;组合模式可以解决此类问题。组…

【LVS】3、LVS+Keepalived群集

为什么用它,为了做高可用 服务功能 1.故障自动切换 2.健康检查 3.节点服务器高可用-HA Keepalived的三个模块: core:Keepalived的核心,负责主进程的启动、维护;调用全局配置文件进行加载和解析 vrrp:实…

8月18日上课内容 Haproxy搭建Web群集

本章结构 课程大纲 Haproxy调度算法 常见的web集群调度器 目前常见的Web集群调度器分为软件和硬件软件 通常使用开源的LVS、Haproxy、Nginx 硬件一般使用比较多的是F5,也有很多人使用国内的一些产品,如梭子鱼、绿盟等 Haproxy应用分析 LVS在企业应用中…

Vue面试题

1. vue优点 轻量级速度快简单易学低耦合可重用性独立开发文档齐全,且文档为中文文档 2. ## vue中组件间传值 prop/$emit 父子组件传值 ref 和 $parent/$children 父子组件传值 eventBus($emit/$on) 父子,隔代,兄弟组件传值 $attrs/$listeners…

服务运营 | MSOR文章精选:远程医疗服务中的统计与运筹(一)

推文作者:蔡君洋,Guo 编者按 《哈佛商业评论》在今年1月20日发表了《是时候巩固远程医疗在美国医疗保健中的地位了(It’s Time to Cement Telehealth’s Place in U.S. Health Care)》一文。文章指出,在COVID-19大流行…