一、前言
1、用vuex实现加入购物车操作
2、购物车详情页面
3、点击删除按钮,删除购物详情页面里的对应商品
二、主要内容
1、用vuex加入购物车
(1)在src目录下创建store.js,
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ //vuex五大将 state:{ num:1//小球的数量默认为1 }, getters:{ getShopNum(state){ return state.num; } }, mutations:{ addShopNum(state,num){//增加小球数量 state.num +=num; }, changeShopNum(state,num){//改变小球数量 state.num = num; } }, actions:{ addShopNumByAction({commit},num){ commit('addShopNum',num); }, changeShopNum({commit}, num){ commit('changeShopNum',num) } } })
(2)在main.js入口文件中挂载,并且导入
import store from './store.js' /* eslint-disableo-new */ new Vue({ el: '#app', router, store,//一定要导入 components: { App }, template: '<App/>' })
(3)在app.vue(底部导航组件)中用computed监听这个pickNum
computed:{ pickNum(){ return this.$store.getters.getShopNum } }
(4)在点击“加入购物车”那个组件,
afterEnter(){ this.isExist=false; //显示出来之后执行这个,又将小球隐藏 /* 不用这个$bus this.$bus.$emit('sendPickNum',this.pickNum);*/ //用vuex, 触发action, this.$store.dispatch('addShopNumByAction',this.pickNum); //当触发了上面的事件之后, GoodsTool.add({ id:this.goodsInfo.id, num:this.$store.getters.getShopNum }) },
2、购物车详情页面(上面点击+++,下面也要变化)
(1)在购物车详情页面,每次点加,减的时候让他去触发action
methods:{ addNum(shop){//每次点击都接受到当前的对象 shop.num++; //这里的值虽然加上了,但是,数据并没有响应上去,是因为created是一开始就加载的,后来点击修改了num的值,但是没有 响应视图 this.$store.dispatch('addShopNumByAction',1)//触发action console.log(shop) }, substract(shop){ if(shop.num==1){ return; } shop.num--; this.$store.dispatch('addShopNumByAction',-1)//触发action } }
(2)要让底部导航栏里面的数量随着点击而发生变化
created(){ //当你的组件一创建好了后就挂载这个bus公交车,$on这个事件监听 /* this.$bus.$on(`sendPickNum`, (data)=>{ this.pickNum=this.pickNum + data; }), this.pickNum=GoodsTool.getTotalCount();*/ //触发action里面的changShop方法,并且将当前的总数量传给他 this.$store.dispatch('changeShopNum',GoodsTool.getTotalCount()) }
3、点击删除按钮,删除购物详情页面里的对应商品
del(shop,index){//将当前的对象,和index传进来
this.shopCart.splice(index,1)//数组中的当前对象
delete GoodsTool[shop.id]
GoodsTool.removeGoods(shop.id)
let num = shop.um;
this.$store.dispatch('addShopNumByAction',-num)
}
4.通信的组件如下
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ state:{ num:1//小球的数量默认为1 }, getters:{ getShopNum(state){ return state.num; } }, mutations:{ addShopNum(state,num){ state +=num; }, changeShopNum(state,num){ state.num = num; } }, actions:{ addShopNumByAction({commit},num){ commit('addShopNum',num); }, changeShopNum({commit}, num){ commit('changeShopNum',num) } } })