Javascript Vuex getter authenticated在route guard中返回false。我假设它的计算结果为false,因为在调用autoLogin时';还没有执行
因此,我有一个呈现登录视图的Javascript Vuex getter authenticated在route guard中返回false。我假设它的计算结果为false,因为在调用autoLogin时';还没有执行,javascript,vue.js,vuejs2,vuex,Javascript,Vue.js,Vuejs2,Vuex,因此,我有一个呈现登录视图的/login路由,我正在尝试使它成为这样,如果用户已经登录,他将被重定向到另一个路由。问题是,当我键入urlwww.example.com/login,authenticated由于某种原因计算为false。我的代码就是这样工作的: 登录Url: { path: '/login', name: 'login', component: Login, beforeEnter: (to, from, next) => {
/login
路由,我正在尝试使它成为这样,如果用户已经登录,他将被重定向到另一个路由。问题是,当我键入urlwww.example.com/login
,authenticated
由于某种原因计算为false。我的代码就是这样工作的:
登录Url:
{
path: '/login',
name: 'login',
component: Login,
beforeEnter: (to, from, next) => {
if (store.getters.authenticated) {
next({ name: "adminOrders" })
} else {
next()
}
}
},
Vuex身份验证存储:
import router from '../router'
import axios from 'axios'
const authentication = {
state: {
user: null
},
mutations: {
setUser(state, user){
state.user = user
localStorage.setItem('userId', user.id);
localStorage.setItem('username', user.username);
localStorage.setItem('token', user.token);
}
},
actions: {
autoLogin({commit, dispatch}){
const userId = localStorage.getItem('userId')
const username = localStorage.getItem('username')
const token = localStorage.getItem('token')
if (!token) {
return
}
let user = {
id: userId,
username: username,
token: token
}
commit('setUser', user)
axios.interceptors.request.use(function (config) {
config.headers.Authorization = 'Bearer ' + token
return config
});
},
},
getters: {
authenticated: state => {
return state.user ? true : false
}
}
}
export default authentication
我将自动登录称为App.vue,安装方式如下:
<template>
<div id="app">
<router-view/>
</div>
</template>
<script>
export default {
mounted(){
this.$store.dispatch('autoLogin');
}
}
</script>
导出默认值{
安装的(){
这是。$store.dispatch('autoLogin');
}
}
在安装App
之前调用beforenter
,因为一旦创建App
,路由器就会被实例化
由于您从应用程序的mounted()
调用autoLogin
操作,它实际上是在路由器从存储读取getter之后运行的
但是,您可以在进入
之前从调用异步
操作,该操作将返回本地存储中是否存在令牌
至少,以下是可行的方法:
// routes:
beforeEnter: async (to, from, next) => {
const hasToken = await store.dispatch('hasToken');
next(hasToken ? { name: 'adminOrders' } : undefined);
}
// store:
actions: {
hasToken() {
return !!localStorage.getItem('token')
}
// ...
}
当您在axios拦截器中获得a时,请确保将令牌
从本地存储
中清除(基本上是指“令牌已过期”)。如果在尝试转到/login
(这通常发生在401
上)之前未清除本地存储中的令牌
,输入前的将重定向到adminOrders
,adminOrders
将尝试加载数据,数据调用将返回401
,因为token
已过期,您将进入循环。
或者,您也可以在401
上获取一个新的令牌
,然后更新localStorage