vuex实现购物车逻辑

vuex–目录
在这里插入图片描述
步骤1:在store.js中

//导入vuex
import Vuex from 'vuex'
// 导入Vue
import Vue from 'vue';
Vue.use(Vuex)

//实例化仓库对象
const store = new Vuex.Store({
     //状态
     state: {
      //短路运算
      carData: JSON.parse(window.localStorage.getItem('cacheData')) || {}
    },
    //数据改变方法
    mutations: {
      add2Car(state, obj) {
        console.log(obj)
        if (state.carData[obj.goodId] != undefined) {
          //商品存在
          state.carData[obj.goodId] += obj.goodNum
        } else {
          //商品不存在
          //state.carData[obj.goodId] = obj.goodNum
          // 如果是动态增加的属性 必须使用Vue.set才可以跟踪数据改变
          //参数1:对象  参数2:属性名  参数3:属性值
          Vue.set(state.carData, obj.goodId, obj.goodNum)
        }
        console.log(state)
      },
      // 增加一个修改数据的方法
      updateCartData(state, obj) {
        // //console.log(obj);
        // 接收到数据直接赋值 
        state.carData = obj
      },
    },
    //vuex的计算属性
    getters: {
      //通过state获取内部的数据,计算并返回
      totalCount(state) {
        let num = 0
        for (const key in state.carData) {
          num += state.carData[key]
        }
        return num
      }
    }
  })
  export default store

步骤二:在商品详情页里

//点击加入购物车的方法
    addCar() {
      //触发方法
      this.$store.commit('add2Car',{
        goodId:this.$route.params.goodsid,
        goodNum:this.num
      })
    }

//页面渲染数据
<router-link to="/goodscar">
  <i class="iconfont icon-cart"></i>购物车(
        <span id="shoppingCartCount">
           <!-- 绑定数据的时候可以不写this -->
          <span>{{$store.getters.totalCount}}</span>
      </span>)
</router-link>

步骤三:用户登录购物车数据的渲染

created() {
    //生成数据id1,id2,id3
    let ids = "";
    //通过vuex获取数据
    for (const key in this.$store.state.carData) {
      ids += key;
      ids += ",";
    }
    ids = ids.slice(0, ids.length - 1);
    console.log(ids);
    this.$axios.get(`site/comment/getshopcargoods/${ids}`).then(backData => {
      console.log(backData);
      backData.data.message.forEach(v => {
        //通过id获取购买的数量
        v.buycount = this.$store.state.carData[v.id];
        //增加一个被选中的字段
        v.isSelected = true;
      });
      this.goodsList = backData.data.message;
    });
  },
  // 计算属性
  computed: {
    // 选中的个数
    selectedCount() {
      let num = 0;
      this.goodsList.forEach(v => {
        // 如果被选中
        if (v.isSelected == true) {
          // 累加上购买个数
          num += v.buycount;
        }
      });
      return num;
    },
    // 选中的总金额
    selectedPrice() {
      let price = 0;
      this.goodsList.forEach(v => {
        // 如果被选中
        if (v.isSelected == true) {
          // 累加上购买个数
          price += v.buycount * v.sell_price;
        }
      });
      return price;
    },
    // 选中商品的id
    selectedIds() {
      let ids = "";
      this.goodsList.forEach(v => {
        if (v.isSelected == true) {
          ids += v.id;
          ids += ",";
        }
      });
      // 去掉最后的,
      ids = ids.slice(0, ids.length - 1);
      // 返回ids
      return ids;
    }
  },
  watch: {
    goodsList: {
      handler: function(val, oldVal) {
        let obj = {};
        val.forEach(v => {
          // 动态的增加属性
          obj[v.id] = v.buycount;
        });
        // 同步修改 Vuex中的数据
        this.$store.commit("updateCartData", obj);
      },
      deep: true
    }
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vuex 是一个专为 Vue.js 应用程序设计的状态管理模式,它提供了一种集中存储和管理应用组件之间共享状态的方式。在实现购物车功能时,Vuex 可以帮助我们在单页应用中保持购物车的状态(如商品列表、数量、总价等),并且使得这些状态在整个应用中都是响应式的。 下面是使用 Vuex 实现购物车功能的基本步骤: 1. 定义状态 (state): 在 `store` 中创建一个购物车的状态对象,包含商品列表 (`cartItems`)、总数量 (`cartCount`) 和总价 (`cartTotal`)。 ```javascript state: { cartItems: [], cartCount: 0, cartTotal: 0 }, ``` 2. 定义 mutations (改变状态的方法): 用来更新购物车状态的函数。例如,添加商品 (`ADD_TO_CART`)、从购物车移除商品 (`REMOVE_ITEM`)、更新数量 (`UPDATE_ITEM_QUANTITY`)。 ```javascript mutations: { ADD_TO_CART(state, item) { state.cartItems.push(item); state.cartCount++; state.cartTotal += item.price; }, REMOVE_ITEM(state, index) { state.cartItems.splice(index, 1); state.cartCount--; state.cartTotal -= state.cartItems[index].price; }, UPDATE_ITEM_QUANTITY(state, { index, quantity }) { state.cartItems[index].quantity = quantity; state.cartTotal = calculateCartTotal(state.cartItems); } }, ``` 3. 计算总价 (getters): 为了高效地获取购物车总价,我们可以创建一个getter函数 (`calculateCartTotal`),根据商品列表计算总价。 ```javascript getters: { calculateCartTotal(state) { return state.cartItems.reduce((total, item) => total + item.price * item.quantity, 0); } }, ``` 4. 使用 actions (异步操作): 当需要从后端获取商品信息或者处理复杂的业务逻辑时,可以定义 actions。例如,`FETCH_CART_ITEMS` 和 `UPDATE_CART_ITEM`。 5. 配置 actions: 在 actions 中调用 API 或者执行其他异步操作,然后触发对应的 mutations 更新状态。 6. 创建 getters 和 actions 之后,你可以在 Vue 组件中通过 `mapState` 和 `mapActions` 来读取状态和触发操作。 ```vue <template> <div> <!-- 商品列表 --> <ul> <li v-for="(item, index) in cartItems" :key="index"> {{ item.name }} - {{ item.quantity }} x {{ item.price }} <button @click="removeItem(index)">Remove</button> </li> </ul> <p>Total: {{ cartTotal }}</p> </div> </template> <script> import { mapState, mapActions } from 'vuex'; export default { computed: { ...mapState(['cartItems', 'cartTotal']) }, methods: { ...mapActions(['REMOVE_ITEM', 'UPDATE_ITEM_QUANTITY']) } }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值