Vuex之理解Mutations的用法实例
1.什么是mutations?
上一篇文章说的getters是为了初步获取和简单处理state里面的数据(这里的简单处理不能改变state里面的数据),Vue的视图是由数据驱动的,也就是说state里面的数据是动态变化的,那么怎么改变呢,切记在Vuex中store数据改变的唯一方法就是mutation!
通俗的理解mutations,里面装着一些改变数据方法的集合,这是Veux设计很重要的一点,就是把处理数据逻辑方法全部放在mutations里面,使得数据和视图分离。
2.怎么用mutations?
mutation结构:每一个mutation都有一个字符串类型的事件类型(type)和回调函数(handler),也可以理解为{type:handler()},这和订阅发布有点类似。先注册事件,当触发响应类型的时候调用handker(),调用type的时候需要用到store.commit方法。
conststore=newVuex.Store({
state:{
count:1
},
mutations:{
increment(state){//注册时间,type:increment,handler第一个参数是state;
//变更状态
state.count++}}})
store.commit('increment')//调用type,触发handler(state)
载荷(payload):简单的理解就是往handler(stage)中传参handler(stage,pryload);一般是个对象。
mutations:{
increment(state,n){
state.count+=n}}
store.commit('increment',10)
mutation-types:将常量放在单独的文件中,方便协作开发。
//mutation-types.js
exportconstSOME_MUTATION='SOME_MUTATION'
//store.js
importVuexfrom'vuex'
import{SOME_MUTATION}from'./mutation-types'
conststore=newVuex.Store({
state:{...},
mutations:{
//我们可以使用ES2015风格的计算属性命名功能来使用一个常量作为函数名
[SOME_MUTATION](state){
//mutatestate
}
}
})
commit:提交可以在组件中使用this.$store.commit('xxx')提交mutation,或者使用mapMutations辅助函数将组件中的methods映射为store.commit调用(需要在根节点注入store)。
import{mapMutations}from'vuex'
exportdefault{
methods:{
...mapMutations([
'increment'//映射this.increment()为
this.$store.commit('increment')]),
...mapMutations({
add:'increment'//映射this.add()为
this.$store.commit('increment')
})}}
3.源码分析
registerMutation:初始化mutation
functionregisterMutation(store,type,handler,path=[]){
//4个参数,store是Store实例,type为mutation的type,handler,path为当前模块路径
constentry=store._mutations[type]||(store._mutations[type]=
[])//通过type拿到对应的mutation对象数组
entry.push(functionwrappedMutationHandler(payload){
//将mutation包装成函数push到数组中,同时添加载荷payload参数
handler(getNestedState(store.state,path),payload)
//通过getNestedState()得到当前的state,同时添加载荷payload参数
})
}
commit:调用mutation
commit(type,payload,options){
//3个参数,type是mutation类型,payload载荷,options配置
if(isObject(type)&&type.type){
//当type为object类型,
options=payload
payload=type
type=type.type
}
constmutation={type,payload}
constentry=this._mutations[type]
//通过type查找对应的mutation
if(!entry){
//找不到报错
console.error(`[vuex]unknownmutationtype:${type}`)
return
}
this._withCommit(()=>{
entry.forEach(functioncommitIterator(handler){
//遍历type对应的mutation对象数组,执行handle(payload)方法
//也就是开始执行wrappedMutationHandler(handler)
handler(payload)
})
})
if(!options||!options.silent){
this._subscribers.forEach(sub=>sub(mutation,this.state))
//把mutation和根state作为参数传入
}
}
subscribers:订阅store的mutation
subscribe(fn){
constsubs=this._subscribers
if(subs.indexOf(fn)<0){
subs.push(fn)
}
return()=>{
consti=subs.indexOf(fn)
if(i>-1){
subs.splice(i,1)
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
