vue完整导航解析流程、路由元信息、数据获取、过渡动效、滚动行为、路由懒加载

250 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情juejin.cn/post/714765…

vue完整的导航解析流程

  1. 导航被触发
  2. 在失活的组件里调用beforRouteLeave守卫。
  3. 调用全局的beforeEach守卫。
  4. 在重用的组件里调用beforeRouteUpdate守卫(重复点击了一个组件)
  5. 在路由配置里调用beforeEnter
  6. 解析异步路由组件
  7. 在被激活的组件里调用beforeRouteEnter
  8. 调用全局的beforeResolve守卫
  9. 导航被确认
  10. 调用全局的afterEach钩子
  11. 触发DOM更新
  12. 调用beforeRouteEnter守卫中传给next的回调函数,创建好的组件实例会作为回调函数的参数传入。

路由元信息

就是在router路由配置一个属性meta(里面放一些权限,路由访问权限)。示例:

image.png

image.png

如何访问meta字段

我们称呼routes配置中的每个路由对象为路由记录。路由记录可以是嵌套的,因此,当一个路由匹配成功后,他可能匹配多个路由记录。一个路由匹配到的所有路由记录会暴露㘝route对象(还有在导航守卫中的路由对象)的route对象(还有在导航守卫中的路由对象)的route.matched数组。因此,我们需要遍历$route.matched来检查路由记录中的meta字段。
下面例子展示在全局导航守卫中检查元字段:

image.png
组件内设置meta字段,通过独享守卫来检查元字段:

image.png

image.png

image.png

数据获取

有时候,进入某个路由后,需要从服务器获取数据。例如,在渲染用户信息时,你需要从服务器获取用户的数据,我们可以通过两种方式来实现:
导航完成之后获取:先完成导航,然后在接下来的组件生命周期钩子中获取数据。在数据获取期间显示“加载中”之类的提示
导航完成之前获取:导航完成前,在路由进入的守卫中获取数据,在数据获取成功后执行导航。

导航完成之后获取

当你使用这种方式时,我们会马上导航he渲染组件,然后在组件的created钩子中获取数据。这让我们有机会在数据获取旗舰展示一个loading状态,还可以在不同视图间展示不同的loading状态。假设我们有一个Post组件,需要基于$route.params.id获取文章数据:

image.png

导航完成之前获取

通过这种方式,我们在导航转入新的路由前获取数据。我们可以在接下来的组件的beforeRouteEnter守卫中获取数据,当数据获取成功后只调用next方法

image.png

过渡动效

在你的路径组件上使用转场,并对导航进行动画处理
单个路由的过渡:
image.png
基于路由的动态过渡:

image.png

image.png

滚动行为

使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样。vue-router能做到,而且更好,它可以让你自定义路由切换时页面如何滚动
注意:这个功能只在支持history.pushState的浏览器中可用。
当创建一个router实例,你可以提供一个scrollBehavior方法:

image.png
scrollBehavior方法接收to和from路由对象。第三个参数savedPosition当且仅当popstate导航(通过浏览器的前进/后退按钮触发)时才可用。
这个方法返回滚动位置的对象信息,如下:

image.png
如果返回一个falsy的值,或者是一个空对象,那么不是发生滚动。

image.png

image.png
还可以通过hash来跳转到锚点位置:

image.png

image.png

image.png

路由懒加载

当打包构建应用是,js包会变得非常大,影响页面加载,如果我们能把不同的路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。
结合vue的异步组件和webpack的代码分割功能,轻松实现路由组件的懒加载。
首先,可以将异步组件定义为返回一个Promise的工厂函数(该函数返回的Promise应该resolve组件本身)
第二,在webpack2中,我们可以使用动态import(opens new window)语法来定义代码分块点。

image.png