vue——导航守卫

导航就是我们说的路由,当路由发生变化的时候,我们想要做的事情,这就是导航守卫的重点。

例如,动态配置站点信息:

router.beforeEach((to, from, next) => {
	// 设置 title
    document.title = to.meta.title

	// 设置 link
    let link = document.createElement('link');
    link.type = 'image/x-icon';
    link.rel = 'shortcut icon';
    link.href = icon;
    document.getElementsByTagName('head')[0].appendChild(link);
    
    next()
})

router.afterEach(() => {
    setTimeout(() => {
        window.document.body.scrollIntoView();
    }, 500);
});

路由改变的函数我们写到项目的哪个位置,代码写哪个地方,这个就是官网上说的(全局守卫,路由独享的守卫,组件内的守卫),下面一一介绍:

(一)全局守卫:

用来监测所有的路由,代码写在路由页面(router.js)

vue——导航守卫_第1张图片
方法有:

router.beforeEach((to, from, next) => {
  // ...
})
router.afterEach((to, from) => {
  // ...
})

to,from,next三个参数都是必要的
to:即将要进入的目标 路由对象
from:当前导航正要离开的路由
next:一定要调用该方法来 resolve 这个钩子,如果不写next()或者next(false),页面路由不会跳转,也就是页面被阻止在当前页面了
to,from是一个对象,就是 routes[] 数组里面配置的某个具体的路由对象,
比如:to.path, to,name, to.metafrom.path, from.name, from.meta 【path,name,meta】这些字段都是自己在路由里面定义的字段,这样就可以开始写逻辑了。

对于 next 也可以进行重定向到其他页面

next({ path:'/login' })
next('/login')
// 设置replace:true,导航不会留下历史记录
next({ ...to, replace: true })

(二)路由独享守卫:

就是将路由钩子函数写在我们的某个具体路由对象里面:
vue——导航守卫_第2张图片
这些守卫与全局前置守卫的方法参数是一样的,里面可以开始写逻辑。

(三)组件内的守卫:

我们写的vue页面,

常用方法:

beforeRouteEnter
beforeRouteUpdate (2.2 新增)
beforeRouteLeave

vue——导航守卫_第3张图片
这些守卫与全局前置守卫的方法参数是一样的,里面可以开始写逻辑,注意点:beforeRouteEnter 守卫 不能 访问 this,因为守卫在导航确认前被调用,因此即将登场的新组件还没被创建。不过,你可以通过传一个回调给 next 来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数。
vue——导航守卫_第4张图片
官网整个路由守卫被触发流程的步骤:

  1. 导航被触发。
  2. 在失活的组件里调用离开守卫。
  3. 调用全局的 beforeEach 守卫。
  4. 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
  5. 在路由配置里调用 beforeEnter。
  6. 解析异步路由组件。
  7. 在被激活的组件里调用 beforeRouteEnter。
  8. 调用全局的 beforeResolve 守卫 (2.5+)。
  9. 导航被确认。
  10. 调用全局的 afterEach 钩子。
  11. 触发 DOM 更新。
  12. 用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。

你可能感兴趣的:(vue)