您好,登录后才能下订单哦!
这篇文章给大家分享的是有关VUEX-action能否修改state的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
首先回顾下vuex,官网图如下
Vuex 的 store 中的状态的唯一方法是提交 mutation(mutation类似于事件且必须是同步函数)
action 提交的是 mutation,而不是直接变更状态且可以包含任意异步操作(Action通过 store.dispatch 方法触发)
一幅图看清只能通过mutation修改state的原因
commit函数源码如下
commit (_type, _payload, _options) { // check object-style commit const { type, payload, options } = unifyObjectStyle(_type, _payload, _options) const mutation = { type, payload } const entry = this._mutations[type] if (!entry) { if (process.env.NODE_ENV !== 'production') { console.error(`[vuex] unknown mutation type: ${type}`) } return } // 用来修改state this._withCommit(() => { entry.forEach(function commitIterator (handler) { handler(payload) }) }) this._subscribers.forEach(sub => sub(mutation, this.state)) if ( process.env.NODE_ENV !== 'production' && options && options.silent ) { console.warn( `[vuex] mutation type: ${type}. Silent option has been removed. ` + 'Use the filter functionality in the vue-devtools' ) } }
this._withCommit来修改state,其源代码如下
_withCommit (fn) { const committing = this._committing this._committing = true fn() this._committing = committing }
其中_withCommit函数的参数fn是修改state的函数,在执行fn函数前,将this._committing置为true,理由是在源代码的251行resetStoreVM函数中判断严格模式的代码,如下:
if (store.strict) { enableStrictMode(store) }
当 vuex设置为严格模式, 执行enableStrictMode函数, 源码如下:
function enableStrictMode (store) { // $watch 函数来观察 state的变化 store._vm.$watch(function () { return this._data.$$state }, () => { // tate变化时,调用 assert函数 if (process.env.NODE_ENV !== 'production') { // 判断 store._committing assert(store._committing, `do not mutate vuex store state outside mutation handlers.`) } }, { deep: true, sync: true }) }
当store._committing(this._committing)不为true,就会报出异常。
所以,当不是触发mutation来修改state, 就不会执行commit函数,也不会执行_withcommit函数,this._committing = true不会执行,当执行 enableStrictMode 时,会执行 assert 函数,这时store._committing为false,就会报出异常。
回归标题action可以修改state吗
不开启严格模式的情况下可以,但是不提倡。
综上所述,经测试得知可以修改并修改成功,但是严格模式下控制台会抛异常且action是异步的,不方便DevTool 调试
感谢各位的阅读!关于“VUEX-action能否修改state”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。