路由守卫

113 阅读1分钟

背景

如果我们有个需求,需要为SPA应用的每个页面增加title?

网页title来自于index.html中的 <title>而SPA中html只有一个,是不会变化的

image.png 那么我们只能在某个组件/页面加载的时候,手动设置document.title来手动改变网页标题

image.png 但是这样的话,每个页面都需要手动加,工作量大。

我们可以通过 路由守卫 钩子来解决这个问题

路由守卫使用

我们可以用Vue-Router实例的beforeEach来解决这个问题。

  • 路由配置中,通过meta对象定义title属性
  • 利用导航钩子beforeEach修改标题

1、路由配置 image.png 2、导航钩子使用以及参数解析

const router = new VueRouter({
    routes: [{},{}]
})
// beforeEach是Router实例上的方法
router.beforeEach((to, from, next)=> {
    // 由于嵌套路由meta={},而route 对象中的matches数组中包含了完整的父子/本身 路由内容。所以我们在这个取title的场景中,用matches取第0项,即父路由信息,若没有嵌套路由,第0项就是本身内容
    // ducument.title = to.meta.title
    ducument.title = to.matches[0].meta.title
    next()
})

参数解析:

  • to: 即将要进入的目标路由对象
  • from: 当前导航所在的,且即将要离开的路由对象
  • next: 内置的跳转进入下一步路由的方法,必须存在,才能正常使用路由

路由守卫补充

回调也叫钩子hooks,是指在特殊场景/时期需要执行的回调方法。

后置钩子

vue路由跳转有:跳转前的前置钩子,跳转后的后置钩子,分别对应beforeEach((to, from, next)=>{})afterEach((to, from) => {})

路由独享守卫

image.png

经测试,全局前置钩子执行-》路由独享前置钩子执行-》全局后置钩子执行