说说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 操作select标签实现代码
May 14 Javascript
jQuery实现点击标题输入详细信息
Apr 16 Javascript
jquery实现的图片点击滚动效果
Apr 29 Javascript
在Javascript中处理字符串之big()方法的使用
Jun 08 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
Aug 11 Javascript
详解获取jq ul第一个li定位的四种解决方案
Nov 23 Javascript
headjs实现网站并行加载但顺序执行JS
Nov 29 Javascript
ES6中module模块化开发实例浅析
Apr 06 Javascript
js构建二叉树进行数值数组的去重与优化详解
Mar 26 Javascript
在微信小程序中使用mqtt服务的方法
Dec 13 Javascript
使用Vue 自定义文件选择器组件的实例代码
Mar 04 Javascript
Javascript设计模式之原型模式详细
Oct 05 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对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
2016/01/11 PHP
php 可变函数使用小结
2018/06/12 PHP
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
Js+Flash实现访问剪切板操作
2012/11/20 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
2013/11/08 Javascript
Jquery性能优化详解
2014/05/15 Javascript
原生js实现class的添加和删除简单代码
2016/07/12 Javascript
js实现非常棒的弹出div
2016/10/06 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
微信小程序之数据缓存的实例详解
2017/09/29 Javascript
JS实现获取进今年第几天是周几的方法分析
2018/06/27 Javascript
JavaScript事件冒泡与事件捕获实例分析
2018/08/01 Javascript
浅谈vue引用静态资源需要注意的事项
2018/09/28 Javascript
JavaScript使用Math.random()生成简单的验证码
2019/01/21 Javascript
VUE+node(express)实现前后端分离
2019/10/13 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
[41:17]完美世界DOTA2联赛PWL S3 access vs CPG 第二场 12.13
2020/12/17 DOTA
python与php实现分割文件代码
2017/03/06 Python
Python 支付整合开发包的实现
2019/01/23 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
python检查目录文件权限并修改目录文件权限的操作
2020/03/11 Python
html5页面结构_动力节点Java学院整理
2017/07/10 HTML / CSS
canvas 实现 github404动态效果的示例代码
2017/11/15 HTML / CSS
威尔逊皮革:Wilsons Leather
2018/12/07 全球购物
如何在Shell脚本中使用函数
2015/09/06 面试题
学生宿舍管理制度
2014/01/30 职场文书
KTV的创业计划书范文
2014/02/02 职场文书
公司员工检讨书
2014/02/08 职场文书
超市优秀员工事迹材料
2014/05/01 职场文书
2015年学校党建工作总结
2015/05/19 职场文书
python 调用js的四种方式
2021/04/11 Python
Python中zipfile压缩包模块的使用
2021/05/14 Python
pandas DataFrame.shift()函数的具体使用
2021/05/24 Python