You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Vue Router文件中访问Vuex store实现路由权限守卫

你遇到的报错是循环依赖导致的:main.js中引入了router模块,而router模块又反过来引入main.js导出的store,模块加载过程中main.js还没完成导出执行,所以router里拿到的store自然是undefined。

解决步骤

步骤1:把store逻辑从main.js中拆分到独立文件

在src目录下新建store/index.js文件,把main.js里除了创建应用、挂载相关的所有store代码全部挪进去:

// src/store/index.js
import { createStore } from 'vuex';
import createPersistedState from 'vuex-persistedstate';
import Cookies from 'js-cookie';
import API from '../API';

const store = createStore({
  state: {
    posts: null,
    loading: null,
    error: null,

    user: {},
    token: null,
    userLoading: null,
    userError: null,

    registerLoading: null,
    registerError: null,

    logOutErorr: null,
  },
  plugins: [
    createPersistedState({
      key: 'BLOG_MEVN',
      paths: ['user', 'token'],
      storage: {
        getItem: key => Cookies.get(key),
        setItem: (key, value) =>
          Cookies.set(key, value, { expires: 3, secure: true }),
        removeItem: key => Cookies.remove(key),
      },
    }),
  ],

  getters: {
    isLoggedIn: state => !!state.token,
  },

  mutations: {
    SET_POSTS_LIST(state, payload) {
      state.posts = payload;
    },
    SET_POSTS_STATUS_LOADING(state, payload) {
      state.loading = payload;
    },
    SET_POSTS_LIST_STATUS_FAIL(state, payload) {
      state.error = payload;
    },

    SET_USER(state, payload) {
      state.user = payload;
      state.token = payload.token;
    },
    SET_USER_LOADING(state, payload) {
      state.userLoading = payload;
    },
    SET_USER_STATUS_FAIL(state, payload) {
      state.userError = payload;
    },

    USER_LOGOUT(state, payload) {
      state.user = payload;
      state.token = null;
    },
    USER_LOGOUT_FAIL(state, payload) {
      state.logOutErorr = payload;
    },

    USER_REGISTER(state, payload) {
      state.user = payload;
      state.token = payload.token;
    },
    USER_REGISTER_FAIL(state, payload) {
      state.registerError = payload;
    },
    USER_REGISTER_LOADING(state, payload) {
      state.registerLoading = payload;
    },
  },
  actions: {
    async getPosts({ commit }) {
      commit('SET_POSTS_STATUS_LOADING', true);
      commit('SET_POSTS_LIST', []);
      try {
        const { data } = await API.get('/api/v1/posts');
        commit('SET_POSTS_LIST', data);
        commit('SET_POSTS_STATUS_LOADING', false);
      } catch (error) {
        commit('SET_POSTS_STATUS_LOADING', false);

        commit(
          'SET_POSTS_LIST_STATUS_FAIL',
          error.response && error.response.data.message
            ? error.response.data.message
            : error.message
        );
      }
    },

    async login({ commit }, User) {
      commit('SET_USER_LOADING', true);
      commit('SET_USER', []);
      try {
        const config = {
          headers: {
            'Content-Type': 'application/json',
          },
        };

        const { data } = await API.post(`/api/v1/users/login`, User, config);
        commit('SET_USER', data);
        commit('SET_USER_LOADING', false);
      } catch (error) {
        commit('SET_USER_LOADING', false);

        commit(
          'SET_USER_STATUS_FAIL',
          error.response && error.response.data.message
            ? error.response.data.message
            : error.message
        );
      }
    },

    async register({ commit }, User) {
      commit('USER_REGISTER_LOADING', true);
      commit('USER_REGISTER', []);
      try {
        const config = {
          headers: {
            'Content-Type': 'application/json',
          },
        };

        const { data } = await API.post(`/api/v1/users/signup`, User, config);
        commit('USER_REGISTER', data);
        commit('USER_REGISTER_LOADING', false);
      } catch (error) {
        commit('USER_REGISTER_LOADING', false);

        commit(
          'USER_REGISTER_FAIL',
          error.response && error.response.data.message
            ? error.response.data.message
            : error.message
        );
      }
    },

    async logout({ commit }) {
      try {
        await API.get(`/api/v1/users/logout`);
        commit('USER_LOGOUT', {});
      } catch (error) {
        commit(
          'USER_LOGOUT_FAIL',
          error.response && error.response.data.message
            ? error.response.data.message
            : error.message
        );
      }
    },
  },
});

export default store;

步骤2:修改main.js,只保留应用初始化逻辑

清理后的main.js代码如下:

import { createApp } from 'vue';
import router from './router';
import store from './store'; // 引入独立的store
import './bootstrap.min.css';
import App from './App.vue';

const app = createApp(App);
app.use(router);
app.use(store);
app.mount('#app');

步骤3:修改router文件的store引入路径

把原来的import store from '../main'改成引入独立的store:

// router文件头部修改引入路径
import store from '../store';

改完后你注释掉的beforeEach路由守卫就可以正常启用,直接调用store.getters.isLoggedIn就能拿到正确的登录状态。

内容的提问来源于stack exchange,提问作者valkkorn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 22:36:04