router
前言:讲解 vue 路由的详细使用
概述
通过一系列 demo 详细讲解 vue-router 的使用及注意事项.
范例学习
利用官方文档的一系列范例理解路由模块的使用.
静态路由
参看 basic 文件.
- 引入
vue,vue-router模块 - 利用
router-link标签定义路由导航to属性确定切换的锚点
- 利用
router-view标签确定路由变换的节点 - 初始化路由模块
VueRouterpath属性制定路由component制定对应的模板
- 注入路由模块并手动启动
$mount('#app')将 vue 绑定在该节点并启动 vue.
动态路由
利用路由获取传入参数. 参看 动态路由
- 利用
/foo/:id的形式定义路由. 该模式下所有/foo/*模式的路由都会指向相同模板. 利用$route.params对应路由参数对象 如范例:
/foo/1对应$route.params对象为{id:1}/foo/2对应$route.params对象为{di:2}
注意上面的方式只针对一层,如果是
/foo/df/d多一层路径则无法提取
所以多添加一层对应的结果为
/foo/3/由于下一层为空,$route.params为{id:3}/foo/foo/bar多了一层导致无法获得下一层,$route.params为空
此处可以看源码确定匹配模式??????????
更进一步利用 : 模式可以传递多个参数.例如 /foo/:id/demo/:demo
/foo/foo/demo/34$route.params为{id:"foo",demo:34}
当采用动态路由指向相同视图时.组件不会发生销毁和重建. 此时无法利用路由变化,挂载组件的声明周期钩子. 此时利用
$router对象变化来判断切换.
watch监察router变化beforeRouteUpdate钩子绑定路由变化
详见 响应参数变化 除了上述匹配模式,也可利用正则进行路由参数提取.详见 路由匹配
嵌套路由
- 利用
children属性定义多级路由. 注意如下问题
- 一级模板中必须包含
router-view标签给下一级路由替换 - 二级路由若采用
/开头则合并到一级模板,多级同时替换
路由控制
Router
详解 Router 对象的配置项. 及实例化后的方法及属性
配置项
利用 new VueRouter() 创建路由对象时 可如下配置项.
- routers 核心配置项,定义各路由 的地址和对应跳转内容,该配置项为数组模式.每个路由包含如下配置属性
path配置前端路由地址,详见 路由配置核心字段
component对应的组件名称核心字段
name路由名称,components命名视图组件redirect重定向.利用该属性.实现路由的状态控制props属性值alias简写名称children定义嵌套结构路由时有用beforeEnter路由进入前的钩子脚本,包含如下参数- arg0 将要切换的路由对象
- arg1 切换之前的的路由对象
- arg2 一个回调句柄,切换后会执行该函数
meta路由传递的值.caseSensitive布尔值.匹配路由大小写是否敏感pathToRegexpOptions正则匹配选项
mode路由路径模式.详见 路由模式base路由对应的基路径linkActiveClass需要结合 router-link 标签使用利用该配置激活对应的导航栏
linkExactActiveClass同上scrollBehavior配置路由的滚动行为,详见 滚动行为parseQuerey/stringifyQuery覆盖查询路由的解析函数fallback为了兼容性回退 hash 模式
实例化的 router
经过上述配置后.实例化的 router 包含如下方法和属性.
- 属性
app绑定了该路由的 vue 对象mode路由对应的模式currentRoute当前的路由对象
- 方法
beforeEach每个路由跳转前的钩子函数 ,详见 导航守卫beforeResolve路由完成钩子afterEach导航执行后钩子push保存路由replace替换路由go跳转到对应路由栈back返回上级路由forward顺着路由栈向前getMatchedComponents返回对应组件的构造函数在服务端渲染时利用此方法实例化组件
resolve解析目标位置addRoutes动态添加路由onReady路由监听钩子onError路由错误钩子
路由信息对象
当注册路由钩子时会传入当前路由或跳转路由的信息对象. 包含的信息如下
- 属性
path跳转路径params传入参数query查询对象hash路由的 hashfullPath完成的路由地址matched包含路由记录name路由名称(配置项定以后才有)
守卫导航
实例化的 router 对象可以注册钩子. 监听整个路由变化.
全局钩子
boforeEach 在跳转前执行
参见范例 导航守卫 注册函数回传入三个参数 * to 切换到的路由 * from 切换前的路由 * next 回调 resolve 函数
必须调用 next 函数来说明该回调的执行结果.否则路由会被挂起. 导致视图不渲染!!!解析结果如下
next()切换到下一个注册函数,注意同样必须调用 next 来申明执行结果next(false)false 会终止该路由的切换,并切换到切换钱的目录.可以利用该方法进行路由的权限控制
next('/')切换到其他目录.注意切换到其他目录会导致重新触发绑定函数.若绑定函数没有终止. 会导致循环触发路由.出现堆栈溢出 一定要确保路由的循环是可终止的
next(error)抛出一个错误对象,可以被onError捕获.
beforeResolve 解析守卫,异步视图加载后执行
参见范例 解析守卫
afterEach,后置钩子 参见范例 后置钩子
除了全局配置,实例化路由时每个路由支持如下 钩子属性.参见范例 路由独享钩子
beoforeEnter该路由进入前的钩子,可以用来做路由权限控制
此外还可在声明组件内部定义路由钩子.
beforeRouteEnter组件实例化前触发beforeRouteLeave路由离开前触发beforeRouteUpdate组件实例化后,数据刷新触发.例如/foo/:id类的路由
这个导航守卫脚本顺序
- 导航被触发
- beforeRouteLeave 组件内部离开钩子
- beforeEach 全局钩子
- beforeRouteUpdate 组件重新更新钩子
- beforeEnter 路由配置里调用视图钩子
总结,路由钩子分几类
- 全局钩子
beforeEachbeforeResolveafterEach
- 路由钩子
beforeEnter
- 组件钩子
beforeRouteEnterbeforeRouteUpdatebeforeRouteLeave
next 函数用来解析钩子回调的执行结果.
路由元信息
每个路由记录支持 meta 属性. 利用概述性实现对特殊路由的权限控制. 参见 router_meta.
应该结合全局状态控制路由切换
过渡动效
- [ ] 按下不看
数据获取
基于前后端分离的架构时. 切换路由渲染数据的方式
- 导航完成后,在组件声明周期钩子中获取数据
- 导航完成前,在路由进入的守卫中获取数据, 成功后导航
参见范例 导航后获取数据
- 不启动 http-server 返回错误
- 在对应文件加启动
http-server -p 8081打开 after_route 返回成功
参见范例 导航前获取数据
滚动行为
当视图超出页面时. 可以设置路由默认回退的位置. 参见范例 滚动行为
深入阅读
本页覆盖 Vue Router 的常见 API 速查。更系统的能力拆解与可运行 demo 见 Vue Router 学习路径,共 13 个 demo,按主题递进:
- 01.history — 沙箱中
createMemoryHistory的初始化 - 02.dynamic-route —
path: '/user/:id'动态参数与onBeforeRouteUpdate - 03.nested-route —
children嵌套 +components: {default, sidebar}命名视图 - 04.named-route — 命名路由 vs 路径字符串
- 05.programmatic-navigation —
useRouter().push/replace/go/back与NavigationFailureType - 06.router-view-slot —
<router-view v-slot>+<Transition>+<KeepAlive> - 07.global-guard —
router.beforeEach异步权限拦截 - 08.route-guard — 组件级
beforeRouteEnter/Update/Leave - 09.before-enter-guard — 路由配置
beforeEnter与角色校验 - 10.fetch-on-navigation — 导航前/后获取数据 vs
<Suspense>+ async setup - 11.lazy-route —
() => import('./Foo.vue')与defineAsyncComponent - 12.scroll-behavior —
scrollBehaviorsavedPosition / hash / 自定义坐标 - 13.composable-use-route —
useRouteQuery(name)/useRouteParam(name)组合式封装