说说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弹窗代码 可以指定弹出间隔
Jul 03 Javascript
jsonp原理及使用
Oct 28 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
Apr 20 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
Oct 16 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
Dec 08 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
Dec 20 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
May 10 Javascript
javascript中Date对象应用之简易日历实现
Jul 12 Javascript
手机端实现Bootstrap简单图片轮播效果
Oct 13 Javascript
React-router v4 路由配置方法小结
Aug 08 Javascript
Vue.js 2.0和Cordova开发webApp环境搭建方法
Feb 26 Javascript
jQuery实现简单复制json对象和json对象集合操作示例
Jul 09 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调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
PHPTree――php快速生成无限级分类
2018/03/30 PHP
PHP中非常有用却鲜有人知的函数集锦
2019/08/17 PHP
Javascript call和apply区别及使用方法
2013/11/14 Javascript
jquery对ajax的支持介绍
2013/12/10 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
JS表格组件BootstrapTable行内编辑解决方案x-editable
2016/09/01 Javascript
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
react 组件传值的三种方法
2019/06/03 Javascript
微信小程序如何调用图片接口API并居中显示
2019/06/29 Javascript
vue filter 完美时间日期格式的代码
2019/08/14 Javascript
jQuery 动画与停止动画效果实例详解
2020/05/19 jQuery
Vue中key的作用示例代码详解
2020/06/10 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
python不带重复的全排列代码
2013/08/13 Python
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
利用python批量修改word文件名的方法示例
2017/10/17 Python
python输入错误密码用户锁定实现方法
2017/11/27 Python
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
python实现数据导出到excel的示例--普通格式
2018/05/03 Python
python多线程下信号处理程序示例
2019/05/31 Python
python实现随机漫步方法和原理
2019/06/10 Python
Python Selenium自动化获取页面信息的方法
2020/08/31 Python
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
美国瑜伽服装和装备购物网站:Mukha Yoga
2019/02/22 全球购物
日本最大美瞳直送网:Morecontact(中文)
2019/04/03 全球购物
漫威玩具服装及周边商品官方购物网站:Marvel Shop
2019/05/11 全球购物
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
2015/07/30 面试题
村官学习十八大感想
2014/01/15 职场文书
停车场管理协议书范本
2014/10/08 职场文书
稽核岗位职责
2015/02/10 职场文书
音乐会主持人开场白
2015/05/28 职场文书
爱国主义影片观后感
2015/06/18 职场文书
golang 实现两个结构体复制字段
2021/04/28 Golang
python 判断字符串当中是否包含字符(str.contain)
2022/06/01 Python