说说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 forEach()遍历函数使用及介绍
Jul 08 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
Nov 30 Javascript
Bootstrap字体图标无法正常显示的解决方法
Oct 08 Javascript
详解Javascript中的原型OOP
Oct 12 Javascript
Input文本框随着输入内容多少自动延伸的实现
Feb 15 Javascript
详解Vue监听数据变化原理
Mar 08 Javascript
react实现pure render时bind(this)隐患需注意!
Mar 09 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
Jun 22 Javascript
简单谈谈vue的过渡动画(推荐)
Oct 11 Javascript
使用classList来实现两个按钮样式的切换方法
Jan 24 Javascript
从零开始封装自己的自定义Vue组件
Oct 09 Javascript
JS学习笔记之闭包小案例分析
May 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
PHP网站安装程序制作的原理、步骤、注意事项和示例代码
2010/08/01 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
2013/06/18 PHP
PHPThumb图片处理实例
2014/05/03 PHP
php版淘宝网查询商品接口代码示例
2014/06/17 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
php实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
Laravel5中防止XSS跨站攻击的方法
2016/10/10 PHP
PHP进阶学习之类的自动加载机制原理分析
2019/06/18 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
用javascript实现画板的代码
2007/09/05 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
jQuery模拟原生态App上拉刷新下拉加载更多页面及原理
2015/08/10 Javascript
jquery实现红色竖向多级向右展开的导航菜单效果
2015/08/31 Javascript
Nodejs的express使用教程
2015/11/23 NodeJs
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
Bootstrap Table使用整理(一)
2017/06/09 Javascript
如何在基于vue-cli的项目自定义打包环境
2018/11/10 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
2020/07/27 Javascript
微信小程序实现日历小功能
2020/11/18 Javascript
[44:40]Serenity vs Pain 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python入门教程 python入门神图一张
2018/03/05 Python
教你使用python实现微信每天给女朋友说晚安
2018/03/23 Python
详解Matplotlib绘图之属性设置
2019/08/23 Python
python time()的实例用法
2020/11/03 Python
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
社区优秀志愿者材料
2014/02/02 职场文书
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
环保建议书
2014/03/12 职场文书
团支部建设方案
2014/05/02 职场文书
人力资源管理专业自荐书
2014/07/07 职场文书
药店促销活动总结
2014/07/10 职场文书
教师党的群众路线学习心得体会
2014/11/04 职场文书
企业工会工作总结2015
2015/05/13 职场文书
MySQL删除和插入数据很慢的问题解决
2021/06/03 MySQL
浅析Django接口版本控制
2021/06/26 Python