说说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高级程序设计 阅读笔记(二十) js错误处理
Aug 14 Javascript
javascript将数字转换整数金额大写的方法
Jan 27 Javascript
如何实现JavaScript动态加载CSS和JS文件
Dec 28 Javascript
简单的jQuery banner图片轮播实例代码
Mar 04 Javascript
js智能获取浏览器版本UA信息的方法
Aug 08 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
Aug 17 Javascript
关于vue.extend和vue.component的区别浅析
Aug 16 Javascript
解决angular2 获取到的数据无法实时更新的问题
Aug 31 Javascript
解决angularjs WdatePicker ng-model的问题
Sep 13 Javascript
vue本地打开build后生成的dist文件夹index.html问题
Sep 04 Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
Apr 26 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
Jul 21 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/08 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
jquery实现html页面 div 假分页有原理有代码
2014/09/06 Javascript
JS给超链接加确认对话框的方法
2015/02/24 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
jQuery实现的网页换肤效果示例
2016/09/20 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
Vue.js中兄弟组件之间互相传值实例
2017/06/01 Javascript
JSON对象转化为字符串详解
2017/08/11 Javascript
JavaScript运行原理分析
2018/02/09 Javascript
Node.js 实现远程桌面监控的方法步骤
2019/07/02 Javascript
layui form.render('select', 'test2') 更新渲染的方法
2019/09/27 Javascript
JS函数本身的作用域实例分析
2020/03/16 Javascript
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
python实现无证书加密解密实例
2014/10/27 Python
python安装numpy&amp;安装matplotlib&amp; scipy的教程
2017/11/02 Python
利用Django内置的认证视图实现用户密码重置功能详解
2017/11/24 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
python使用HTMLTestRunner导出饼图分析报告的方法
2019/12/30 Python
python机器学习库xgboost的使用
2020/01/20 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
MVMT手表官方网站:时尚又实惠的高品质手表
2016/12/04 全球购物
Ellos瑞典官网:北欧地区时尚、美容和住宅领域领先的电子商务网站
2019/11/21 全球购物
工程项目经理岗位职责
2013/12/15 职场文书
思想政治教育专业个人求职信范文
2013/12/20 职场文书
旷课检讨书2000字
2014/01/14 职场文书
春季运动会广播稿大全
2014/02/19 职场文书
水电施工员岗位职责
2015/04/11 职场文书
难以忽视的真相观后感
2015/06/05 职场文书
篮球赛新闻稿
2015/07/17 职场文书
大学生奶茶店创业计划书
2019/06/25 职场文书
django 认证类配置实现
2021/11/11 Python