🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[success] # Vuex--Module ~~~ 1.Module可以让单一状态树拆分成多个模块,每个模块可以拥有state、mutation、action、getter,甚至嵌套子模块。 2.在使用模块里的数据时,可以通过$store.模块名.state状态属性名的方式访问 3.在使用模块里的方法时,可以通过`$store.commit('mutation方法名')`的方式提交mutation 4.当想要有更强的封装性时,可以开启命名空间,在导出的模块对象里增加一个namespaced属性为true, 然后就可以在Vue中使用`mapState('模块名', ['state状态属性名'])`的方式获取到属性名称,使用`mapMutations ('模块名', ['mutation方法名'])`的方式获取到方法名。namespaced: true 开启模块名 ~~~ >[success] # 严格模式 ~~~ 1.Vuex中的状态的更新要通过提交mutation来修改,但其实在组件中还可以通过$store.state.msg进行修改 从语法从面来说这是没有问题的,但是这破坏了Vuex的约定,如果在组件中直接修改state,devtools无法跟踪 到这次状态的修改。 2.开启严格模式之后,如果在组件中直接修改state会抛出错误,但数据仍被成功修改。 3.如何开启:在store中增加一个属性strict为true," strict: process.env.NODE_ENV !== 'production' " 在生产模式 不建议开启严格模式,严格模式请在开发环境使用原因'严格模式会深度检查状态树,检查不合规的状态改变,会影响性能' ~~~ >[success] ##### 一个简单的vuex模型 ~~~ let _Vue = null class Store { constructor (options) { const { state = {}, getters = {}, mutations = {}, actions = {} } = options this.state = _Vue.observable(state) this.getters = Object.create(null) Object.keys(getters).forEach(key => { Object.defineProperty(this.getters, key, { get: () => getters[key](state) }) }) this._mutaions = mutations this._actions = actions } commit (type, payload) { this._mutaions[type](this.state, payload) } dispatch (type, payload) { this._actions[type](this, payload) } } function install (Vue) { _Vue = Vue _Vue.mixin({ beforeCreate () { if (this.$options.store) { _Vue.prototype.$store = this.$options.store } } }) } export default { Store, install } ~~~