Tar*_*ych 6 vue.js vue-router axios 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)
它也没有帮助。
围绕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)
| 归档时间: |
|
| 查看次数: |
5255 次 |
| 最近记录: |