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

Jes*_*man 5 vue.js vuex

当我调度我的操作时,我收到此错误:“未知的本地操作类型...”,该操作恰好位于其他模块中。在某些情况下,我正在调度的操作不存在。因此,我需要应用一个条件来检查此操作是否存在,并仅在满足条件时调度该操作。我该怎么做呢 ?

小智 5

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

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!')
}
Run Code Online (Sandbox Code Playgroud)


rol*_*oli 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')
  }
}
Run Code Online (Sandbox Code Playgroud)

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

请注意,上面我已经延迟加载了 vuex 模块。如果你想延迟加载 vuex 模块,请阅读这篇很棒的文章以了解更多信息

  • 例如,当在命名空间系统中使用动态组件时,并且其中一个命名空间没有操作,我完全可以看到这种情况发生,并且您不想对哪些具有操作而哪些没有进行硬编码 (2认同)