当前位置: 首页 > news >正文

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);}
}

相关文章:

  • MySQL初阶:基础增删改查(CRUD)
  • vue3使用轮播图组件swiper
  • 2.Redis高阶实战
  • On the Biology of a Large Language Model——论文学习笔记——拒答和越狱
  • 点分治解析
  • Python __new__ 一个特殊的静态方法
  • 使用Windows+Linux实现mysql的主从复制
  • LangChain入门(六)Agent
  • day5:nginx代理-动静分离
  • 【了解】通感算一体化网络
  • Selenium模拟人类行为,操作网页的方法(全)
  • 每日算法-250506
  • 大模型系列(三)--- ​ GPT1: Improving Language Understanding by Generative Pre-Training​
  • 【HarmonyOS 5】鸿蒙用户头像编辑功能实践
  • 基于【抖音弹幕抓取数据推送】——制作抖音消息分类查看界面
  • YOLOv8的Python基础--函数篇
  • B站pwn教程笔记-6
  • Linux[Makefile]
  • Vue3路由模式为history,使用nginx部署上线后刷新404的问题
  • Leetcode - 周赛448
  • A股26家游戏企业去年营收近1900亿元:过半净利下滑,出海成为主流选择
  • 五一期间7名游客接连被困青海荒漠,警方提醒严禁非法穿越
  • 宋涛就许历农逝世向其家属致唁电
  • 媒体评特朗普对进口电影征100%关税:让好莱坞时代加速谢幕
  • 2类药物别乱吃,严重可致肝肾衰竭!多人已中招
  • 社区来电催生?多地回应:系为居民提供卫生健康服务