說說Vuex的getters屬性的具體用法
什么是getters
在介紹state中我們了解到,在Store倉庫里,state就是用來存放數(shù)據(jù),若是對(duì)數(shù)據(jù)進(jìn)行處理輸出,比如數(shù)據(jù)要過濾,一般我們可以寫到computed中。但是如果很多組件都使用這個(gè)過濾后的數(shù)據(jù),比如餅狀圖組件和曲線圖組件,我們是否可以把這個(gè)數(shù)據(jù)抽提出來共享?這就是getters存在的意義。我們可以認(rèn)為,【getters】是store的計(jì)算屬性。
源碼分析
wrapGetters初始化getters,接受3個(gè)參數(shù),store表示當(dāng)前的Store實(shí)例,moduleGetters當(dāng)前模塊下所有的getters,modulePath對(duì)應(yīng)模塊的路徑
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不允許重復(fù),否則會(huì)報(bào)錯(cuò) return } store._wrappedGetters[getterKey] = function `wrappedGetter` (store{ // 將每一個(gè)getter包裝成一個(gè)方法,并且添加到store._wrappedGetters對(duì)象中, return rawGetter( //執(zhí)行g(shù)etter的回調(diào)函數(shù),傳入三個(gè)參數(shù),(local state,store getters,rootState) getNestedState(store.state, modulePath), // local state //根據(jù)path查找state上嵌套的state store.getters, // store上所有的getters store.state // root state)}}) } //根據(jù)path查找state上嵌套的state function `getNestedState` (state, path) { return path.length ? path.reduce((state, key) => state[key], state): state}
1 應(yīng)用場(chǎng)景
假設(shè)我們?cè)?Vuex 中定義了一個(gè)數(shù)組:
const store = new Vuex.Store({ state: { list:[1,3,5,7,9,20,30] } ... })
業(yè)務(wù)場(chǎng)景希望過濾出大于 5 的數(shù)。馬上想到的方法可能的是:在組件的計(jì)算屬性中進(jìn)行過濾:
<template> <div> {{list}} </div> </template> <script> export default { name: "index.vue", computed: { list() { return this.$store.state.list.filter(item => item > 5); } } } </script>
效果:
功能雖然實(shí)現(xiàn)了,但如果其它組件也需要過濾后的數(shù)據(jù),那么就得把 index.vue 中的計(jì)算過濾代碼復(fù)制出來。如果過濾規(guī)則發(fā)生變化,還得一一修改這些組件中的計(jì)算屬性,很難維護(hù)。這種場(chǎng)景下,我們就可以使用 getters 屬性啦O(∩_∩)O~
2 基礎(chǔ)用法
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>
效果達(dá)到了,而且只需要在一處維護(hù)過濾規(guī)則即可。
3 內(nèi)部依賴
getter 可以依賴其它已經(jīng)定義好的 getter。比如我們需要統(tǒng)計(jì)過濾后的列表數(shù)量,就可以依賴之前定義好的過濾函數(shù)。
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>
效果:
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue.js實(shí)現(xiàn)插入數(shù)值與表達(dá)式的方法分析
這篇文章主要介紹了vue.js實(shí)現(xiàn)插入數(shù)值與表達(dá)式的方法,結(jié)合實(shí)例形式分析了vue.js常見的3種插入數(shù)值實(shí)現(xiàn)方式,并總結(jié)了vue.js插值與表達(dá)式相關(guān)使用技巧,需要的朋友可以參考下2018-07-07vue實(shí)現(xiàn)tab欄點(diǎn)擊高亮效果
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)tab欄點(diǎn)擊高亮效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08vue項(xiàng)目中echarts自適應(yīng)問題的高級(jí)解決過程
雖然老早就看過很多echarts的例子,但自己接觸的項(xiàng)目中一直都沒有真正用到過,直到最近才開始真正使用,下面這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目中echarts自適應(yīng)問題的高級(jí)解決過程,需要的朋友可以參考下2023-05-05VUEJS 2.0 子組件訪問/調(diào)用父組件的實(shí)例
下面小編就為大家分享一篇VUEJS 2.0 子組件訪問/調(diào)用父組件的實(shí)例。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02Vue中使用Openlayer實(shí)現(xiàn)加載動(dòng)畫效果
這篇文章主要介紹了Vue+Openlayer加載動(dòng)畫效果的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08你知道Vue中神奇的$set是如何實(shí)現(xiàn)的嗎?
在日常開發(fā)中,$set的也是一個(gè)非常實(shí)用的API。但是我們知其然更要知其所以然,接下來就跟隨小編一起看一下Vue中的$set是如何實(shí)現(xiàn)的吧2022-12-12Vue監(jiān)聽localstorage變化的方法詳解
在日常開發(fā)中,我們經(jīng)常使用localStorage來存儲(chǔ)一些變量,這些變量會(huì)存儲(chǔ)在瀏覽中,對(duì)于localStorage來說,即使關(guān)閉瀏覽器,這些變量依然存儲(chǔ)著,方便我們開發(fā)的時(shí)候在別的地方使用,本文就給大家介紹Vue如何監(jiān)聽localstorage的變化,需要的朋友可以參考下2023-10-10vant組件表單外部的button觸發(fā)form表單的submit事件問題
這篇文章主要介紹了vant組件表單外部的button觸發(fā)form表單的submit事件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06