核心概念--Getter

Vuex 允許我們在 store 中定義“getter”(可以認為是 store 的計算屬性)。就像計算屬性一樣,getter 的返回值會根據它的依賴被緩存起來,且只有當它的依賴值發生了改變才會被重新計算。

const store = new Vuex.Store({
   state: {
      todos: [
         {
           id: 1,
           text: '...',
           done: true
         },
         {
           id: 2,
           text: '...',
           done: false
         }         
      ]
   },
   getters: {
      doneTodos: state => {
         return state.todos.filter(todo => todo.done)
      }
   }
})

(1) 通過屬性訪問

  • Getter 會暴露為 store.getters 對象,你可以以屬性的形式訪問這些值:
  store.getters.doneTodos // -> [{ id: 1, text: '...', done: true }]
  • Getter 也可以接受其他getter 作為第二個參數:
  getters: {
     // ...
     doneTodosCount: (state, getters) => {
        return getters.doneTodos.length;
     }
  }

  store.getters.doneTodosCount // 1
  • 我們可以很容易的在任何組件中使用它:
  computed: {
     doneTodosCount (){
        return this.$store.getters.doneTodosCount;
     }
  }

(2) 通過方法訪問

你也可以通過讓 getter 返回一個函數,來實現給 getter 傳參

getters: {
  // ...
  getTodoById: (state) => (id) => {
    return state.todos.find(todo => todo.id === id)
  }
}

store.getters.getTodoById(2) // -> { id: 2, text: '...', done: false }

注意,getter 在通過方法訪問時,每次都會去進行調用,而不會緩存結果。

(3) mapGetters 輔助函數

mapGetters 輔助函數僅僅是將 store 中的 getter 映射到局部計算屬性:

import { mapGetters } from 'vuex'

export default {
  // ...
  computed: {
  // 使用對象展開運算符將 getter 混入 computed 對象中
    ...mapGetters([
      'doneTodosCount',
      'anotherGetter',
      // ...
    ])
  }
}

經過 mapGetters 函數調用后的結果,如下所示:

import { mapGetters } from 'vuex'
export default {
  // ...
  computed: {
    doneTodosCount() {
      return this.$store.getters['doneTodosCount']
    },
    anotherGetter() {
      return this.$store.getters['anotherGetter']
    }
  }
}

再看一個參數 mapGetters 參數是對象的例子:

computed: mapGetters({
  // 映射 this.doneCount 到 store.getters.doneTodosCount
  doneCount: 'doneTodosCount'
})

經過 mapGetters 函數調用后的結果,如下所示:

computed: { 
   doneCount() { 
      return this.$store.getters['doneTodosCount'] 
   } 
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.ios高性能編程 (1).內層 最小的內層平均值和峰值(2).耗電量 高效的算法和數據結構(3).初始化時...
    歐辰_OSR閱讀 29,645評論 8 265
  • 函數和對象 1、函數 1.1 函數概述 函數對于任何一門語言來說都是核心的概念。通過函數可以封裝任意多條語句,而且...
    道無虛閱讀 4,664評論 0 5
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • ??面向對象(Object-Oriented,OO)的語言有一個標志,那就是它們都有類的概念,而通過類可以創建任意...
    霜天曉閱讀 2,140評論 0 6
  • 忘記一個人需要幾天?我不知道,但正在經歷這樣一個過程。我知道,總歸會過去的吧,或早或晚而已。只是還在遺憾,還在留戀...
    才子難裝閱讀 600評論 0 0