zoukankan      html  css  js  c++  java
  • vuex 中辅助函数mapGetters的基本用法详解

    mapGetters 辅助函数

    mapGetters 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性:

    1、在组件或界面中不使用mapGetter调用映射vuex中的getter 

      1.1 调用映射根部store中的getter

    <!-- test.vue -->
    <template>
      <div class="vuexReponse">
        <div @click="changeVal">点击</div>
        <div>"stateHello: "{{stateHello}}</div>
        <div>"gettersHello: "{{gettersHello}}</div>
      </div>
    </template>
    <script>
    export default {
      watch: {
        gettersHello(newVal, oldVal) {
          console.log("gettersHello newVal", newVal);
          console.log("gettersHello oldVal", oldVal);
        }
      },
      computed: {
        stateHello() {
          return this.$store.state.stateHello
        },
        gettersHello() {
          return this.$store.getters.gettersHello
        }
      },
      methods: {
        changeVal() {
          this.$store.commit("mutationsHello", 2)
        }
      }
    }
    </script>
    /**
     * store.js
     */
    import Vue from 'vue'
    import Vuex from 'vuex'
    
    Vue.use(Vuex)
    export default new Vuex.Store({
      state: {
        stateHello: 1
      },
      getters: {
        gettersHello: (state) => {
          return state.stateHello * 2
        }
      },
      mutations: {
        mutationsHello(state, val) {
          console.log("val", val); // 2
          state.stateHello += val
        }
      },
    })

      流程: 在test.vue 界面中点击调用 changeVal(), changeVal方法通过commite 传参val 并调用 store.js中的 mutationsHello() 方法, mutationsHello方法修改state中的stateHello的值,在getters 的 gettersHello 中监听 stateHello的值,stateHello的值的改变触发了gettersHello,在test.vue界面computed 中计算了 store.getters.gettersHello ,这个就将 gettersHello 映射到 store.gettes.gettersHello 的值,通过模板 将gettersHello 渲染到dom中,同时由于 gettersHello 的改变也能触发watch中 gettersHello,实现对store.getters.gettersHello 数据改变的监听。

      1.2 调用映射modules模块store中的getter

    <!-- moduleTest.vue -->
    <template>
      <div class="vuexReponse">
        <div @click="changeVal">点击</div>
        <div>stateHello: {{stateHello}}</div>
        <div>gettersHello: {{gettersHello}}</div>
      </div>
    </template>
    
    <script>
    export default {
      watch: {
        gettersHello(newVal, oldVal) {
          console.log("gettersHello newVal", newVal);
          console.log("gettersHello oldVal", oldVal);
        }
      },
      computed: {
        stateHello() {
          return this.$store.state.vuexTest.stateHello
        },
        gettersHello() {
          return this.$store.getters['vuexTest/gettersHello']
        }
      },
      methods: {
        changeVal() {
          this.$store.commit("vuexTest/mutationsHello", 2)
        }
      }
    }
    </script>
    /**
     * 模块 vuexTest.js
     */
    export default {
        namespaced: true,
        state: {
            stateHello: 1,
        },
        getters: {
            gettersHello: (state, getters, rootState, rootGetters) => {
                console.log("state", state);
                console.log("getters", getters);
                console.log("rootState", rootState);
                console.log("rootGetters", rootGetters);
                return state.stateHello * 2
            }
        },
        mutations: {
            mutationsHello(state, val) {
                console.log("1111");
                console.log("val", val);
                state.stateHello += val
            }
        },
        actions: {
    
        }
    }

      需要注意的地方是在 computed 中计算映射 模块中的getters 的方法时 调用方式与 获取模块中的state 中的数据不同

    this.$store.getters['vuexTest/gettersHello']

    2、在组件或界面中使用mapGetter调用映射vuex中的getter 

      2.1 调用映射根部store中的getter

    /**
     * store.js
     */
     import Vue from 'vue'
     import Vuex from 'vuex'
     
     Vue.use(Vuex)
     export default new Vuex.Store({
       state: {
         stateHello: 1
       },
       getters: {
         gettersHello: (state) => {
           return state.stateHello * 2
         }
       },
       mutations: {
         mutationsHello(state, val) {
           state.stateHello += val
         }
       },
     })
    <!-- Test.vue -->
    <template>
      <div class="vuexReponse">
        <div @click="changeVal">点击</div>
        <div>stateHello: {{stateHello}}</div>
        <div>gettersHello: {{gettersHello}}</div>
        <div>gettersHelloOther {{gettersHelloOther}}</div>
      </div>
    </template>
    
    <script>
    import { mapGetters } from "vuex";
    export default {
      name: "vuexReponse",
      components: {
    
      },
      data() {
        return {
    
        }
      },
      watch: {
        gettersHello(newVal, oldVal) {
          console.log("gettersHello newVal", newVal);
          console.log("gettersHello oldVal", oldVal);
        }
      },
      computed: {
        stateHello() {
          return this.$store.state.stateHello
        },
        ...mapGetters(["gettersHello"]), // 数组形式
        ...mapGetters({   // 对象形式 
          gettersHello: "gettersHello"
        }),
        ...mapGetters({
          gettersHelloOther: "gettersHello" // 对象形式下 改变映射
        }),
      },
      methods: {
        changeVal() {
          this.$store.commit("mutationsHello", 2)
        }
      }
    }
    </script>

      

      2.2 调用映射根部store中的getter

    /**
     * vuexTest.js
     */
     export default {
        namespaced: true,
        state: {
            stateHello: 1,
        },
        getters: {
            gettersHello: (state, getters, rootState, rootGetters) => {
                console.log("state", state);
                console.log("getters", getters);
                console.log("rootState", rootState);
                console.log("rootGetters", rootGetters);
                return state.stateHello * 2
            }
        },
        mutations: {
            mutationsHello(state, val) {
                console.log("1111");
                console.log("val", val);
                state.stateHello += val
            }
        },
        actions: {
    
        }
    } 
    <!-- module test.vue -->
    <template>
      <div class="vuexReponse">
        <div @click="changeVal">点击</div>
        <div>stateHello: {{stateHello}}</div>
        <div>gettersHello: {{gettersHello}}</div>
        <div>gettersHelloOther {{gettersHelloOther}}</div>
      </div>
    </template>
    
    <script>
    import { mapGetters } from "vuex";
    export default {
      name: "vuexReponse",
      watch: {
        gettersHello(newVal, oldVal) {
          console.log("gettersHello newVal", newVal);
          console.log("gettersHello oldVal", oldVal);
        }
      },
      computed: {
        stateHello() {
          return this.$store.state.vuexTest.stateHello
        },
        ...mapGetters("vuexTest", ["gettersHello"]), // 数组形式
        ...mapGetters("vuexTest", {   // 对象形式 
          gettersHello: "gettersHello"
        }),
        ...mapGetters("vuexTest", {
          gettersHelloOther: "gettersHello" // 对象形式下 改变映射
        }),
      },
      methods: {
        changeVal() {
          this.$store.commit("vuexTest/mutationsHello", 2)
        }
      }
    }
    </script>
  • 相关阅读:
    leetcode教程系列——Binary Tree
    《Ranked List Loss for Deep Metric Learning》CVPR 2019
    《Domain Agnostic Learning with Disentangled Representations》ICML 2019
    Pytorch从0开始实现YOLO V3指南 part5——设计输入和输出的流程
    Pytorch从0开始实现YOLO V3指南 part4——置信度阈值和非极大值抑制
    Pytorch从0开始实现YOLO V3指南 part3——实现网络前向传播
    Pytorch从0开始实现YOLO V3指南 part2——搭建网络结构层
    Pytorch从0开始实现YOLO V3指南 part1——理解YOLO的工作
    让我佩服的人生 文章
    win8.1配置cordova+ionic等一系列东西
  • 原文地址:https://www.cnblogs.com/aidixie/p/14980957.html
Copyright © 2011-2022 走看看