说说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 遍历对象中的子对象
Jul 03 Javascript
读jQuery之十三 添加事件和删除事件的核心方法
Aug 23 Javascript
将input file的选择的文件清空的两种解决方案
Oct 21 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
Aug 21 Javascript
谈一谈bootstrap响应式布局
May 23 Javascript
JavaScript SHA-256加密算法详细代码
Oct 06 Javascript
如何处理JSON中的特殊字符
Nov 30 Javascript
JS实现点击复选框变更DIV显示状态的示例代码
Dec 18 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
Feb 22 Javascript
vue中v-show和v-if的异同及v-show用法
Jun 06 Javascript
javascript实现blob加密视频源地址的方法
Aug 08 Javascript
JS 图片压缩原理与实现方法详解
Apr 29 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
用PHPdig打造属于你自己的Google[图文教程]
2007/02/14 PHP
php 代码优化的42条建议 推荐
2009/09/25 PHP
php中日期加减法运算实现代码
2011/12/08 PHP
php安全之直接用$获取值而不$_GET 字符转义
2012/06/03 PHP
PHP在不同页面间传递Json数据示例代码
2013/06/08 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
PHP共享内存使用与信号控制实例分析
2018/05/09 PHP
JavaScript入门教程(7) History历史对象
2009/01/31 Javascript
uploadify 3.0 详细使用说明
2012/06/18 Javascript
js截取固定长度的中英文字符的简单实例
2013/11/22 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
jquery控制display属性为none或block
2014/03/31 Javascript
js对象内部访问this修饰的成员函数示例
2014/04/27 Javascript
更快的异步执行(setTimeout多浏览器)
2014/08/12 Javascript
js实现按钮控制图片360度翻转特效的方法
2015/02/17 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
2015/10/21 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
vue-cli 引入、配置axios的方法
2018/05/08 Javascript
关于vue表单提交防双/多击的例子
2019/10/31 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
2020/10/29 Javascript
[51:17]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
[30:00]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第二场 11.28
2020/12/01 DOTA
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
pytorch查看模型weight与grad方式
2020/06/24 Python
入党积极分子介绍信
2014/01/17 职场文书
什么样的创业计划书可行性高?
2014/02/01 职场文书
活动倡议书范文
2014/05/13 职场文书
校园广播稿100字
2014/10/06 职场文书
中学推普周活动总结
2015/05/07 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
简述python四种分词工具,盘点哪个更好用?
2021/04/13 Python
gateway网关接口请求的校验方式
2021/07/15 Java/Android
从零开始在Centos7上部署SpringBoot项目
2022/04/07 Servers