Vue-Router

438 阅读8分钟

Vue Router

Vue Router 官网

Vue Router 是Vue.js官方的路由管理器。它和Vue.js的核心深度集成,让构建单页面应用变得易如反掌

功能:

  • 嵌套路由/视图表
  • 模块化的、基于组件的路由配置
  • 路由参数、查询、通配符
  • 基于Vue.js过渡系统的视图过渡效果
  • 细粒度的导航控制
  • 自带自动激活的CSS class 的链接
  • HTML5历史模式或hash模式,在IE9中自动降级
  • 自定义的滚动条行为

<router-link>

<router-link> 组件支持用户具有路由功能的应用中(点击导航),通过to属性指定目标地址,默认渲染成带有正确链接的<a>标签, 可以通过配置tag属性生成别的标签。当目标路由被成功激活时,链接元素上会自动设置一个表示激活的css类名。 既:router-link-active

属性描述默认值类型
to表示目标路由的链接。被点击后,内部会立刻把 to 的值传到router.push(),可为字符串/描述目标位置的对象requiredstring/Location
replace设置replace属性,当点击时就会调用router.replace() 而不是router.push(),导航不会留下history记录默认值falseboolean
append设置append属性后,则在当前(相对)路径钱添加基路径。例:我们从/a导航到一个相对路径b,如果没有配置append,则路径为/b 如果配了则为/a/bfalseboolean
tag将router-link渲染成其他标签,修改tag属性astring
active-class设置链接激活时使用的CSS类名。默认值可以通过路由的构造选型linkActiveClass来全局配置router-link-activestring
exact是否激活默认类目得依据是包含匹配falseboolean
exact-active-class配置当链接被精确匹配得时候应该激活得class。注意默认值也是可以通过路由构造函数选项linkExactActiveClassrouter-link-exact-activestring
event声明可以用来触发导航得事件,可以是一个字符串或者是一个包含字符串得数组clickstring/Array(string)

<router-view>

<router-view>组件是一个functional组件,渲染路径匹配到得视图组件,<router-view> 渲染得组件还可以内嵌自己得<router-view>根据嵌套路径,渲染嵌套组件。 其他属性(非router-view使用得属性)都直接传给渲染的组件,很多时候,每个路由的数据都是包含在路由参数中的。因为它也是个组件,所以可以配合 <transition> <keep-alive> 使用。如果两个结合一起用,要确保在内层使用 <keep-alive>

属性描述默认值类型
name如果router-view设置了名称,则会渲染对呀的路由配置中components下的响应组件defaultstring

Router 构建选项

属性描述默认值类型
routesArray<RouteConfig>
mode配置路由模式'hash' (浏览器环境) / 'abstract' (nodejs环境) 可选值(hash / history / abstract)string
base应用的基路径。 例如,如果整个单页应用服务在 /app/ 下,然后 base 就应该设为 "/app/"'/'string
linkActiveClass全局配置router-link默认激活的classrouter-link-activestring
linkExactActiveClass全局配置router-link默认的精确激活的classrouter-link-exact-activestring
scrollBehavior滚动行为function
parseQuery/stringifyQuery提供自定义查询字符串的解析/反解析函数。覆盖默认行为function
fallback当浏览器不支持history.pushState控制路由是否应该回退到hash模式。trueboolean

routes:

1617333105(1).jpg

Router实例属性

属性描述类型
router.app配置了router的Vue根实例Vue instance
router.mode路由使用的模式string
router.currenRouted当前路由对应的路由信息对象Route
router.START_LOCATION以路由对象的格式展示初始路由地址,即路由开始的地方。可用在导航守卫中以区分初始导航。Route

START_LOCATION

image.png

Router实例方法

router.beforeEach

router.beforeResolve

router.afterEach

函数签名

image.png

router.push

router.replace

router.go

router.back

router.forword

函数签名

image.png 这些函数仅在安装路由插件并将其传递给 Vue 根实例后调用

router.getMatchedComponents

函数签名

image.png 返回目标位置或是当前路由匹配的组件数组 (是数组的定义/构造类,不是实例)。通常在服务端渲染的数据预加载时使用。

router.resolve

函数签名

image.png 解析目标位置(格式和router-link 的to prop一样)

  • current 是当前默认的路由(通常不需要改变它)
  • append 允许你在current路由上附近路径

router.addRoute

