什么是getters
在介紹state中我們了解到,在Store倉庫里,state就是用來存放數據,若是對數據進行處理輸出,比如數據要過濾,一般我們可以寫到computed中。但是如果很多組件都使用這個過濾后的數據,比如餅狀圖組件和曲線圖組件,我們是否可以把這個數據抽提出來共享?這就是getters存在的意義。我們可以認為,【getters】是store的計算屬性。
源碼分析
wrapGetters初始化getters,接受3個參數,store表示當前的Store實例,moduleGetters當前模塊下所有的getters,modulePath對應模塊的路徑
function `wrapGetters` (store, moduleGetters, modulePath) { Object.keys(moduleGetters).forEach(getterKey => { // 遍歷先所有的getters const rawGetter = moduleGetters[getterKey] if (store._wrappedGetters[getterKey]) { console.error(`[vuex] duplicate getter key: ${getterKey}`) // getter的key不允許重復,否則會報錯 return } store._wrappedGetters[getterKey] = function `wrappedGetter` (store{ // 將每一個getter包裝成一個方法,并且添加到store._wrappedGetters對象中, return rawGetter( //執行getter的回調函數,傳入三個參數,(local state,store getters,rootState) getNestedState(store.state, modulePath), // local state //根據path查找state上嵌套的state store.getters, // store上所有的getters store.state // root state)}}) } //根據path查找state上嵌套的state function `getNestedState` (state, path) { return path.length ? path.reduce((state, key) => state[key], state): state}
1 應用場景
假設我們在 Vuex 中定義了一個數組:
const store = new Vuex.Store({ state: { list:[1,3,5,7,9,20,30] } ...})
業務場景希望過濾出大于 5 的數。馬上想到的方法可能的是:在組件的計算屬性中進行過濾:
<template> <div> {{list}} </div></template><script> export default { name: "index.vue", computed: { list() { return this.$store.state.list.filter(item => item > 5); } } }</script>
效果:
功能雖然實現了,但如果其它組件也需要過濾后的數據,那么就得把 index.vue 中的計算過濾代碼復制出來。如果過濾規則發生變化,還得一一修改這些組件中的計算屬性,很難維護。這種場景下,我們就可以使用 getters 屬性啦O(∩_∩)O~
2 基礎用法
main.js:
const store = new Vuex.Store({ state: { list: [1, 3, 5, 7, 9, 20, 30] }, getters: { filteredList: state => { return state.list.filter(item => item > 5) } }})
index.vue:
<script> export default { name: "index.vue", computed: { list() { return this.$store.getters.filteredList; } } }</script>
效果達到了,而且只需要在一處維護過濾規則即可。
3 內部依賴
getter 可以依賴其它已經定義好的 getter。比如我們需要統計過濾后的列表數量,就可以依賴之前定義好的過濾函數。
main.js:
const store = new Vuex.Store({ state: { list: [1, 3, 5, 7, 9, 20, 30] }, getters: { filteredList: state => { return state.list.filter(item => item > 5) }, listCount: (state, getters) => { return getters.filteredList.length; } }})
index.vue:
<template> <div> 過濾后的列表:{{list}} <br> 列表長度:{{listCount}} </div></template><script> export default { name: "index.vue", computed: { list() { return this.$store.getters.filteredList; }, listCount() { return this.$store.getters.listCount; } } }</script>
效果:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答