说说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代码
May 09 Javascript
javascript jq 弹出层实例
Aug 25 Javascript
异步动态加载js与css文件的js代码
Sep 15 Javascript
jquery让指定的元素闪烁显示的方法
Mar 17 Javascript
Bootstrap3制作自己的导航栏
May 12 Javascript
javascript删除html标签函数cIsHTML
Jan 09 Javascript
codeMirror插件使用讲解
Jan 16 Javascript
AngularJS实现动态添加Option的方法
May 17 Javascript
Angular中的$watch、$watchGroup、$watchCollection
Jun 25 Javascript
Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码
Nov 15 Javascript
vue路由中前进后退的一些事儿
May 18 Javascript
jQuery实现移动端图片上传预览组件的方法分析
May 01 jQuery
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执行速度全攻略(上)
2006/10/09 PHP
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
2014/06/12 PHP
PHP页面跳转实现延时跳转的方法
2016/12/10 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
事件模型在各浏览器中存在差异
2010/10/20 Javascript
深入理解JavaScript系列(2) 揭秘命名函数表达式
2012/01/15 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
2014/06/03 Javascript
js使用DOM操作实现简单留言板的方法
2015/04/10 Javascript
JavaScript取得键盘按下方向键是哪个的方法
2015/08/04 Javascript
jQuery实现返回顶部功能
2016/02/23 Javascript
基于JavaScript实现焦点图轮播效果
2017/03/27 Javascript
Three.js如何实现雾化效果示例代码
2017/09/27 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
2019/07/15 Javascript
微信小程序引入VANT组件的方法步骤
2019/09/19 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
Nuxt.js的路由跳转操作(页面跳转nuxt-link)
2020/11/06 Javascript
python创建列表并给列表赋初始值的方法
2015/07/28 Python
在centos7中分布式部署pyspider
2017/05/03 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
Django用户认证系统 User对象解析
2019/08/02 Python
Python在OpenCV里实现极坐标变换功能
2019/09/02 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
CSS3中currentColor关键字的妙用
2016/02/27 HTML / CSS
CSS3模拟动画下拉菜单效果
2017/04/12 HTML / CSS
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
de Bijenkorf比利时官网:荷兰最知名的百货商店
2017/06/29 全球购物
英国独特礼物想法和个性化礼物网站:notonthehighstreet.com
2018/04/16 全球购物
男方父母证婚词
2014/01/12 职场文书
先进集体事迹材料
2014/02/17 职场文书
社会稳定风险评估方案
2014/06/02 职场文书
《金色的草地》教学反思
2016/02/17 职场文书
话题作文之财富(600字)
2019/12/03 职场文书
python 模块重载的五种方法
2021/04/24 Python
关于JavaScript回调函数的深入理解
2021/06/27 Javascript