欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

说说Vuex的getters属性的具体用法

程序员文章站 2022-08-18 16:51:35
什么是getters 在介绍state中我们了解到,在store仓库里,state就是用来存放数据,若是对数据进行处理输出,比如数据要过滤,一般我们可以写到compute...

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

效果:

说说Vuex的getters属性的具体用法

功能虽然实现了,但如果其它组件也需要过滤后的数据,那么就得把 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>

效果:

说说Vuex的getters属性的具体用法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。