之前的两篇文章介绍了
Vuex
的内部过程以及实现原理,其暴露出来的方法基本上能满足日常的开发使用,但是如果都按着this.$store
的这种写法,会很复杂。而Vuex
也提供了很多简便操作的Api,下面的这几篇文章就分别分析一下每个Api的源码,并结合实例说明一下。
这篇先介绍第一个Api————mapState
,它主要是为了方便我们操作state
而应用的。在分析源码之前,先要看几个公共方法,了解它们对分析这几个Api很重要(之后的几个Api都会用到这几个方法,如果忘了可以回头来看看)。
normalizeNamespace
normalizeNamespace
函数其实是个高阶函数,它以函数fn
作为参数,然后返回一个函数,然后对返回的这个函数进行参数校验,如果第一个参数不是string
类型,则将其设置为第二个参数map
的值,本身成为空的字符串。如果是string
类型,则进行一下拼接处理之后再使用。
1 | function normalizeNamespace (fn) { |
normalizeMap
normalizeMap
方法对传入的参数进行校验,如果是数组,则遍历这个数组,并将其每个元素处理为对象的形式;如果为Object
,也会遍历,并组合成一个对象数组进行返回。
1 | function normalizeMap (map) { |
getModuleByNamespace
getModuleByNamespace
方法主要就是对命名空间进行一下校验,可以暂时不用太过考虑这个方法
1 | function getModuleByNamespace (store, helper, namespace) { |
上面这几个方法都是辅助函数,在Api中都会用到,不明白的时候可以翻上去看一下。
mapState
还记得上面的normalizeNamespace
方法吗,它的参数是一个函数,也就是下面定义的这个函数,而平时我们在使用mapState
的时候,传入的参数正是传入到normalizeNamespace
返回的方法中。如果不考虑命名空间的话,normalizeNamespace
返回的方法最终将处理完的参数传入到下面定义的这个函数中。
1 | /* |
根据上面的分析,在调用mapState
时,可以传入数组或者是对象,因为内部会做处理,最终根据不同类型来导出不同的结果。而最终还是应用this.$store
去获取对应的值。
mapState在Vue组件中的应用
还是使用上一篇定义的Vuex
1 | <template> |
经过上面源码的分析可知,这里传入的参数是个数组,所以经过normalizeMap
转换后得到的对象是[{key: 'num', val: 'num'}]
,遍历后进行判断,因为val
不是function
,所以直接调用this.$store.state.num
,最终返回的是一个对象{num: 1}
。上面的computed
中应用了...
结构,最终会把num
放入到computed
中。
在应用mapState
的时候,也可以传入对象,即mapState({num: 'num'})
,如果想给参数换个名字可以是mapState({ber: 'num'})
,这样调用this.ber
就可以获取到num
的值。
总结
mapState
方法主要为了方便我们在开发的时候进行操作,不用每次获取变量都要写this.$store.state
,它可以接收数组或者对象作为参数,但观察其内部,依然是通过this.$store.state
来操作,毕竟不能脱离定义的Store
。