国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

說說Vuex的getters屬性的具體用法

2019-11-19 11:46:51
字體:
來源:轉載
供稿:網友

什么是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>

效果:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鹰潭市| 德惠市| 泰州市| 枣庄市| 江津市| 丹江口市| 万山特区| 南昌县| 仪征市| 卓尼县| 宜章县| 洪雅县| 孝感市| 龙游县| 林甸县| 大名县| 靖宇县| 万荣县| 台东县| 定日县| 利川市| 博乐市| 贵阳市| 高青县| 泸定县| 太仆寺旗| 泾川县| 尤溪县| 寿光市| 柘荣县| 鹿邑县| 四川省| 太白县| 靖西县| 湛江市| 高邑县| 通许县| 区。| 绥滨县| 岳阳县| 景洪市|