说说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 相关文章推荐
js下用eval生成JSON对象
Sep 17 Javascript
jquery $.getJSON()跨域请求
Dec 21 Javascript
js中对象的声明方式以及数组的一些用法示例
Dec 11 Javascript
通过JS判断联网类型和连接状态的实现代码
Apr 01 Javascript
基于javascript实现九宫格大转盘效果
May 28 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
Jul 05 Javascript
AngularJs Understanding the Model Component
Sep 02 Javascript
浅谈JS使用[ ]来访问对象属性
Sep 21 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
Dec 29 Javascript
Node.JS中事件轮询(Event Loop)的解析
Feb 25 Javascript
使用JS获取SessionStorage的值
Jan 12 Javascript
webpack+react+antd脚手架优化的方法
Apr 02 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
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
php UTF8 文件的签名问题
2009/10/30 PHP
Symfony核心类概述
2016/03/17 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
2019/12/04 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
jQuery插件开发全解析
2012/10/10 Javascript
(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享
2013/01/24 Javascript
JavaScript实现的MD5算法完整实例
2016/02/02 Javascript
KnockoutJs快速入门教程
2016/05/16 Javascript
AngularJS中实现动画效果的方法
2016/07/28 Javascript
js中toString()和String()区别详解
2017/03/23 Javascript
修改 bootstrap table 默认detailRow样式的实例代码
2017/07/21 Javascript
React diff算法的实现示例
2018/04/20 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
详解ES7 Decorator 入门解析
2019/02/18 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
2019/06/25 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
vue 解决setTimeOut和setInterval函数无效报错的问题
2020/07/30 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
2020/09/11 Javascript
js实现筛选功能
2020/11/24 Javascript
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
2015/05/15 Python
python使用tensorflow保存、加载和使用模型的方法
2018/01/31 Python
python实现微信自动回复功能
2018/04/11 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
python f-string式格式化听语音流程讲解
2019/06/18 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
如何通过Python实现标签云算法
2019/07/02 Python
Python编写一个验证码图片数据标注GUI程序附源码
2019/12/09 Python
英国定做窗帘和纺织品面料一站式商店:Dekoria
2018/08/29 全球购物
Weblogic的布署方式
2013/08/23 面试题
介绍一下SOA和SOA的基本特征
2016/02/24 面试题
宿舍保安职务说明书
2014/02/25 职场文书
节约用电倡议书
2015/04/28 职场文书
十大最强水系宝可梦,最美宝可梦排第三,榜首大家最熟悉
2022/03/18 日漫
解决redis批量删除key值的问题
2022/03/23 Redis