Vuex.Store 实例方法
commit(mutation)
- 根据type找到并调用_mutations中的所有type对应的mutation方法,所以当没有namespace的时候,commit方法会触发所有module中的mutation方法
- 执行完所有的mutation之后会执行_subscribers中的所有订阅者
1 | /* 调用mutation的commit方法 */ |
subscribers
Store给外部提供了一个subscribe方法,用以注册一个订阅函数,会push到Store实例的_subscribers中,同时返回一个从_subscribers中注销该订阅者的方法。
在commit结束以后则会调用这些_subscribers中的订阅者,这个订阅者模式提供给外部一个监视state变化的可能。state通过mutation改变时,可以有效捕获这些变化。
1 | // 订阅 store 的 mutation |
unifyObjectStyle
unifyObjectStyle
函数将参数统一,返回 { type, payload, options }
。
1 | // 统一成对象风格 |
commit
支持多种方式。比如:
1 | store.commit('increment', { |
dispatch(action)
1 | /* 调用action的dispatch方法 */ |
registerAction
将push进_actions的action进行一层封装(wrappedActionHandler),
然后判断封装好的res是否是一个Promise,不是则转化为Promise对象
dispatch时则从_actions中取出,只有一个的时候直接返回,否则用Promise.all处理
1 | /** |
registerModule
我们可以在页面动态注册模块,像如下:
1 | this.$store.registerModule("c", { |
以下是实现过程:
1 | /** |
重点还是installModule与resetStoreVM
unregisterModule
动态注销模块
1 | this.$store.unregisterModule("c"); |
实现方法是先从state中删除对应模块,然后用resetStore来重制store
1 | /** |
resetStore
将store中的_actions等进行初始化以后,重新执行installModule与resetStoreVM来初始化module以及用Vue特性使其“响应式化”,这跟构造函数中的是一致的
1 | /* 重制store */ |
watch
vuex提供了一个watch实例方法,使用:this.$store.watch()
1 | /** |
关键是_watcherVM,它一个Vue的实例,所以watch就可以直接采用了Vue内部的watch特性提供了一种观察数据getter变动的方法
hotUpdate
热替换新的 action
和 mutation
1 | // 热加载 |