詳解VUEX中的mapGetters
08-11
詳解VUEX中的mapGetters
推薦閱讀:
4 人贊了文章最近想把我們公司的後台管理由 http://ASP.NET MVC 轉為 SPA,想著 AngularJs的入門陡峭曲線,最終還是決定選用VUE + ElementUI 開發,從 github 上
https://codeload.github.com/PanJiaChen/vue-element-admin/zip/master 下了這個模板,老實說,vue的入門曲線不高,如果結合 webpack , 那就很高了;我是一個喜歡刨根問底的傢伙,看到不理解的東東基本上會一直往下挖,例如看到這樣的代碼:請注意, ...... 表示省略了內容的代碼;不是表示 ES6中的擴展符;import { mapGetters } from vuex;
computed: { ...mapGetters([ name, avatar ]),......首先申明,本人以前基本上寫http://ASP.NET MVC,所以對於ES6的語法了解不多。所以如果有什麼理解錯誤,大家海涵;import { mapGetters } from vuex這句好理解,無非就是從 vuex 包中引入 mapGetters 進來;
vuex包中定義的 mapGetters函數如下export const mapGetters = normalizeNamespace((namespace, getters) => { //注意, normalizeNamespace 對參數進行了預處理, //所以,(namespace, getters) 只傳入namespace 例如 [name,avatar] 時, //實際會變為 namespace=, getters=[name,avatar] const res = {} //normalizeMap 對 getters 參數進行了轉換,編為 [{key:name,val:name]...形式的數組; normalizeMap(getters).forEach(({ key, val }) => { //上面的 forEach 函數,不知道是否是 es6的新語法,//相當於如下寫法: normalizeMap(getters).forEach(item=>(item.key,item.val)=>...
//即取出數組內每一個元素的 key 和 val 屬性,傳入到 後續函數中; val = namespace + val //給 res 增加 key屬性 和對應的取值函數; res[key] = function mappedGetter () { if (namespace && !getModuleByNamespace(this.$store, mapGetters, namespace)) { return } if (!(val in this.$store.getters)) { console.error(`[vuex] unknown getter: ${val}`)return
} return this.$store.getters[val] } // mark vuex getter for devtools res[key].vuex = true }) /* 返回res;res 最終將是一個 { name:function() { ... return this.$store.getters[name] ...}, avatar:function() { ... return this.$store.getters[avatar]... }}
的對象 */ return res })/**這個很簡單,如果參數map是數組,將其轉換為對象數組 { key:數組元素,val:數組元素},* 如果 map 是對象,將其屬性和值編為如下形式的對象:* { key:屬性名稱,val:屬性值}*/
function normalizeMap (map) { return Array.isArray(map) ? map.map(key => ({ key, val: key })) : Object.keys(map).map(key => ({ key, val: map[key] }))}/* 這個函數很簡單,傳入一個函數 fn,該函數接收兩個參數: * 兩個參數中的第1個參數如果不為字元串,則將其作為第2個參數, * 第1個參數傳入空字元串,再去調用傳入的函數 fn; * 如果為字元串,在判斷其最後一個字元是否是/,如果不是/,追加上 /* 再去調用傳入的函數 fn
*/function normalizeNamespace (fn) { return (namespace, map) => { if (typeof namespace !== string) { map = namespace namespace = } else if (namespace.charAt(namespace.length - 1) !== /) { namespace += / }return fn(namespace, map)
}}上面解釋了 mapGetters函數之後,下面就好解釋了:
computed: { ...mapGetters([ name, avatar ]),computed: {
/** mapGetters 函數見下面說明,總之,其將返回: { name:function() { ...... return this.$store.getters[name] ......}, avatar:function() { ...... return this.$store.getters[avatar]...... } ...... } 的對象, ... 則用來表示擴展運算符(...)用於取出參數對象的所有可遍歷屬性,並將此屬性和值拷貝到當前對象之中參見這兒 ECMAScript 6入門 ; 於是, mapGetters 返回的對象中的屬性就複製到了 computed 屬性對應的對象中:*/...mapGetters([ name, avatar, email, uid, introduction, roles]),好了,其他的 mapState, mapMutations, mapActions 都是類似的方法,
只是不是從 getters中返回而是分別按照如下定義返回: return typeof val === function? val.call(this, state, getters): state[val] return this.$store.commit.apply(this.$store, [val].concat(args))return this.$store.dispatch.apply(this.$store, [val].concat(args))推薦閱讀:
TAG:Vuex |