说说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知识点三 jquery表单对象操作
Jan 17 Javascript
jQuery 如何先创建、再修改、后添加DOM元素
May 20 Javascript
简介JavaScript中的setTime()方法的使用
Jun 11 Javascript
jQuery.extend 函数及用法详细
Sep 06 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
Dec 08 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
Jul 22 Javascript
BootStrap Datetimepicker 汉化的实现代码
Feb 10 Javascript
Angular实现可删除并计算总金额的购物车功能示例
Dec 26 Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
Apr 13 Javascript
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
Sep 25 Javascript
JS面向对象编程实现的Tab选项卡案例详解
Mar 03 Javascript
JS前端使用canvas实现物体的点选示例
Aug 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
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
php中将html中的br换行符转换为文本输入中的换行符
2013/03/26 PHP
phpphp图片采集后按原路径保存图片示例
2014/02/18 PHP
简单说说PHP优化那些事(经验分享)
2014/11/27 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
Laravel 数据库加密及数据库表前缀配置方法
2019/10/10 PHP
用js生产批量批处理执行命令
2008/07/28 Javascript
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
js 动态选中下拉框
2009/11/26 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
JavaScript根据数据生成百分比图和柱状图的实例代码
2013/07/14 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
使用jQuery操作HTML的table表格的实例解析
2016/03/13 Javascript
第十篇BootStrap轮播插件使用详解
2016/06/21 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
2018/04/22 Javascript
Vue.js单向绑定和双向绑定实例分析
2018/08/14 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
vue-cli随机生成port源码的方法
2019/09/02 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
2017/04/17 Python
Python面向对象编程基础解析(二)
2017/10/26 Python
python3实现windows下同名进程监控
2018/06/21 Python
python中几种自动微分库解析
2019/08/29 Python
python将邻接矩阵输出成图的实现
2019/11/21 Python
Html5定位终极解决方案
2020/02/05 HTML / CSS
小学音乐教学反思
2014/02/05 职场文书
梅花魂教学反思
2014/04/25 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书
大学生实习推荐信
2015/03/27 职场文书
2019最新版股权转让及委托持股协议书范本
2019/08/07 职场文书
numpy数据类型dtype转换实现
2021/04/24 Python
Python人工智能之混合高斯模型运动目标检测详解分析
2021/11/07 Python