什么是vuex
vuex是用于vue状态管理库, 将共享的数据抽离到全局, 以单例的方式存放, 形成单向数据流,同时利用vue响应式机制进行高效的管理和更新。
vuex流程
Vue Component进行 Dispatch 操作 ==> 触发Vuex Action(异步获取服务器数据, action无法直接改变state) ==> 通过Mutation改变state ==> 根据state的变化渲染Vue Component视图
vuex使用
1 2 3 4 5 6 7 8
| Vue.use(Vuex)
new Vue({ el: '#app', store })
|
vuex原理
Vuex是怎样把store注入到Vue实例中?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
export function install (_Vue) { if (Vue) { if (process.env.NODE_ENV !== 'production') { console.error( '[vuex] already installed. Vue.use(Vuex) should be called only once.' ) } return } Vue = _Vue
applyMixin(Vue) }
function applyMixin (Vue) { var version = Number(Vue.version.split('.')[0]);
if (version >= 2) { Vue.mixin({ beforeCreate: vuexInit }); } else { var _init = Vue.prototype._init; Vue.prototype._init = function (options) { if ( options === void 0 ) options = {}; options.init = options.init ? [vuexInit].concat(options.init) : vuexInit; _init.call(this, options); }; }
function vuexInit () { var options = this.$options; if (options.store) { this.$store = typeof options.store === 'function' ? options.store() : options.store; } else if (options.parent && options.parent.$store) { this.$store = options.parent.$store; } } } Vuex源码:https:
|
Store的实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| export default new Vuex.Store({ modules: { modulesA, modulesB, }, });
constructor (options = {}) { ... this._actions = Object.create(null) this._mutations = Object.create(null) this._wrappedGetters = Object.create(null) this._modules = new ModuleCollection(options) this._modulesNamespaceMap = Object.create(null) this._subscribers = [] this._watcherVM = new Vue()
...
installModule(this, state, [], this._modules.root)
resetStoreVM(this, state) plugins.forEach(plugin => plugin(this))
if (Vue.config.devtools) { devtoolPlugin(this) } }
|