中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vuex中如何應用mapState

發布時間:2021-10-09 15:09:50 來源:億速云 閱讀:184 作者:iii 欄目:開發技術

本篇內容主要講解“vuex中如何應用mapState”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“vuex中如何應用mapState”吧!

目錄
  • 1、map方法

  • 2、應用

背景:

在需求開發過程中,有的接口返回的結果中有很多字段需要展示到頁面上。通常可以將這些字段在.vue文件中封裝為計算屬性,或者重新將對應字段賦值到 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 = {}
  // 注意:返回的方法不要使用箭頭函數,否則拿不到 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”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

聊城市| 临西县| 阿合奇县| 永宁县| 静安区| 文成县| 饶平县| 霍林郭勒市| 星子县| 河曲县| 区。| 铜陵市| 布尔津县| 白水县| 营口市| 桦川县| 喜德县| 奈曼旗| 古蔺县| 永靖县| 商都县| 白城市| 乌苏市| 额济纳旗| 漳平市| 陆川县| 万源市| 石渠县| 金昌市| 和静县| 加查县| 昭觉县| 庆云县| 汉沽区| 田东县| 抚远县| 洛浦县| 固始县| 依安县| 安西县| 靖安县|