hgq's docs
主页
ES6-阮一峰 (opens new window)
Vue文档 (opens new window)
Axios文档 (opens new window)
Vue Router (opens new window)
Vuex文档 (opens new window)
面试题-Vue (opens new window)
面试题-JS (opens new window)

guoguoqiqi

漫不经心的向往
主页
ES6-阮一峰 (opens new window)
Vue文档 (opens new window)
Axios文档 (opens new window)
Vue Router (opens new window)
Vuex文档 (opens new window)
面试题-Vue (opens new window)
面试题-JS (opens new window)
  • Vue 生命周期
  • v-model 的原理
  • Vue 组件间通信有哪几种方式
  • v-for给每一项加个key的作用
  • v-if与v-show的区别
  • computed 和 watch 的区别
  • 对 SPA 单页面的理解,它的优缺点分别是什么
  • 为什么不建议v-if和v-for一起使用
  • Vue的内置指令
  • MVVM的理解
  • keep-alive 的了解
  • Vue身上set方法的实现原理,为什么能实现视图的更新
  • mixin的用法
  • Vuex 为什么要分模块并且加命名空间
  • vue-router 路由钩子函数是什么 执行顺序是什么
  • Vuex 页面刷新数据丢失怎么解决
  • vue-router的hash和history模式
  • vue-router 路由模式有几种
  • vue-router 中常用的 hash 和 history 路由模式实现原理
  • 动态绑定Class和Style
  • 服务端渲染SSR
  • 对Diff算法的认识
  • 对虚拟DOM的认识
  • 在组件上使用v-model
  • 路由有哪几种导航守卫
  • 在哪个生命周期内调用异步请求
  • 怎么理解Vue中的单向数据流
  • 组件中 data 为什么是一个函数
  • 通过数组下标或者长度无法触发更新
  • 路由懒加载是什么意思
  • 父组件监听子组件的生命周期
  • 父子组件生命周期钩子函数执行顺序
  • Vue项目的SEO优化
  • Vue项目的优化
  • Vue2的响应式原理的基本实现
  • Vue2和Vue3的响应式原理的区别
  • axios简单配置
  • Vuex的使用
  • 相关面试题集合
  • 对函数式组件的认识
  • Vue extend 作用和原理
  • 自定义指令的使用
  • 模板编译的原理
  • Vue是怎样进行依赖收集的
  • Vue生命周期钩子是如何实现的
  • 说明nextTick的原理
  • 请描述组件的渲染流程
  • Vue的普通Slot以及作用域Slot的区别
  • Vue use方法的作用及原理
  • Vue中的修饰符
  • Vue如何兼容ie的问题
  • Vue中style标签的scoped的作用及原理
  • Vue路由传参数
  • Vue事件绑定原理
  • 如何设计一个比较友好的Header组件
  • Vue-router守卫
  • scoped样式穿透
  • Vue是如何重写数组的方法的
  • scoped的情况下无法修改element的样式问题
  • 修改element ui的样式
  • 强制刷新组件的方式有哪些
  • vue组件的设计原则
  • 一个组件的渲染流程
  • 默认插槽、具名插槽和作用域插槽
  • Vue组件的name的作用
  • 为什么Vue被称为“渐进框架”
  • 怎么做Vue项目的SEO优化
  • vue推荐的风格指南
  • 如何重置data
  • vuex中actions和mutations有什么区别
  • 说说你对vue的错误处理的了解
  • 说一说递归组件
  • 对于vue双向数据绑定的理解
  • 说一说vue中template模板的编译过程
  • 说一说nextTick的作用
  • Vue为何采用异步渲染
  • vue-router有几种钩子函数?具体是什么及执行流程是怎样的
    • vue中mixin各个选项的合并策略
    • vue中一个组件模板为什么只能由一个根元素
    • vue中的watch和created哪个先执行
    • vue中编辑页面如果判断是否编辑过并在离开时提示保存
    • vue修饰符sync的作用及原理
    • vue中如何批量引入组件
    • vue使用axios如何取消请求
    • vue项目如何实现国际化(多语言)
    • vue中定义全局方法有哪几种方式
    • 跟keep-alive组件相关的生命周期钩子有哪些
    • 如何响应路由参数变化
    • vue中父子组件生命周期的执行顺序
    • 内置组件keep-alive的实现原理
    • mixins和extends的使用及区别
    • vue自定义指令
    • vue的事件绑定原理
    • vue权限控制一般怎么做
    • vue的动态路由怎么配置使用
    • vuex数据持久化怎么做
    • Vue
    guoguoqiqi
    2022-03-08

    vue-router有几种钩子函数?具体是什么及执行流程是怎样的

    # 使用场景

    路由进入前最典型的可以做一些权限控制, 路由离开时清除或存储一些信息,任务等等

    # 总结

    vue-router中钩子分为全局的,局部的,以及组件三种形式, 他们都有前置守卫以及后置守卫, 其中组件的前置守卫不能拿到当前组件的this,因组件还没有被创建,可以通过next的参数进行回传this,前置守卫必须调用next方法,否则不会进入下一个管道

    image

    # 有哪几种钩子函数

    1. 全局守卫
    2. 路由守卫
    3. 组件守卫

    # 1. 全局守卫

    # beforeEach

    全局前置守卫,在路由跳转前触发,它在 每次导航 时都会触发。

    通过 router.beforeEach 注册一个全局前置守卫。

    router.beforeEach((to, from, next) => {
      console.log('🚀🚀~ to:', to);
      console.log('🚀🚀~ from:', from);
      next();
    })
    
    1
    2
    3
    4
    5

    参数 beforeEach 全局前置守卫接收三个参数

    • to: Route: 即将要进入的目标路由对象
    • from: Route: 当前导航正要离开的路由对象
    • next: Function: 一定要调用该方法不然会阻塞路由。

    注意

    注意: next 参数可以不添加,但是一旦添加,则必须调用一次,否则路由跳转等会停止。

    定义多个守卫的情况

    全局前置守卫可以定义多个,根据创建顺序调用。在所有守卫完成之前导航一直处于等待中。

    # beforeResolve

    全局解析守卫,在路由跳转前,所有 组件内守卫 和 异步路由组件 被解析之后触发,它同样在 每次导航 时都会触发。 通过 router.beforeResolve 注册一个全局解析守卫。

    router.beforeResolve((to, from, next) => {
      next();
    })
    
    1
    2
    3

    回调参数,返回值和 beforeEach 一样。也可以定义多个全局解析守卫。

    # afterEach

    全局后置钩子,它发生在路由跳转完成后,beforeEach 和 beforeResolve 之后,beforeRouteEnter(组件内守卫)之前。它同样在 每次导航 时都会触发。

    通过 router.afterEach 注册一个全局后置钩子。

    router.afterEach((to, from) => {
      console.log('🚀🚀~ afterEach:');
    })
    
    1
    2
    3

    这个钩子的两个参数和 beforeEach 中的 to 和 from 一样。然而和其它全局钩子不同的是,这个钩子不会接受 next 函数,也不会改变导航本身。

    # 2. 路由守卫

    # beforeEnter

    需要在路由配置上定义 beforeEnter 守卫,此守卫只在进入路由时触发,在 beforeEach 之后紧随执行,不会在 params、query 或 hash 改变时触发。

    //index.js
    {
      path: '/a',
      component: () => import('../components/A.vue'),
      beforeEnter: (to, from) => {
       console.log('🚀🚀~ beforeEnter ');
      },
    },
    
    1
    2
    3
    4
    5
    6
    7
    8

    beforeEnter 路由守卫的参数是 to、from、next ,同 beforeEach 一样。

    # 3. 组件守卫

    # beforeRouteEnter

    //A.vue
    beforeRouteEnter(to, from,next) {
      console.log('🚀🚀~ beforeRouteEnter');
    },
    
    1
    2
    3
    4

    路由进入组件之前调用,该钩子在全局守卫 beforeEach 和路由守卫 beforeEnter 之后,全局 beforeResolve 和全局 afterEach 之前调用。

    参数包括 to,from,next。

    该守卫内访问不到组件的实例,也就是 this 为 undefined,也就是他在 beforeCreate 生命周期前触发。

    # beforeRouteUpdate

    //A.vue
    beforeRouteUpdate(to, from) {
      console.log('🚀🚀~ beforeRouteUpdate');
    },
    
    1
    2
    3
    4

    对于 beforeRouteUpdate 来说,this 已经可用了,所以给 next 传递回调就没有必要了。

    # beforeRouteLeave

    //A.vue
    beforeRouteLeave(to, from) {
      console.log('🚀🚀~ beforeRouteLeave');
    },
    
    1
    2
    3
    4

    对于 beforeRouteLeave 来说,this 已经可用了,所以给 next 传递回调就没有必要了。

    # 完整的导航解析流程

    导航被触发。
    在失活的组件里调用 beforeRouteLeave 守卫。
    调用全局的 beforeEach 守卫。
    在重用的组件里调用 beforeRouteUpdate 守卫。
    在路由配置里调用 beforeEnter。
    解析异步路由组件。
    在被激活的组件里调用 beforeRouteEnter。
    调用全局的 beforeResolve 守卫。
    导航被确认。
    调用全局的 afterEach 钩子。
    触发 DOM 更新。
    调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入。

    image

    # 参考文章链接

    vue-router有几种钩子函数?具体是什么及执行流程是怎样的? (opens new window)

    ← Vue为何采用异步渲染 vue中mixin各个选项的合并策略→

    最近更新
    01
    vuex数据持久化怎么做
    05-22
    02
    vue的动态路由怎么配置使用
    05-22
    03
    vue权限控制一般怎么做
    05-22
    更多文章>
    Theme by Vdoing | Copyright © 2022-2022 Guoquoqiqi | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式