【问题标题】:Vuex state reset function undefinedVuex状态重置功能未定义
【发布时间】:2021-06-08 05:55:55
【问题描述】:

获取Uncaught (in promise) ReferenceError: getDefaultState is not defined 尝试在模块存储上使用存储重置功能时。不幸的是,关于商店设置的 Nuxt 文档不是很详尽。谁能指出我缺少什么以使其在根级别可用?

我的商店重置基于:
Vuex issue 118
以上使用here with a state function

我的商店设置基于:
Latest implementation, that I actually used
连同这个very well structured answer CMarzin

使用的框架文档:
Vuex documentationNuxt store documentation

不相关:
This is about general store usage

我的设置:

└── store
  └── user
    └── state.js
    └── getters.js
    └── mutations.js
    └── actions.js
 └── state.js (root state)
 └── getters.js (root getters)
 └── mutations.js (root mutations)
 └── actions.js (root actions)

user/state.js:

const getDefaultState = () => {
  return {
    counter: 2,
    user: false,
  }
}

const state = getDefaultState()

export default {
  state,
}

user/mutations.js:

export default {
  ON_AUTH_STATE_CHANGED_MUTATION: (state, { authUser, claims }) => {
    if (authUser) {
      const { uid, email, emailVerified, displayName, photoURL } = authUser
      state.user = { uid, email, emailVerified, displayName, photoURL }
    } else {
      state.user = false
    }
  },

  RESET_USER_STATE(state) {
    // Merge rather than replace so we don't lose observers
    // https://github.com/vuejs/vuex/issues/1118
    // https://stackoverflow.com/questions/42295340/how-to-clear-state-in-vuex-store
    console.log(state)
    Object.assign(state, getDefaultState())
  },
}

user/actions.js:

export default {
  async onAuthStateChanged({ commit, dispatch }, { authUser }) {
    if (!authUser) {
      dispatch('resetUserState')
      return
    }
    if (authUser && authUser.getIdToken) {
      try {
        const idToken = await authUser.getIdToken(true)
        console.info('idToken', idToken)
      } catch (e) {
        console.error(e)
      }
    }
    commit('ON_AUTH_STATE_CHANGED_MUTATION', { authUser })
  },

  resetUserState({ commit }) {
    commit('RESET_USER_STATE')
  },
}

【问题讨论】:

    标签: vue.js nuxt.js state vuex


    【解决方案1】:

    在您的user/mutations.js 文件中,您使用getDefaultState()-函数,但您需要导入它以便突变知道它是什么。为了导入它,您还必须导出它。

    所以你的user/state.js 应该改成这样:

    export const getDefaultState = () => {
      ...
    }
    

    然后,如果您更改 user/mutations.js 文件:

    import { getDefaultState } from './state.js'
    
    export default {
      ...
    
      RESET_USER_STATE(state) {
        // Merge rather than replace so we don't lose observers
        // https://github.com/vuejs/vuex/issues/1118
        // https://stackoverflow.com/questions/42295340/how-to-clear-state-in-vuex-store
        console.log(state)
        Object.assign(state, getDefaultState())
      },
    }
    

    它现在应该可以工作了。

    【讨论】:

    • 谢谢 Nikolaj,我会试试的。我没有这样做的原因是因为我的印象是 Nuxt 会为我处理这个问题。我认为它会根据当前的文件夹结构组装存储并将文件夹中的所有文件组合到一个模块(又名 @987654327 @ + user/mutations.js + user/state.js + user/getters.js 变成 userModule 被添加到根存储区。这种想法不正确吗?如果是这样,它会减少我通过分离文件在清晰度方面获得的一些好处。
    • 说实话,我不确定 Nuxt 是如何处理这些特定文件的。我认为它们的处理方式与现代打包程序(如 webpack)中的常规 js 文件一样。在这样的模块系统中,每个文件都是一个模块,并且模块是隔离的,因此只有使用export 暴露的成员才能从模块外部获得。 :-) 我仍然相信您可以使用这种方法,并且我认为即使必须偶尔导入和导出它仍然很清楚。
    猜你喜欢
    • 2018-08-09
    • 2018-09-22
    • 2021-02-09
    • 2021-02-01
    • 2020-06-21
    • 2019-03-10
    • 2018-05-16
    • 2019-12-11
    • 2019-03-21
    相关资源
    最近更新 更多