基于vueRouter实现
#使用beforeEach(前置护卫)实现
router.beforEach((to,from,next)=>{
if(to.name.match(xxx) {
next(path)
} else {
next()
}
})
#使用afterEach(后置护卫)实现(无next参数,无法进行重定向)
router.afterEach((to,from)=>{
if(to.name.match(xxx)) ...
})
# 导航解析流程
1. 导航被触发。
2. 在失活的组件里调用 `beforeRouteLeave` 守卫。
3. 调用全局的 `beforeEach` 守卫。
4. 在重用的组件里调用 `beforeRouteUpdate` 守卫(2.2+)。
5. 在路由配置里调用 `beforeEnter`。
6. 解析异步路由组件。
7. 在被激活的组件里调用 `beforeRouteEnter`。
8. 调用全局的 `beforeResolve` 守卫(2.5+)。
9. 导航被确认。
10. 调用全局的 `afterEach` 钩子。
11. 触发 DOM 更新。
12. 调用 `beforeRouteEnter` 守卫中传给 `next` 的回调函数,创建好的组件实例会作为回调函数的参数传入。
基于axios实现
const http = axios.create({
bsaeURL,
timeout: xxx
})
baseUrl = process.env.VUE_APP_BASE_API;
http.interceptor.request.use(config=>{
const token = localStorage.getItem('token');
if (token) config.headers.Authorization = `Bearer${token}`
return config
},error=>{
return Promise.reject(error)
})
http.interceptor.response.use(config=>{
const { message, success } = response.data;
if(success) {
this.$Message.sucess(message)
} else {
this.$Message.error(message);
return Promise.reject(message)
}
},error=>{
if (error.response.status === 401 && error.response.data.code === 10002) {
localStorage.removeItem('token')
router.push('/login')
this.$Message.error('登录超时正在退出...')
} else {
this.$Message.error('服务器异常')
}
return Promise.reject(error)
})