vuex中mapState思想應用
阿新 • • 發佈:2021-10-11
目錄
- 1、map方法
- 2、應用
背景:
在需求開發過程中,有的介面返回的結果中有很多欄位需要展示到頁面上。通常可以將這些欄位在.檔案中封裝為計算屬性,或者重新將對應欄位賦值到 data 中的欄位來達到便於使用的目的。如下:
computed(){ count1(){ return this.targetObj.count1 },count2(){ return this.targetObj.count2 },// ... // 想象一下。你要寫 5 遍 或者 10 遍類似的程式碼 }
但是不管哪種方法,都會帶來大量的程式碼冗餘,極為難受。為解決這種現象,本文借用了使用了vuex
map
方法的思想,極大的縮減了冗餘程式碼,並且能夠對資料獲取做統一的容錯處理。
1、map方法
vuex 中基本的 state 提取使用方法,可通過 以下方式:
computed(){ count(){ return this.$store.count } }
同時 vuex
也同樣注意到了問題,當 store 中要獲取的資料很多時,這種方式將會產生極大的程式碼冗餘,重複程式碼遍地走。你將會看到大量的計算屬性的定義,以及長鏈路的物件屬性提取。因此vuex
定義了一種 map 方法,用來批量的獲取 store
中的指定資料。
這種 map
方法實際上就是一種 工廠函式(高階函式),用來生產特定形式的函式。以下是原始碼,可以看到,mapState
res
,res
中的每個屬性都是一個方法,而這個方法返回 state
中的值。
var mapState = normalizeNamespace(function (namespace,states) { // 定義一個物件 用於儲存 獲取指定屬性的方法 var res = {}; normalizeMap(states).forEach(function (ref) { var key = ref.key; var val = ref.val; // 定義 獲取指定物件中指定屬性的方法 res[key] = function mappedState() { var state = this.$store.state; var getters = this.$store.getters; // 根據 namespace 查詢指定的 store 模組物件 if (namespace) { var module = getModuleByNamespace(this.$store,'mapState',namespace); if (!module) { return } state = module.context.state; getters = module.context.getters; } // 獲取通過指定 namespace 得到的 store module 中的屬性 return typeof val === 'function' ? val.call(this,state,getters) : state[val] }; }); // 返回 函式物件 return res });
2、應用
仿照這種思想,可以對某個複雜物件中的欄位的獲取方式進行優化。定義的工廠函式如下所示
export const mapTargetValue = (nameSpace,keyList = [])=>{ const result = {} // 注意:返回的方法不要使用箭頭iFfauApMd函式,否則拿不到 this // 這裡 可以相容兩種形式的 keyList ,參考 mapState 中屬性重新命名的使用形式 if(Array.isArray(keyList)){ keyList.forEach( key => result[key] = function(){ // 這裡假設 可以直接在 this 上 獲取得到 namespace物件 // 當然 指定物件的獲取複雜程度取決於 你的程式碼邏輯 return this[nameSpace][key] || 0 }) }else if(typeof keyList === 'object' && keyList){ for(let key in keyList){ result[keyList[key]] = function(){ return this[nameSpace][key] || 0} } } return result }
定義的該方法使用方式與 mapState
使用方式完全一致。與之前的取值方式相比,可大大縮減重複程式碼量。具體應用如下
computed: { ...mapTargetValue("targetObj",["count1", "count2"]),...mapTargetValue("targetObj",{ count1: "count3",count2: "count4"}),}
到此這篇關於vuex中mapState思想應用的文章就介紹到這了,更多相關vuex mapState內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!