开发者问题收集

在 vuex 中设置 firebase.User 会导致无限循环

2019-03-18
590

更新:此错误仅在启用 vuex 严格模式时发生

我正在构建一个带有 firebase 身份验证的 Vue 应用程序,但应用程序失败并显示以下错误消息:

[Vue warn]: Error in callback for watcher "function () { return this._data.$$state }": "Error: [vuex] Do not mutate vuex store state outside mutation handlers."

Error: [vuex] Do not mutate vuex store state outside mutation handlers.

Uncaught RangeError: Maximum call stack size exceeded

当我将用户提交到 main.ts 文件中的 Vuex 存储时发生错误:

firebase.auth().onAuthStateChanged(user => {
  if (user) {
    store.commit(constants.auth.SET_USER, user) // THIS LINE
    store.commit(constants.auth.SET_AUTHENTICATED, true)
    router.push('/')
  } else {
    store.commit(constants.auth.SET_USER, null)
    store.commit(constants.auth.SET_AUTHENTICATED, false)
    router.push('/signup')
  }
  if (!app) {
    app = new Vue({
      router,
      store,
      render: (h) => h(App),
    }).$mount('#app')
  }
})

这是我的突变:

[constants.auth.SET_USER](state: AuthState, payload: firebase.User): void {
      state.user = payload
}

我可以从 Vue devtools 中看出,突变确实发生了,并且用户已提交到存储,但我不知道为什么会发生此错误。你能帮帮我吗?

我尝试注释掉应用程序中的几乎所有其他内容,而这些是唯一导致麻烦的部分。

2个回答

user.toJSON() 存储在您的状态中。firebase 用户是一个复杂的对象,不应存储在 vuex 状态中。

user2522402
2019-08-06

我认为您可能需要将 firebase.auth().onAuthStateChanged 包装在 new Promise 中。

看这个例子: https://forum.vuejs.org/t/vue-routes-firebase-auth-sync-problem/4470#post2

Milos Vujinic
2019-08-26