说说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 相关文章推荐
JavaScript判断一个URL链接是否有效的实现方法
Oct 08 Javascript
javascript基础之查找元素的详细介绍(访问节点)
Jul 05 Javascript
关于js数组去重的问题小结
Jan 24 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
Mar 24 Javascript
JavaScript的Polymer框架中dom-repeat与VM的相关操作
Jul 29 Javascript
canvas绘制环形进度条
Feb 23 Javascript
JavaScript简介_动力节点Java学院整理
Jun 26 Javascript
详解js静态资源文件请求的处理
Aug 01 Javascript
Vue全家桶实践项目总结(推荐)
Nov 04 Javascript
animate.css在vue项目中的使用教程
Aug 05 Javascript
JS实现checkbox互斥(单选)功能示例
May 04 Javascript
详细介绍Next.js脚手架完整搭建封装
Apr 26 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操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
PHP滚动日志的代码实现
2015/06/10 PHP
golang与php实现计算两个经纬度之间距离的方法
2016/07/22 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
JQuery验证工具类搜集整理
2013/01/16 Javascript
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
2016/12/27 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
React中ES5与ES6写法的区别总结
2017/04/21 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
js中DOM事件绑定分析
2018/03/18 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
2018/11/05 Javascript
IntelliJ IDEA编辑器配置vue高亮显示
2019/09/26 Javascript
Vue实现仿iPhone悬浮球的示例代码
2020/03/13 Javascript
如何管理Vue中的缓存页面
2021/02/06 Vue.js
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
利用python批量检查网站的可用性
2016/09/09 Python
python计算auc指标实例
2017/07/13 Python
利用Python如何制作好玩的GIF动图详解
2018/07/11 Python
Python wxPython库消息对话框MessageDialog用法示例
2018/09/03 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
python plotly画柱状图代码实例
2019/12/13 Python
python实现修改固定模式的字符串内容操作示例
2019/12/30 Python
检测tensorflow是否使用gpu进行计算的方式
2020/02/03 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
canvas 如何绘制线段的实现方法
2018/07/12 HTML / CSS
美国休闲服装品牌:J.Crew Factory
2017/03/04 全球购物
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
自行车广告词大全
2014/03/21 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书
springboot使用Redis作缓存使用入门教程
2021/07/25 Redis
CentOS MySql8 远程连接实战
2022/04/19 MySQL