添加一条新路由规则。如果该路由规则有name,并且已经存在一个与之相同的名字,则会覆盖它

函数签名

image.png 添加一条新的路由规则记录作为现有路由的子路由。如果该路由规则有name,并且已经存在与之相同的名字,则会覆盖它。

函数签名

image.png

router.getRoutes

获取所有活跃的路由记录列表。注意只有文档中记录下来得property才被视为公共API,避免使用任何其他property,在vue router 4中它不存在

函数签名

image.png

router.onReady

该方法把一个回调排队,在路由完成初始导航时调用,这意味着它可以解析所有的异步钩子和路由初始化相关联的异步组件。 可以有效确保服务端渲染时服务端和客户端输出的一致。 第二个参数errorCallback只在2.4+ 支持,它会初始化路由解析运行错误(比如解析一个异步组件失败)时被调用

函数签名

image.png

router.onError

注册一个回调,该回调会在路由导航过程中出错时被调用,调用错误必须是下面的一种:

  • 错误在一个路由守卫函数中被同步抛出
  • 错误在一个路由守卫函数中通过调用next(err)的方式异步捕获并处理
  • 渲染一个路由过程中,需要尝试解析一个异步组件时发生错误

函数签名

image.png

路由对象

一个路由对象(route object)表示当前激活的路由的状态信息,包含了当前URL解析得到的信息,还有URL匹配到的路由记录。 路由对象是不可变得,每次成功的导航后都会产生一个新的对象 路由对象出现最多的地方:

  • 在组件内,即this.$route
  • 在$route 观察者回调内
  • router.match(localtion)的返回值
  • 导航守卫函数

image.png

  • scrrllBehavior方法的参数

image.png

路由对象属性

属性描述类型
$route.path对应当前路由的路径。总是解析为绝对路径string
$route.params一个key/value对象,包含了动态片段和全匹配片段,如果没有路由参数,就是一个空对象object
$route.query一个key/value对象,表示URL查询参数,如果没有查询参数吗,则为空对象object
$route.hash当前路由的hash值(带#),如果没有hash值,则为空字符串string
$route.fullPath完成解析后的URL,包含查询参数和hash的完整路径string
$route.matched一个数组,包含当前路由的所有嵌套路径片段的路由记录,路由记录就是routes配置数组中的对象副本Array
$route.name当前路由的名称,如果有的话
$route.redirectedForm如果存在重定向,即为重定向来源的路由的名字string

$route.matched

image.png 当 URL 为 /foo/bar,$route.matched 将会是一个包含从上到下的所有对象 (副本)。

组件注入

注入的属性

通过在Vue根实例的router配置传入router实例,下面这些属性成员会被注入到每个子组件

  • this.$router

     route实例
    
  • this.$route

     当前激活的路由信息对象。这个属性是只读的,里面的属性是(immutable)不可变的, 可以通过watch(监测变化)它
     
    

导航守卫

全局前置守卫

使用 router.beforeEach 注册一个全局前置守卫 当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫resolve之前一直处于等待中 每个守卫方法接受三个参数

  • to: Route:即将要进入的目标路由对象
  • form: Route:当前导航正在离开的路由
  • next: Function:一定要调用这个方法来resove这个钩子。执行效果依赖next方法的调用参数

image.png

全局解析守卫

2.5.0+使用router.beforeResolve注册一个全局守卫,这个router.beforeEach类似,区别是在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫被调用。

全局后置钩子

通过router.afterEach注册全局后置钩子,和守卫不同的是,这些钩子不会接受next函数也不会改变导航本身

image.png

路由独享的守卫

在路由配置上直接定义beforeEnter守卫,这些守卫与全局前置守卫的方法参数是一样的

image.png

组件内的守卫

  • beforeRouteEnter
  • beforeRouteUpdate(2.2新增)
  • beforeRouteLeave

image.png beforeRouteEnter守卫不能访问this,因为守卫在导航确认前被调用,因此即将登场的新组件还有被创建。可以通过一个回调给next来访问组件实例。在导航被确认的时候执行回调,并且把组件实例做完回调方法的参数

image.png 注意beforeRouteEnter是支持给next传递回调的唯一守卫,对于beforeRouteUpdate和beforeRouteLeave来说,this已经可用了,所以不支持传递回调,没有必要。

image.png 这个离开守卫通常用来禁止用户还在未保护修改前突然离开,该导航可以通过next(false)来取消

image.png

完整的导航解析流程

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