在解决Vue路由之前访问Vuex

Tar*_*ych 6 vue.js vue-router axios vuex

我有什么:

  1. 具有需要身份验证的路由和公共路由的路由器
  2. 带有用户身份验证状态的 vuex

我想要什么:加载应用程序之前(在解析路由器之前)向服务器发送请求以axios检查用户的身份验证状态。

router.js

import Vue from 'vue'
import Router from 'vue-router'
import store from './store'

Vue.use(Router)

const router = new Router({
  ...
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home
    },
    {
      path: '/account',
      name: 'account',
      component: () => import(/* webpackChunkName: "account" */ './views/Account.vue'),
      meta: {
        requiresAuth: true
      }
    }
  ]
})

router.beforeEach((to, from, next) => {
  if (to.matched.some(route => route.meta.requiresAuth)) {
    if (store.state.authStatus)
      next()
    else
      next({name: 'home'})
  } else {
    next()
  }
})

export default router
Run Code Online (Sandbox Code Playgroud)

store.js

import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    authStatus: false
  },
  mutations: {
    setAuthStatus(state, authStatus) {
      state.authStatus = authStatus
    }
  }
})

 axios.get(...)
   .then(response => {
     store.commit('setAuthStatus', true)
   })

export default store
Run Code Online (Sandbox Code Playgroud)

main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')
Run Code Online (Sandbox Code Playgroud)

我的问题:当我mydomain.com/acount在获得授权的情况下进入浏览器(之前未加载应用程序)时,无论如何我都重定向到home. 重定向后,我看到我已获得授权(我在 Home 组件中设置了一些仅对授权用户显示的 DOM 元素)。


我试过这个,没有帮助:

store.js

const store = new Vuex.Store({
  ...
  actions: {
    setAuthStatus({commit}) {
      axios.get(...)
        .then(response => {
          commit('setAuthStatus', true)
        })
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

main.js

store.dispatch('setAuthStatus').then(() => {
  new Vue({
    router,
    store,
    render: h => h(App)
  }).$mount('#app')
})
Run Code Online (Sandbox Code Playgroud)

编辑:在main.js我试图从

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')
Run Code Online (Sandbox Code Playgroud)

new Vue({
  store,
  router,
  render: h => h(App)
}).$mount('#app')
Run Code Online (Sandbox Code Playgroud)

它也没有帮助。

Tar*_*ych 4

围绕Vanojx1 的答案,我用下面的方式解决了我的问题。

store.js:

const store = new Vuex.Store({
  state: {
    authStatus: axios.get(...).then(response => {
      store.commit('setAuthStatus', true)
    }),
    userAuth: false
  },
  mutations: {
    setAuthStatus(state, authStatus) {
      state.userAuth = authStatus
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

router.js:

router.beforeEach((to, from, next) => {
  if (to.matched.some(route => route.meta.requiresAuth)) {
    store.state.authStatus.then(() => {
      //we're getting 200 status code response here, so user is authorized
      //be sure that API you're consuming return correct status code when user is authorized
      next()
    }).catch(() => {
      //we're getting anything but not 200 status code response here, so user is not authorized
      next({name: 'home'})
    })
  } else {
    next()
  }
})
Run Code Online (Sandbox Code Playgroud)