说说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 相关文章推荐
ExtJS 2.0实用简明教程 之ExtJS版的Hello
Apr 29 Javascript
一个简单的Ext.XTemplate的实例代码
Mar 18 Javascript
用jquery存取照片的具体实现方法
Jun 30 Javascript
jQuery中prevUntil()方法用法实例
Jan 08 Javascript
js实现的页面矩阵图形变换特效
Jan 26 Javascript
怎么引入(调用)一个JS文件
May 26 Javascript
解析浏览器端的AJAX缓存机制
Jun 21 Javascript
jQuery右下角悬浮广告实例
Oct 17 Javascript
jQuery复合事件用法示例
Jun 10 jQuery
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
Dec 26 Javascript
js中Object.defineProperty()方法的不详解
Jul 09 Javascript
three.js搭建室内场景教程
Dec 30 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
mysql,mysqli,PDO的各自不同介绍
2012/09/19 PHP
php检查日期函数checkdate用法实例
2015/03/19 PHP
PHP遍历数组的方法汇总
2015/04/30 PHP
php自动载入类用法实例分析
2016/06/24 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
javascript新手语法小结
2008/06/15 Javascript
基于Jquery的简单&amp;简陋Tabs插件代码
2010/02/09 Javascript
最佳JS代码编写的14条技巧
2011/01/09 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
分享经典的JavaScript开发技巧
2015/11/21 Javascript
Jquery遍历select option和添加移除option的实现方法
2016/08/26 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
BootStrapTable 单选及取值的实现方法
2017/01/10 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
xmlplus组件设计系列之图标(ICON)(1)
2017/05/05 Javascript
微信小程序picker组件简单用法示例【附demo源码下载】
2017/12/05 Javascript
React Native自定义控件底部抽屉菜单的示例
2018/02/08 Javascript
基于layui的table插件进行复选框联动功能的实现方法
2019/09/19 Javascript
JavaScript运动原理基础知识详解
2020/04/02 Javascript
element跨分页操作选择详解
2020/06/29 Javascript
Python 制作糗事百科爬虫实例
2016/09/22 Python
python 获取网页编码方式实现代码
2017/03/11 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
python通过对字典的排序,对json字段进行排序的实例
2020/02/27 Python
在 Pycharm 安装使用black的方法详解
2020/04/02 Python
沙特阿拉伯排名第一的在线时尚购物应用程序:1Zillion
2020/08/08 全球购物
教导处工作制度
2014/01/18 职场文书
珠宝店促销方案
2014/03/21 职场文书
小学生评语集锦
2014/04/18 职场文书
提拔干部考察材料
2014/05/26 职场文书
个人批评与自我批评发言稿
2014/09/28 职场文书
公安交警个人对照检查材料思想汇报
2014/10/01 职场文书
内乡县衙导游词
2015/02/05 职场文书
2015年学生会干事工作总结
2015/04/09 职场文书
导游词书写之黄山
2019/08/06 职场文书
详解分布式系统中如何用python实现Paxos
2021/05/18 Python