zoukankan      html  css  js  c++  java
  • Vuex使用案例(加深印象)

    前言

    为加深对Vuex的印象,以及对vuex各种方法调用的理解,写了个例子去实际体验了一把

    最终效果

    QQ20210527-102431-HD.gif

    代码如下

    shop.vue
    <!--
     * @Author: hhyt
     * @Date: 2021-06-25 11:20:53
     * @LastEditTime: 2021-05-27 10:10:02
     * @LastEditors: Please set LastEditors
     * @Description: In User Settings Edit
     * @FilePath: /vuedemo/src/web/shop.vue
    -->
    <!--  -->
    <template>
      <div>
        <ul>
          <li class="itemLi" v-for="(item, index) in goods" :key="item + index">
            <img
              class="itemLeft"
              src="https://pic3.zhimg.com/80/v2-8f173ae25ccc3a0cd93fd1e2bbbecaae_1440w.jpg"
              alt=""
            />
            <div style="margin-left:30px">
              <span>{{ item.name }}</span>
              <span>{{ item.index }}</span>
              <p>
                <span>{{ item.price }}</span>
              </p>
              <p>
                <span class="bor" @click="reduceGoods(index)">-</span>
                <span class="bor">{{ item.num }}</span>
                <span class="bor" @click="addGoods(index)">+</span>
                <span class="bor" @click="useAdd({ index: index, num: 10 })"
                  >一次添加10个</span
                >
                <!-- 不用辅助函数时候 -->
                <!-- <span class="bor" @click="cs(index,num)"
                  >一次添加10个</span
                > -->
              </p>
            </div>
          </li>
        </ul>
        <div class="">
          <p>当前商品总数量:{{ totalNum }}</p>
          <p>当前商品总价格:{{ totalPrice }}</p>
        </div>
      </div>
    </template>
    
    <script>
    import { mapState, mapGetters, mapMutations, mapActions } from "vuex";
    export default {
      data() {
        return {};
      },
      computed: {
        ...mapState(["totalPrice", "totalNum", "goods"]),
        ...mapGetters(["getTotalNum", "getTotalPrice"]),
      },
      methods: {
        ...mapMutations(["addGoods", "reduceGoods"]),
        ...mapActions(["useAdd"]),
        //注意:传入多个参数不能继续在后面加,加则报错无效,必须第二个参数写成对象形式,在对象中接受多个参数,
        // cs(index, num) {
        //   this.$store.dispatch("useAdd", { index: index, num: num });
        // },
      },
    };
    </script>
    <style scoped>
    .itemLi {
      display: flex;
      justify-content: flex-start;
    }
    .itemLeft {
       80px;
      height: 80px;
    }
    .bor {
      display: inline-block;
      padding: 5px 10px;
      border: 1px solid #ccc;
      text-align: center;
      cursor: pointer;
    }
    </style>
    
    
    新建/store/index.js
    /*
     * @Author: hhyt
     * @Date: 2021-05-24 17:45:53
     * @LastEditTime: 2021-05-27 10:29:09
     * @LastEditors: Please set LastEditors
     * @Description: In User Settings Edit
     * @FilePath: /vuedemo/src/store/index.js
     */
    import Vue from "vue";
    import Vuex from "vuex";
    Vue.use(Vuex);
    
    export default new Vuex.Store({
      state: {
        totalPrice: 0,
        totalNum: 0,
        goods: [
          {
            id: 1,
            name: "vue",
            price: 10,
            num: 0,
          },
          {
            id: 2,
            name: "react",
            price: 20,
            num: 0,
          },
          {
            id: 3,
            name: "angular",
            price: 30,
            num: 0,
          },
        ],
      },
      getters: {
        //获取购物车总数
        getTotalNum(state) {
          let newNums = 0;
          state.goods.forEach((item) => {
            newNums += item.num;
          });
          return newNums;
        },
        //获取购物车总共价格
        getTotalPrice(state) {
          let newPrice = 0;
          state.goods.forEach((item) => {
            newPrice += item.num * item.price;
          });
          return newPrice;
        },
      },
      mutations: {
        //初始化总价和数量
        initState(state) {
          state.totalPrice = this.getters.getTotalPrice;
          state.totalNum = this.getters.getTotalNum;
        },
        //添加产品数量
        addGoods(state, index) {
          state.goods[index].num++;
          this.commit("initState");
        },
        //减少数量
        reduceGoods(state, index) {
          state.goods[index].num--;
          this.commit("initState");
        },
        //一次性添加10个
        addGoodsTen(state, obj) {
          console.log(obj);
          state.goods[obj.index].num += obj.num;
          this.commit("initState");
        },
        //注意!!!!!:如果是想更改源对象,复制后还会改变原对象,所以先用深度克隆复制对象再赋值
        // saveUserInfo(state, info) {
        // 创建一个新的对象,将info,state.personInfo对象复制到新对象中
        //let data = Object.assign({}, state.personInfo, info);
        // 将state.personInfo指向新对象的引用地址
        //state.personInfo = data;
        // },
      },
      actions: {
        // action 提交的是 mutation,而不是直接变更状态。mutation可以直接变更状态。
        // action 可以包含任意异步操作。mutation只能是同步操作。
        // 提交方式不同,action 是用this.$store.dispatch('ACTION_NAME',data)来提交。mutation是用this.$store.commit('SET_NUMBER',10)来提交。
        useAdd({ commit }, obj) {
          commit("addGoodsTen", obj);
        },
      },
    });
    
    
    

    引用链接:https://juejin.cn/post/6844903558496665607

  • 相关阅读:
    angularjs学习访问服务器(5)
    sublime text 3解放鼠标的快捷键总结
    AngularJS与服务器交互(4)
    android 串口调试
    QCom MSM MDP显示驱动一些点的简记
    如何提高android串口kernel log等级
    高通平台msm8909 LK 实现LCD 兼容
    MSM8909平台 LED背光的控制
    铝聚合物电池工作温度及低温电量差异的说明
    液晶屏工作稳定说明
  • 原文地址:https://www.cnblogs.com/hanhaiyuntao/p/15186348.html
Copyright © 2011-2022 走看看