VUEX-action可以修改state吗

网络编程 2021-07-04 15:02www.168986.cn编程入门
这篇文章主要介绍了VUEX-action可以修改state吗,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们狼蚁网站SEO优化随着长沙网络推广来一起学习学习吧

回顾下vuex,官网图如下

  • Vuex 的 store 中的状态的唯一方法是提交 mutation(mutation类似于事件且必须是同步函数)
  • action 提交的是 mutation,而不是直接变更状态且可以包含任意异步操作(Action通过 store.dispatch 方法触发)

一幅图看清只能通过mutation修改state的原因


mit函数源码如下

 mit (_type, _payload, _options) {
  // check object-style mit
  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 mitIterator (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 mitting = this._mitting
 this._mitting = true
 fn()
 this._mitting = mitting
}

其中_withCommit函数的参数fn是修改state的函数,在执行fn函数前,将this._mitting置为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._mitting
  assert(store._mitting, `do not mutate vuex store state outside mutation handlers.`)
 }
 }, { deep: true, sync: true })
}

当store._mitting(this._mitting)不为true,就会报出异常。
所以,当不是触发mutation来修改state, 就不会执行mit函数,也不会执行_withmit函数,this._mitting = true不会执行,当执行 enableStrictMode 时,会执行 assert 函数,这时store._mitting为false,就会报出异常。

回归标题action可以修改state吗

不开启严格模式的情况下可以,不提倡。

,经测试得知可以修改并修改成功,严格模式下控制台会抛异常且action是异步的,不方便DevTool 调试


我们开发要严格按照官方文档开发,避免不必要的错误产生。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持狼蚁SEO。

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by