vue-router 中如何保护路由?
Vue Router 提供路由守卫的功能,可以在路由守卫里做判断逻辑,校验用户的权限,实现路由访问的控制
路由的模式
- hash 模式
利用 location.hash 作为路径,监听 hashChange 事件 - history 模式
利用 history.pushState api实现, 监听 popState 事件 - abstract 模式
提供给SSR使用,v4 叫做 memory mode
路由守卫有 3 种:
- 全局路由守卫
- 路由独享守卫
- 组件内守卫
组件路由守卫中获取实例
beforeRouteEnter(to, from, next) { next(vm => { }) }
路由守卫执行的顺序
- 在失活组件里调用 beforeRouteLeave
- 全局的 beforeEach
- 重用的组件调用 beforeRouteUpdate
- 调用路由的 beforeEnter
- 处理异步加载逻辑
- 激活组件 beforeRouteEnter
- 全局 beforeResolve
- DOM更新
- 全局 afterEnter
next 方法如何实现
vue router 中的路由守卫是存储在队列中的,路由更新时,会迭代这个队列,执行每一个hook, next 作为回调函数,如果有hook 的 next 重定向或者传入false 的化,本次导航都会终止。
try { hook(route, current, (to: any) => { if (to === false) { // next(false) -> abort navigation, ensure current URL this.ensureURL(true); abort(createNavigationAbortedError(current, route)); } else if (isError(to)) { this.ensureURL(true); abort(to); } else if ( typeof to === "string" || (typeof to === "object" && (typeof to.path === "string" || typeof to.name === "string")) ) { // next('/') or next({ path: '/' }) -> redirect abort(createNavigationRedirectedError(current, route)); if (typeof to === "object" && to.replace) { this.replace(to); } else { this.push(to); } } else { // confirm transition and pass on the value next(to); } }); } catch (e) { abort(e); }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 防抖和节流
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
更多
发布评论