vue实战-加入购物车一系列操作

1.在Detail组件中点击“加入购物车”

同时完成:
①数据存入服务器
②页面组件跳转以及传参
③会话存储
在这里插入图片描述

1)数据存入服务器
设置API接口(reqUpdateShopCart)

在这里插入图片描述

detail小仓库中的处理

在这里插入图片描述
判断是否存入成功,返回为200则为存入成功。

会话存储

跳转到AddCartSuccess组件需要传临时的商品信息到该组件动态显示出来,所以用到会话存储
在这里插入图片描述
由于skuInfo的数据类型是对象,而sessionStorage没法存,得转换成字符串。
所以用JSON.stringify()
使用时再转换成对象
在这里插入图片描述

2)添加临时游客身份uuid

为了使得能将成功添加到购物车的数据能取出来,必须要有一个身份标识,使用uuid来随机生成一个临时游客身份标识,这样在需要购物车数据时,才能从服务器中取出存入的含有身份标识的数据。
在加入购物车的同时添加uuid标识,因为只能传参固定位,于是想到在发送请求的请求头中还可以传参。
首先,在detail仓库中得到这个uuid
在这里插入图片描述
在src中创建一个工具文件夹utils的uuid_token.js(为了设置获得uuid的存储以及为了它的唯一性)
uuid_token.js

import { v4 as uuidv4 } from 'uuid'
export const getUUID = ()=>{
    let uuid_token = localStorage.getItem('GETUUID')
    if(!uuid_token){
        uuid_token = uuidv4()
        localStorage.setItem('GETUUID',uuid_token)
    }
    return uuid_token
}

最后将仓库中获得的uuid放入请求头headers中
在这里插入图片描述
成功在shopCart仓库中获得数据。

2.在购物车中的操作

1)设置获取购物车数据的API

在这里插入图片描述
因为存在了临时id:uuid,在shopCart仓库中可以获得购物车的动态数据

2)设置shopCart仓库

①派发actions
在这里插入图片描述
②store中处理

import {reqCartList} from '@/api'

const state = {
    shopCartList:[]
}
const mutations = {
    GETSHOPCARTLIST(state,shopCartList){
        state.shopCartList = shopCartList
    }
}
const actions = {
    async getShopCartList({commit}){
        let result = await reqCartList()
        if(result.code==200){
            commit('GETSHOPCARTLIST',result.data)
        }
    }
}
const getters = {
    cartList(state){
        return state.shopCartList[0].cartInfoList || []
    }
}

export default {
    state,
    mutations,
    actions,
    getters
}

仓库中的数据
在这里插入图片描述
通过getters计算属性简化需要的对象,在ShopCart组件页面动态展示。

3)在组件中动态展示数据

在这里插入图片描述
①商品数量模块处的处理

 <li class="cart-list-con5">
		 <a href="javascript:void(0)" class="mins" @click="handler('minus',-1,cart)">-</a>
		 <input autocomplete="off" type="text" :value="cart.skuNum" minnum="1" class="itxt" @change="handler('text',$event.target.value,cart)">
		 <a href="javascript:void(0)" class="plus" @click="handler('add',1,cart)">+</a>
 </li>

handler方法
防止操作太快导致的数量会为0或者负数,需要使用节流

  handler:throttle( async function(type,duNUm,cart){
        switch(type){
          case 'minus':
            if(cart.skuNum < 1){
              duNUm = 0
            }
            duNUm = -1
            break
          case 'add':
            duNUm=1
            break
          case 'text':
            if (isNaN(duNUm) || duNUm < 0) {
              duNUm = 0;
            } else {
              duNUm = parseInt(duNUm) - cart.skuNum;
            }
            break
        }
        try {
          await this.$store.dispatch('addUpdateShopCart',{skuId:cart.skuId,skuNum:duNUm})
          this.getData()
        } catch (error) {
          alert(error.message)
        }
      }
    ,1000)

②删除单个商品操作
设置api
在这里插入图片描述
vuex配置
在这里插入图片描述
删除按钮触发的方法

 async deleteCartById(cart){
        try {
          await this.$store.dispatch('deleteShopCartById',cart.skuId)
          this.getData()
        } catch (error) {
          alert(error.message)
        }
      }

③切换商品选中状态
设置api
在这里插入图片描述
vuex设置
在这里插入图片描述
勾选触发方法

  async updateCheckCart(cart,$event){
        try {
          let checked = $event.target.isChecked ? '1':'0'
          await this.$store.dispatch('getUpdateShopCartCheck',{skuId:cart.skuId,isChecked:checked})
          this.getData()
        } catch (error) {
          alert(error.message)
        }
      }

④删除选中商品
在vuex中操作,结合之前是删除单个商品的接口来处理
在这里插入图片描述
触发事件的方法

deleteAllisCheckedCart(){
        try {
          this.$store.dispatch('deleteAllCheckedCart')
          this.getData()
        } catch (error) {
          alert(error.message)
        }
      },

⑤全选或全不选
vuex操作
在这里插入图片描述
触发事件方法

    async updateAllCheckCart(event){
        try {
          let isChecked = event.target.checked ? '1':'0'
          await this.$store.dispatch('updateAllCheckCart',isChecked)
          this.getData()
        } catch (error) {
          alert(error.message)
        }
      }

最终,完成购物车的一系列操作。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