vue-router beforeEach 遭遇奇怪的重叠和错误导向
问题描述
用户未登录状态,访问http://localhost:23001/任何URI
时,会被导向去http://localhost:23001/任何URI#/login
,此时在beforeEach
里打印to.name
为home
。然后
比如:
http://localhost:23001/register
会变成http://localhost:23001/register#/login
http://localhost:23001/reset-password
会变成http://localhost:23001/reset-password#/login
问题出现的环境背景及自己尝试过哪些方法
利用vue-router的beforeEach这个全局钩子,设置导航保护,将未登录用户导向去登录页。
- 用户登录时,访问主页
http://localhost:23001/
,会被导向去http://localhost:23001/#/
- 用户未登录时,访问主页
http://localhost:23001/
,会被导向去http://localhost:23001/#/login
相关代码
const no_auth_required_pages = ['login', 'register', 'reset-password'];
const routes_config = [
{
path: '/',
name: 'home',
component: Home,
meta:{
requiresAuth: true
}
},
{
path: '/login',
name: 'login',
component: Login
},
{
path: '/register',
name: 'register',
component: Register
},
{
path: '/reset-password',
name: 'reset-password',
component: ResetPassword
}
];
const router = new VueRouter({
routes: routes_config
});
router.beforeEach(function (to, from, next) {
if (to.meta.authRequired) {
if (localStorage.getItem('token')) {
next();
} else {
if (no_auth_required_pages.indexOf(to.name) === -1) {
next({path: '/login'});
} else {
next();
}
}
} else {
next();
}
});
你期待的结果是什么?实际看到的错误信息又是什么?
- 想知道URL里面那个#的作用
- 为什么转向的时候不会把hash前面的路径名称覆盖,而是在
#/
后面直接添加
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
URL里#的作用,涉及前端路由的原理。
在没有#并且没有使用H5historyApi改变浏览器地址的情况下,浏览器会向地址栏地址发送一个get请求获取页面。#后的串为URL的hash部分,这部分改变不会触发这个get请求,而在前端监听这部分变化跳转不同的页面,这就是前端路由原理。
可以使用history模式去除#,因为H5的historyApi同样可以避免get请求,但是呢前端不知道从哪个地方开始的地址归自己解析,所以history模式就要在前端配置一个baseUrl。比如
http:/a.com/x/y
,可能y开始才是前端解析的部分,所以baseUrl要设置为/x
。至于你说的第二个问题:
为什么转向的时候不会把hash前面的路径名称覆盖,而是在
#/
后面直接添加。其实答案已经在上面了,就是hash模式认为 #号后面的路径才归前端路由来管,#前面的前端路由并不能插手。不想要这个#,改变路由模式就可以了
如果没有设置路由模式为
history
,默认为是hash
模式,请求的地址上就是一个#
,而我们配置的路由也就是#
后面的这一块地址,监听到hash
变化时,就会去处理相应的请求,而显示页面内容。