(syntax)vue-router
2022-09-01 00:00:00
vue-router
- 动态路由匹配
/:id/:name路由参数、查询、通配符- 嵌套路由
children:[]- 编程式的导航
router.replace/push/replace/go- 命名路由
router-link name- 命名视图
router-view name- 重定向和别名
redirect alias- 路由组件传参
{ name:"",params:{} }- 导航守卫
3全局beforeEach/Resolve/afterEach+ 1路由beforeEnter+ 3组件beforeRouter + Enter、Update、Leave- 路由元信息 meta
- 不同的历史模式
1 | |
- vue官方的路由管理器 组件树/路由树
- 所有的路由抽离出来方便管理(集中管理) 路由传递参数 、动态传递参数
后端路由 vs 前端路由
- 前端路由: 对于单页面应用程序来说,主要通过 URL 中的 hash(#号)来实现不同页面之间的切换,同时,hash 有一个特点:HTTP 请求中不会包含 hash 相关的内容;所以,单页面程序中的页面跳转主要用 hash 实现。(前端当前页面的跳转)
- 后端路由: URL 对应服务器上的资源
命名路由和视图
- router-link to replace append tag active-class
相当于 a链接 to 相当于 href 命名路由 - router-view name 显示匹配的组件 占位符
视图占位符 - v-slot 作用域插槽暴露第底层的定制能力,主要面向库作者、但也可以为开发者提供便利
编程式的导航(操作浏览器的历史记录和跳转记录)
- router-link router.push router.replace router.go(n)
- 当你点击
<router-link>时,这个方法会在内部调用router.push(…),所以说,点击<router-link :to="...">等同于调用router.push(...) - router.replace(没有记录 回不去) 跟
router.push很像,唯一的不同就是,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录 - router.go(n)参数是一个整数,意思是在 history 记录中向前或者后退多少步,类似
window.history.go(n)
- 当你点击
| 声明式 html | 编程式 js |
|---|---|
<router-link :to="..."> | router.push(...) |
<router-link :to="..." replace> | ·router.replace(...) |
1 | |
router 构建选项 实例属性 实例方法
- path 跳转的路径
- name 命名路由 指定该路径名称
- redirect 重定向
- component 组件
- children 路由嵌套
- alias 别名
path:'/a'(实际访问),componet: A,alias:'/b'(url展示出来假的) - mode hash模式
- meta 路由元信息
route
$route对象,一个路由匹配到的所有路由记录会暴露为this.$route对象 路由对象- this.$router router 实例 (全局)
- this.$route 当前激活的路由信息对象 (局部)
- 传递参数 $route.query ? query
- this.$route.params 使用params 方式传递路径 来获取路由中的参数
- $route.hash
| router-link | 是一个a链接 to(router.push() 目标路由的链接 )、replace、append、tag、active-class、 |
| router-view | name 设置了名称,则会渲染对应的路由配置中 |
| v-slot | 作用域插槽暴露第底层的定制能力,主要面向库作者、但也可以为开发者提供便利 |
| Router构建选项 | routes、mode、base、linkActiveClass 、linkExactActiveClass 、scrollBehavior 、parseQuery 、stringifyQuery、fallback |
| Router实例属性 | app、mode、currentRoute、START_LOCATION |
| Router实例方法() | berforeEach、beforeResolve、afterEach、push、replace、go、back、forward、getMatchedComponent、resolve、addRoutes、addRoute、addRoutes、onReady、onError |
| 路由对象 | $route.path 、``$route.params、$route.query 、$route.hash、$route.fullPath`、**$route.matched、$route.name、$route.redirectedFrom** |
| 组件注入 | 注入的属性 this.$router router 实例、 this.$route 当前激活的路由信息对象、属性只读、属性不可变、可以watch它增加的组件配置选项 |
1 | |
created() { this.$route.query this.$route.params 获取路由参数
1 | |
监听路由变化 watch
1 | |
命名路由 vs 命名视图
- 重命名路由的名称 添加 name 属性
1 | |
- 命名视图 同一路由router-view name绑定多个组件 router-view name
1 | |
动态路由匹配 某种模式( : )匹配到的所有路由,全部映射到同个组件
- 动态路径参数
:: 同一个组件,不同的路由参数 通过 动态路径参数 渲染出不同的 多个不同组件 - 同一路由可以匹配多个路由,匹配的优先级就按照路由的定义顺序:谁先定义,谁的优先级就最高(先定义优先级高)
1 | |
路由元信息 meta 字段
- 添加路由元信息 meta 字段
- 定义路由的时候可以配置
meta字段:
1 | |
路由懒加载
- 当打包构建项目时,JavaScript包会变得非常大,影响页面加载。如果我们能把不同路径对应的组件分割成不同的代码块,然后当路由被访问被访问的时候才加载对应的组件,这样就更加高效了
实现方式(实现路由组件的懒加载)
1 | |
导航守卫 3全局 beforeEach/Resolve/afterEach + 1路由 beforeEnter+ 3组件 beforeRouter + Enter、Update、Leave
- “导航”表示路由正在发生变化
vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航
- 全局
- 前置守卫
router.beforeEachto: Route: 即将要进入的目标 路由对象from: Route: 当前导航正要离开的路由next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖next方法的调用参数。- next()
- next(false)
next('/')- next(error)
- 解析守卫
router.beforeResolve - 后置守卫
router.afterEach
- 前置守卫
- 路由守卫
routes路由规则 beforeEnter - 组件守卫
Enter、Update、Leave路由组件内直接定义以下路由导航守卫beforeRouterEnterbeforeRouterUpdatebeforeRouterLeave
完整的导航解析流程
- 导航被触发。
- 在失活的组件里调用
beforeRouteLeave守卫。 - 调用全局的
beforeEach守卫。 - 在重用的组件里调用
beforeRouteUpdate守卫 (2.2+)。 - 在路由配置里调用
beforeEnter。 - 解析异步路由组件。
- 在被激活的组件里调用
beforeRouteEnter。 - 调用全局的
beforeResolve守卫 (2.5+)。 - 导航被确认。
- 调用全局的
afterEach钩子。 - 触发 DOM 更新。
- 调用
beforeRouteEnter守卫中传给next的回调函数,创建好的组件实例会作为回调函数的参数传入。
1 | |