13前端项目----购物车修改

购物车修改

    • uuid临时游客身份
    • 购物车部分功能
      • 全选
      • 修改商品数量
      • 修改商品勾选状态
      • 删除产品

uuid临时游客身份

请求数据+仓库发起请求
->问题:获取不到购物车数据?
在这里插入图片描述
所以需要一个身份,告诉服务器是谁存的数据?是要获取谁的数据?

//引入
import {v4 as uuidv4} from 'uuid';
//生成具有唯一标识的字符串作为id
uuid_token = uuidv4();

utils文件存放与业务逻辑无关的公共工具函数、辅助方法或通用逻辑
将生成一个随机游客身份,将 游客身份 UUID 放在 HTTP 请求头 中随每次请求发送给后端,后端在所有接口中都能识别同一游客,并关联其行为数据

  1. 为了保证存储一次游客身份的永久性,每次访问都是通过游客身份而不是每次重新生成一个新的游客身份----通过localStorage
//uitl
import {v4 as uuidv4} from 'uuid';export const getUUID = ()=>{let uuid_token = localStorage.getItem('UUIDTOKEN');if(!uuid_token){//本地没有存储,则生成一个uuid_token = uuidv4();//然后存储到本地localStorage.setItem('UUIDTOKEN',uuid_token);}return uuid_token;
}
  1. 在仓库中存储uuid,uuid_token=getUUID()
  2. 把uuidToken加在请求头中:在axios请求拦截器rquest.use((config)=>{})中,请求头添加字段(userTempId)config.header.userTempId = store.state.detail.uuid_token

购物车部分功能

全选

  • every用于判断购物车是否已经全选

every(item=>{表达式})遍历数组,若每项全都满足条件则返回true,否则返回false

isAllCheck(){return this.cartInfoList.every(item=>item.isChecked===1)
}

修改商品数量

绑定handler函数,参数(type,disNum,cart)分别表示:操作行为、数量变化(正/负/0)、cart是商品信息

  • 减少:@click=“handler(‘minus’,-1,cartInfo)”
  • 输入框:@change=“handler(‘change’,$event.target.value,cartInfo)”
  • 增加:@click=“handler(‘add’,1,cartInfo)”

添加节流操作:当快速多次修改产品数量时,会出现负数/0的现象

handler:throttle(async function(type,disNum,cart){if(type === 'minus') {//当商品数量为1时,不可再减少if(cart.skuNum === 1){return;}}if(type === 'change'){//输入内容不合法时if(isNaN(disNum * 1)  || disNum <= 0){disNum = 0;}else{//parseInt取整计算差值disNum = parseInt(disNum) - cart.skuNum}}//加按钮disNum不需要改变try{//更新服务器数据await this.$store.dispatch('addOrUpdateShopCart',{skuId:cart.skuId,skuNum:disNum})//再次获取服务器新的数据await this.$store.dispatch("getCartList")}catch (error){alert(error)}
},500),

修改商品勾选状态

  1. 封装删除商品的接口reqUpdateCheckedById函数
export const reqUpdateCheckedById = (skuId,isChecked)=>requests({url:`/cart/checkCart/${skuId}/${isChecked}`,method:'get'});
  1. 仓库写action发送请求
async updateCheckedById({commit},{skuId,isChecked}){let result = awiat reqUpdateCheckedById(skuId,isChecked);if(result.code===200){return 'ok';}else{return Promise.reject(new Error('fail'));}
}
  1. 绑定change事件触发updateChecked
//传入商品信息cart
//event参数获取当前勾选状态
async updateChecked(cart,event){
try{
//如果获取成功则再次获取服务器数据let isChecked = event.target.checked?1:0;await this.$store.dispatch("reqUpdateCheckedById",{cart,isChecked});this.getDate();}catch(error){alert(error.message);}
}

删除产品

通过后台提供的删除单个商品的接口,传入商品skuId,和之前差不多,我就省略了封装接口函数,然后在actions中封装成发送请求函数async deleteCartListBySckuId({commit},skuId){……}最后组件里面绑定事件派发actions等一样的操作。

当需要删除全部勾选的产品,该怎么做呢?没有相应的接口处理

当然可以method中遍历多次dispatch一个个删除,在这里我们将批量删除封装为actions函数deleteAllCheckedCart

  • 首先需要知道:deleteAllCheckedCart(context){console.log(context)}中conext是什么?
    conext实际上是个小仓库
    commit【提交mutations修改state】getters【计算属性】 dispatch【派发actions】在这里插入图片描述
    如此我们便可以拿到想要的购物车数据通过getters,然后也可以派发actions
    注意解构出所需要的getters和dispatch
deleteAllCheckedCart({getters,dispatch}){//forEach遍历cartInfoListlet PromiseAll = [];getters.cartList.cartInfoList.foEach(item=>{//需要过滤掉没有被勾选的产品let promise = item.isChecked==1?dispatch('deleteCartListBySckuId',item.skuId):'';//dispatch返回一个Promise//那么每次删除一个产品都会返回一个Promise//那么可以把每个对象放到promise.all中PromiseAll.push(promise);});//返回结果是失败还是成功return Promise.all(PromiseAll);
}
  • Promise.all()
    promise.all([p1,p2,p3])中是个数组,每一个p1、p2、p3、都是一个promise对象,如果有一个promise返回的是失败,那么都是失败,都成功才会成功

组件methods中:

async deleteAllCheckedCart(){try{await this.$store.dispatch('deleteAllCheckedCart');//再次发送请求获取购物车列表this.getDate();}catch(error){alert(error.message);}
}

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

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

相关文章

Mac电脑,idea突然文件都展示成了文本格式,导致ts,tsx文件都不能正常加载或提示异常,解决方案详细说明如下

有一天使用clean my mac软件清理电脑 突然发现idea出现了文件都以文本格式展示&#xff0c;如图所示 然后就卸载&#xff0c;计划重新安装&#xff0c;安装了好几个版本&#xff0c;并且setting->file types怎么设置都展示不对&#xff0c;考虑是否idea没卸载干净&#xff…

Nginx搭建test服务器

创建test域名 进入阿里云添加解析 创建域名:test.xxxxx.com 服务器复制项目代码 新建目录,Git拉取项目代码,安装上插件包 修改配置文件,启动测试服务 修改配置文件“服务器接口” 开启服务pm2 start app.js --name "test" 表格含义: 列名含义说明id进程在…

MyBatis-Plus 非 Spring 环境使用时 `GenericTypeResolver` 缺失问题总结

MyBatis-Plus 非 Spring 环境使用时 GenericTypeResolver 缺失问题总结 问题描述 在非 Spring 环境中使用 MyBatis-Plus 3.4.3.1 及以上版本时&#xff0c;启动程序会抛出以下错误&#xff1a; Exception in thread "main" java.lang.NoClassDefFoundError: org/s…

综合案例:使用vuex对购物车的商品数量和价格等公共数据进行状态管理

文章目录 0.实现需求1.新建购物车模块cart2.使用json-server模拟向后端请求数据3.在vuex请求获取并存入数据,并映射到组件中,在组件中渲染【重点】3.1.安装axios3.2.准备actions和mutations,获取和存入数据到vuex中3.3.动态渲染:先用mapState映射list到组件页面 4.点击修改数量…

《数据结构初阶》【顺序表 + 单链表 + 双向链表】

《数据结构初阶》【顺序表 单链表 顺序表】 前言&#xff1a;先聊些其他的东西&#xff01;&#xff01;&#xff01;什么是线性表&#xff1f;什么是顺序表&#xff1f;顺序表的种类有哪些&#xff1f; 什么是链表&#xff1f;链表的种类有哪些&#xff1f; ---------------…

Android Retrofit框架分析(三):自动切换回主线程;bulid的过程;create方法+ServiceMethod源码了解

目录 Okhttp有什么不好&#xff1f;bulid的过程create方法ServiceMethodcall enqueue的过程为什么要学习源码呢&#xff1f; 一、Okhttp有什么不好&#xff1f; Okhttp本身来说&#xff0c;是一个挺好的网络框架&#xff0c;但&#xff0c;对于开发者而言&#xff0c;使用起…

C++ STL 基础与多线程安全性说明文档

C STL 基础与多线程安全性说明文档 一、STL 简介 STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;是 C 标准库的重要组成部分&#xff0c;提供了常用的数据结构和算法的泛型实现&#xff0c;极大地提高了代码的复用性和开发效率。 STL 的六大组…

数据结构之图的分类和存储

图 图(Graph)G由两个集合V和E组成&#xff0c;记为&#xff1a;G(V,E)&#xff0c;其中V是顶点的有穷非空集合(其实就是顶点)&#xff0c;E是V 中顶点偶对的有穷集合(就是边)。V(G)和E(G)通常分别表示图G的顶点集合以及边集合&#xff0c;E(G)可以为空集合&#xff0c;但是此时…

扩增子分析|微生物生态网络稳定性评估之鲁棒性(Robustness)和易损性(Vulnerability)在R中实现

一、引言 周集中老师团队于2021年在Nature climate change发表的文章&#xff0c;阐述了网络稳定性评估的原理算法&#xff0c;并提供了完整的代码。自此对微生物生态网络的评估具有更全面的指标&#xff0c;自此网络稳定性的评估广受大家欢迎。本系列将介绍网络稳定性之鲁棒性…

setup 函数在 Vue 3 中的作用是什么?什么时候会执行

文章目录 前言✅ 一、setup() 函数的作用是什么&#xff1f;✅ 二、setup() 什么时候执行&#xff1f;✅ 三、setup() 的参数✅ 四、setup() 中不能做什么&#xff1f;✅ 五、常见用法示例✅ 六、总结&#xff08;适合背诵或面试回答&#xff09; <script setup> 是 **Vu…

JDBC实现--保姆级教程~

本来以为写过一个使用python与数据库连接的文章&#xff0c;但是今天突然发现没有&#xff0c;那就直接写Java与数据库连接的吧。当然如果大家有需要可以告诉我&#xff0c;有时间的话也可以写一个的pymysql的使用的。 数据库有很多种&#xff0c;接下来我就以MySQL为例来进行讲…

Ubuntu18.04搭建samda服务器

一.什么是Samba服务器&#xff1f; Samba服务器是一种基于开源协议实现的网络共享服务软件&#xff0c;主要用于在不同操作系统&#xff08;如Windows、Linux、Unix&#xff09;之间实现文件和打印机共享功能。其核心目标是解决跨平台资源共享的兼容性问题&#xff0c;尤其是在…

《分词算法大揭秘:BPE、BBPE、WordPiece、ULM常见方法介绍》

分词算法是自然语言处理&#xff08;NLP&#xff09;中的一个重要预处理步骤&#xff0c;它将文本分割成更小的单元&#xff08;如单词、子词或字符&#xff09;。以下是几种常见的分词算法&#xff1a;Byte Pair Encoding (BPE)、Byte-level BPE (BBPE)、WordPiece 和 Unigram…

WordPress01 - 后台常用功能

最近些日子研究Wordpress&#xff0c;做些简单的笔记。 怎么安装Wordpress&#xff0c;怎么进的后台&#xff0c;这些咱就不唠了哈&#xff0c;网上到处是教程。 目录 1&#xff0c;Wordpress的后台 1-1&#xff0c; Posts(投稿) 1-2&#xff0c;Media(媒体) 1-3&#xf…

R8周:RNN实现阿尔茨海默病诊断

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 一、前期准备 1.设置GPU import numpy as np import pandas as pd import torch from torch import nn import torch.nn as nn import torch.nn.functi…

今天python练习题

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 不要害怕失败&#xff0c;失败可能成为我们前进的动力&#xff01; 二、练习题 有列表lst [[1,2,3],[4,5,6],[7,8,9]],取出其中的元素1/5/9组成新的列表 # 有列表lst [[1,2,3],[4,5,6],[…

机器人强化学习入门学习笔记(二)

基于上一篇的《机器人强化学习入门学习笔记》,在基于 MuJoCo 的仿真强化学习训练中,除了 PPO(Proximal Policy Optimization)之外,还有多个主流强化学习算法可用于训练机器人直行或其他复杂动作。 🧠 一、常见强化学习算法对比(可用于 MuJoCo) 算法类型特点适合场景PP…

用 DuckDB 高效分析 JSON 数据:从入门到实战

解析 JSON 文件进行分析常常充满挑战。无论你是在处理 API 响应、日志文件&#xff0c;还是应用数据&#xff0c;如果没有合适的工具&#xff0c;分析 JSON 都会非常耗时。 借助 DuckDB&#xff0c;你可以直接用 SQL 查询复杂的 JSON 文件&#xff0c;无需编写复杂的解析代码或…

从贴牌到品牌:出海官网如何让中国制造“贵”起来?

在全球经济一体化的当下&#xff0c;中美关税战如同一记重锤&#xff0c;给国际贸易格局带来了巨大震荡。自贸易摩擦爆发以来&#xff0c;双方多次调整关税政策&#xff0c;涉及的商品种类不断增多&#xff0c;税率持续攀升&#xff0c;众多中国企业的出口业务遭受重创&#xf…

react-13react中外部css引入以及style内联样式(动态className与动态style)

1. 外部css文件 - 普通引入 1.1 创建一个 CSS 文件&#xff0c;MyComponent.css。 /* MyComponent.css */ .my-class {color: red;font-size: 20px; } 1.2 组件中import引入 import React from react; import ./MyComponent.css; // 引入 CSS 文件function MyComponent() {r…