原文连接个人blog,欢迎STAR。vue
今天分享的一篇文章是关于vuex的源码解析的,连接vuex源码解析,在如今所作的项目里的每一个组件,至少都有一个辅助函数,或者是....mapGetters
,或者是...mapActions
, 扩展运算符,以及解构也常常用到。这篇文章解决了困扰我许久的一个疑惑,为何有时候辅助函数里面传的是一个字符串数组,而有的时候传的是一个对象。大概之前看源码的时候,没怎么仔细想过把。git
其实很简单,vuex底层对传入辅助函数的参数都进行了一个转化处理,来看源码(以mapState为例):es6
export function mapState (states) { const res = {} normalizeMap(states).forEach(({ key, val }) => { res[key] = function mappedState () { return typeof val === 'function' ? val.call(this,this.$store.state,this.$store.getters) : this.$store.state[val] } }) return res }
mapState,对传入的参数首先调用normalizeMap方法,来看normalizeMap的源码:github
function normalizeMap (map) { return Array.isArray(map) ? map.map(key => ({ key, val: key })) : Object.keys(map).map(key => ({ key, val: map[key] })) }
对传入的参数先判断是否是数组,若是是数组调用数组的map方法,转化为{key, val: key} 对象的形式,若是不是数组, (那就是对象),便利对象的key 转化为{key, val: map[key]}对象的形式。
最后返回。vuex
今天还学到了一点,在项目里一般须要取到表单的值, 我通常是这么作的:数组
const { userName, password, checked } = this.form
发现原来能够给变量一个初始值app
const { userName, password, checked = [] } = this.form
在学习es6 时,只知道可以给函数的参数给默认值,相似于下面:函数
function name (a, b = [], c = {}) { // 其余代码 }
完。学习