说说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 相关文章推荐
来自chinaz的ajax获取评论代码
May 03 Javascript
JavaScript的eval JSON object问题
Nov 15 Javascript
javascript 混合的构造函数和原型方式,动态原型方式
Dec 07 Javascript
javascript:;与javascript:void(0)使用介绍
Jun 05 Javascript
node.js中的fs.write方法使用说明
Dec 15 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
May 16 Javascript
AngularJS实现动态编译添加到dom中的方法
Nov 04 Javascript
微信小程序 数组中的push与concat的区别
Jan 05 Javascript
利用js定义一个导航条菜单
Mar 14 Javascript
微信小程序仿美团城市选择
Jun 06 Javascript
VUE中使用HTTP库Axios方法详解
Feb 05 Javascript
微信小程序实现选项卡滑动切换
Oct 22 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
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
PHP中define() 与 const定义常量的区别详解
2019/06/25 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
详解网站中图片日常使用以及优化手法
2017/01/09 Javascript
详解用vue.js和laravel实现微信支付
2017/06/23 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
p5.js入门教程之鼠标交互的示例
2018/03/16 Javascript
JS简单获取并修改input文本框内容的方法示例
2018/04/08 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
Vue表单之v-model绑定下拉列表功能
2019/05/14 Javascript
vue 虚拟DOM的原理
2020/10/03 Javascript
[02:28]DOTA2 2015国际邀请赛中国区预选赛首日现场百态
2015/05/26 DOTA
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
Python求解平方根的方法
2015/03/11 Python
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
Python多进程写入同一文件的方法
2019/01/14 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
keras做CNN的训练误差loss的下降操作
2020/06/22 Python
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
使用phonegap创建联系人的实现方法
2017/03/30 HTML / CSS
Theflamel意大利:女士奢华服装、鞋子和配件
2020/01/11 全球购物
this关键字的作用
2016/01/30 面试题
缴纳养老保险的证明
2014/01/10 职场文书
建筑个人求职信范文
2014/01/25 职场文书
信息专业毕业生五年职业规划参考
2014/02/06 职场文书
婚礼主持词开场白
2014/03/13 职场文书
企业文明单位申报材料
2014/05/16 职场文书
学习十八大演讲稿
2014/09/15 职场文书
工作失职检讨书500字
2014/10/17 职场文书
计划生育工作汇报
2014/10/28 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
无工作证明怎么写
2015/06/15 职场文书
《植树问题》教学反思
2016/03/03 职场文书
vue如何清除浏览器历史栈
2022/05/25 Vue.js