Vuex:如何在分派动作之前检查动作是否存在?

时间:2019-03-16 20:35:03

标签: vue.js vuex

我在分派动作时收到错误消息:“未知的本地动作类型...”,该动作恰巧在其他模块中。在某些情况下,我调度的动作不存在。因此,我需要应用一个条件,该条件将检查此操作是否存在,并且仅在满足条件时才调度该操作。我该怎么办?

3 个答案:

答案 0 :(得分:2)

我一直这样做。 @ Khasanov72在商店外部就可以使用它,但是如果要从另一个动作中分派一个动作,则可以做得更简单:

//From module action
if (this._actions['module/action']) {
  dispatch('module/action', data)
}

答案 1 :(得分:0)

我唯一能想到的是,只有在使用vuex registerModule的情况下,动作才存在。

在这种情况下,您可以添加一个Boolean属性,指示该模块是否已注册。因此,在您的组件中:

const myModule = () => import('module-path.js')

export default {
  data: () => ({
    isModuleRegistered: false
  }),
  created() {
    myModule.then(module => {
      this.isModuleRegistered = true
      this.$store.registerModule('myModule', module)
      this.$store.dispatch('myModule/someAction')
    })
  },
  beforeDestroy () {
    // If you want to unregister it when component gets destroyed
    this.isModuleRegistered && this.$store.unregisterModule('myModule')
  }
}

如果上面的代码片段不能回答您的问题或不符合您的需求:注册模块时,您必须设置一个布尔属性。然后检查该布尔值以查看该模块是否已注册。当模块取消注册时,还必须更改该布尔值。

注意,上面我已经懒加载了vuex模块。如果您要延迟加载,请阅读this awesome article了解更多信息

答案 2 :(得分:0)

我有同样的问题,这是我解决的方法:

const methodName = MODULE_NAME + "/" + ACTION_NAME
const actionExists = Object.keys(window.Store._actions).findIndex(key => key === methodName) !== -1

if (actionExists) {
  console.log(methodName + ' exists!')
} else {
  console.log(methodName + ' doesn\'t exists!')
}