八、Vue Router 进阶-导航守卫

导航守卫

所谓的导航守卫,就是路由的钩子函数。主要用来通过跳转取消导航。导航守卫分三种:全局、路由独享、组件级的

注意:参数或查询的改变并不会触发进入和离开的导航守卫。可以通过watch监听$route对象,或使用beforeRouteUpdate的组件内守卫。

全局前置守卫

进入路由之前的钩子函数,接受next函数,在此可以阻止进入路由或跳转到指定路由。

<script>
const router = new VueRouter({ ... });
// 接收三个参数:to为目标路由对象信息,from为当前路由对象信息,next则为是否继续
router.beforeEach((to, from, next) => {
    // ...
});
</script>

全局解析钩子

router.beforeResolve((to, from, next) => {
    // 区别是在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后 调用
});

全局后置钩子

允许进入路由触发,和守卫不同的是,不接受next函数也不会改变导航本身。

<script>
    router.afterEach((to, from) => {
        // 一般用于改变页面的title
    });
</script>       

路由独享的守卫

在路由配置上直接定义beforeEnter守卫,表示:进入路由之前

<script>
    const router = new VueRouter({
        routes: [
            {
                path: '/foo',
                component: Foo,
                beforeEnter: (to, from, next) => {
                    // 进入路由之前
                }
            }
        ]
    });
</script>

组件内的守卫

const Foo = {
    template: `...`,
    beforeRouteEnter (to, from, next) {
        // 1. 在渲染该组件的对应路由被 确定 前调用
        // 2. 不能 获取组件实例 this,因为执行该守卫时,组件实例还没被创建
        // 3. 是支持给 next 方法传递回调的唯一守卫,可以通过回调访问组件实例
        next(vm => {
            // 通过 vm 访问组件实例
        });
    },
    beforeRouteUpdate (to, from, next) {
        // 1. 在当前路由改变,但是该组件被复用时调用
        // 举例:对于一个带有动态参数的路径 /foo/:id, 在/foo/1 和/foo/2之间跳转的时候,由于会渲染同样的Foo组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
        // 2. 可以访问组件实例 this
        next();
    },
    beforeRouteLeave (to, from, next) {
        // 1. 导航离开该组件的对应路由时调用
        // 2. 可以访问组件实例 this
        // 通常用来禁止用户在还未保存修改前突然离开,该导航可以通过 next(false) 来取消
        const answer = window.confirm('确定离开?');
        if (answer) {
            next();
        }else{
            next(false); // 取消导航跳转
        }
    }
}

守卫和钩子的参数

  • to: 即将要进入的目标路由对象
  • from: 当前导航的路由对象
  • next: 通过该方法来守卫导航是否进入,还是中断,或进入指定导航
    • next() 进入管道中的下一个钩子,全部钩子执行完了,则导航的状态就是确定的
    • next(false) 表示中断当前的导航。如果浏览器的URL改变了,那么URL地址会重置到from路由对应的地址
    • next(‘/‘) 或 next({ path:‘/‘ }) 跳转到指定地址

注意: 在导航守卫中确保要调用next方法,否则不会继续执行

完整的导航解析流程

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

原文地址:https://www.cnblogs.com/yuxi2018/p/11967275.html

时间: 2024-11-02 12:16:11

八、Vue Router 进阶-导航守卫的相关文章

vue之路由导航守卫-全局前置守卫

一.使用方式 全局前置守卫用于在路由配置生效之前进行一些动作,可以使用 router.beforeEach 注册一个全局前置守卫: const router = new VueRouter({ ... }) router.beforeEach((to, from, next) => { // ... }) 参数: to: Route: 即将要进入的目标 路由对象 from: Route: 当前导航正要离开的路由 next: Function: 一定要调用该方法来 resolve 这个钩子.执行效

九、Vue Router 进阶-路由元信息meta

路由元信息 meta 在路由列表中,每个路由都有一个 meta元数据字段,我们可以在这里配置一些自定义信息,供页面组件或路由钩子函数中使用.在路由跳转的时候,提供我们判断条件. <script> // 配置 meta 数据 const router = new VueRouter({ routes: [ { path: '/', name: 'index', // 路由名称 component: index, // 映射的组件 meta: { title: '首页' } } ] }); <

Vue中的导航守卫(路由守卫)

当做Vue-cli项目的时候感觉在路由跳转前做一些验证,比如登录验证,是网站中的普遍需求. 对此,vue-router 提供的 beforeEach可以方便地实现全局导航守卫(navigation-guards).组件内部的导航守卫函数使用相同,只是函数名称不同(beforeRouteEnter .beforeRouteUpdate(2.2 新增) .beforeRouteLeave). 官方文档地址:https://router.vuejs.org/zh-cn/advanced/navigat

vue中的导航守卫

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con

Vue router 全局路由守卫

记录一下全局路由守卫的使用: 方法一:定义一个数组用于检测与管理需要登录的页面,全局路由守卫配合本地存储判断是否跳转 import Vue from 'vue' import Router from 'vue-router' import store from './../store' import Home from 'components/home/home' // 主页组件 // 其它组件... import Cart from 'components/cart/cart' // 购物车组

十、Vue Router 进阶-获取数据

获取数据的两种方式 导航完成之后获取数据:先完成导航,然后在接下来的组件生命周期钩子created中获取数据.在数据获取期间展示一个loading加载中的状态提示. 导航完成之前获取:导航完成前,在路由进入的守卫中获取数据,在数据获取成功后执行导航. 导航完成之后获取数据(可展示loading) 在组件的created钩子中获取数据.在获取数据期间展示一个loading状态,可以在不同视图间展示不同的loading状态. <template> <div class="post&

Vue Router 路由守卫:完整的导航解析流程

完整的导航解析流程 1 导航被触发. 2 在失活的组件里调用离开守卫. 3 调用全局的 beforeEach 守卫. 4 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+). 5 在路由配置里调用 beforeEnter. 6 解析异步路由组件. 7 在被激活的组件里调用 beforeRouteEnter. 8 调用全局的 beforeResolve 守卫 (2.5+). 9 导航被确认. 10 调用全局的 afterEach 钩子. 11 触发 DOM 更新. 12 用

Vue的钩子函数[路由导航守卫、keep-alive、生命周期钩子]

前言 说到Vue的钩子函数,可能很多人只停留在一些很简单常用的钩子(created,mounted),而且对于里面的区别,什么时候该用什么钩子,并没有仔细的去研究过,且Vue的生命周期在面试中也算是比较高频的考点,那么该如何回答这类问题,让人有眼前一亮的感觉呢... 前端进阶积累.公众号.GitHub Vue-Router导航守卫: 有的时候,我们需要通过路由来进行一些操作,比如最常见的登录权限验证,当用户满足条件时,才让其进入导航,否则就取消跳转,并跳到登录页面让其登录. 为此我们有很多种方法

vue导航守卫

三部分 router(VueRouter实例)守卫 -- 全局路由守卫 router守卫 -- 路由守卫 component守卫 -- 组件守卫 const router = new Router({}) router.beforeEach(function (to,from,next) {} // export default router router.beforeEach(function (to,from,next) { // console.log(to,from) if(to.nam