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


Posted in Javascript onApril 15, 2019

什么是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属性的具体用法

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

Javascript 相关文章推荐
jquery $(&quot;#variable&quot;) 循环改变variable的值示例
Feb 23 Javascript
javascript实现博客园页面右下角返回顶部按钮
Feb 22 Javascript
JavaScript中用getDate()方法返回指定日期的教程
Jun 09 Javascript
前端面试题及答案整理(二)
Aug 26 Javascript
Bootstrap 填充Json数据的实例代码
Jan 11 Javascript
微信小程序Redux绑定实例详解
Jun 07 Javascript
详解Vue路由钩子及应用场景(小结)
Nov 07 Javascript
JavaScript程序设计高级算法之动态规划实例分析
Nov 24 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
Apr 29 Javascript
ES6 Object属性新的写法实例小结
Jun 25 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
Jul 24 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
Apr 10 Javascript
vue 中Virtual Dom被创建的方法
Apr 15 #Javascript
详解jQuery中的getAll()和cleanData()
Apr 15 #jQuery
详解javascript对数组和json数组的操作
Apr 15 #Javascript
详解vue中router-link标签所必备了解的属性
Apr 15 #Javascript
详解小程序设置缓存并且不覆盖原有数据
Apr 15 #Javascript
JavaScript使用ul中li标签实现删除效果
Apr 15 #Javascript
vue 父组件给子组件传值子组件给父组件传值的实例代码
Apr 15 #Javascript
You might like
深入解析php之sphinx
2013/05/15 PHP
php中的Base62类(适用于数值转字符串)
2013/08/12 PHP
php实现通过ftp上传文件
2015/06/19 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
php gd等比例缩放压缩图片函数
2016/06/12 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/01/13 Javascript
摘自百度的图片轮换效果代码
2007/11/19 Javascript
利用js的Node遍历找到repeater的一个字段实例介绍
2013/04/25 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
js中关于一个分号的崩溃示例
2013/11/11 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
2016/05/31 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
2017/02/09 Javascript
bootstrap中模态框、模态框的属性实例详解
2017/02/17 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
vue中如何实现变量和字符串拼接
2017/06/19 Javascript
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
javascript 产生随机数的几种方法总结
2017/09/26 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
[03:28]2014DOTA2国际邀请赛 EG战队官方纪录片
2014/07/21 DOTA
Python Web开发模板引擎优缺点总结
2014/05/06 Python
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
pip install urllib2不能安装的解决方法
2018/06/12 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
python retrying模块的使用方法详解
2019/09/25 Python
基于python的列表list和集合set操作
2019/11/24 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
新大陆软件面试题
2016/11/24 面试题
中科软笔试题和面试题
2014/10/07 面试题
护理学专业推荐信
2013/12/03 职场文书
生日派对邀请函
2014/01/13 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
行政经理岗位职责
2015/04/15 职场文书