【问题标题】:Vuex accessing namespaced module getters in vue routerVuex 访问 Vue 路由器中的命名空间模块获取器
【发布时间】:2017-10-24 10:37:00
【问题描述】:

我试图通过检查用户是否经过身份验证来保护我的路由,这是示例路由:

{
  path: '/intranet',
  component: search,
  meta: { requiresAuth: true },
  props: {
    tax: 'type',
    term: 'intranet-post',
    name: 'Intranet'
  }
},

我是这样设置警卫的:

router.beforeEach((to, from, next) => {
  if (to.matched.some(record => record.meta.requiresAuth)) {

    let authenticated = this.$store.getters['auth/getAuthenticated'];

    if (!authenticated) {
      next({
        path: '/login',
        query: { redirect: to.fullPath }
      })
    } else {
      next()
    }
  } else {
    next()
  }
})

这是用于 auth 的 vuex 模块:

import Vue from "vue";

export default {
  namespaced: true,
  state: {
    authenticated: !!localStorage.getItem("token"),
    token: localStorage.getItem("token")
  },
  mutations: {
    login: function(state, token){
        state.authenticated = true;
        state.token = token;
    },
    logout: function(state){
        state.authenticated = false;
        state.token = '';
    }
  },
  actions: {
    login: function({commit}, token){
      localStorage.setItem('token', token);
      commit('login', token);
    },
    logout: function({commit}){
      localStorage.removeItem("token");
      commit('logout');
    }
  },
  getters: {
    getToken: (state) => state.token,
    getAuthenticated: (state) => state.authenticated,
  }
}

但是,当我尝试访问 auth getter 时,就像它在路由保护中显示的那样,我收到一个错误:

无法读取未定义的属性“getters”

我做错了什么,我该如何解决这个问题?

【问题讨论】:

  • 你能把你使用router.beforeEach的文件中的完整代码贴出来吗?

标签: vuejs2 vue-router vuex


【解决方案1】:

错误消息指出this.$store 在尝试访问this.$store.getters 时未定义,因此问题似乎是存储未初始化或未按照您期望的方式在路由器中设置。使用 .getters['name/getter'] 访问命名空间的 getter 本身就是正确的。

按照一些教程,我有 store.js 定义了我的商店,然后我将它导入到我的 router.js 中,如下所示:

import store from './store'

然后直接用store而不是this.$store访问它:

let authenticated = store.getters['auth/getAuthenticated'];

我认为问题在于 this.$store 自动添加到 Vue-Components,但路由器并不是真正的组件,因此缺少 $store-member。导入商店可以解决这个问题。

【讨论】:

    猜你喜欢
    • 2020-09-29
    • 1970-01-01
    • 2019-12-15
    • 2017-12-21
    • 2021-04-26
    • 2019-03-22
    • 2021-08-10
    • 1970-01-01
    • 2021-05-19
    相关资源
    最近更新 更多