(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.beforeEach
to: Route
: 即将要进入的目标 路由对象from: Route
: 当前导航正要离开的路由next: Function
: 一定要调用该方法来 resolve 这个钩子。执行效果依赖next
方法的调用参数。- next()
- next(false)
next('/')
- next(error)
- 解析守卫
router.beforeResolve
- 后置守卫
router.afterEach
- 前置守卫
- 路由守卫
routes路由规则 beforeEnter
- 组件守卫
Enter、Update、Leave
路由组件内直接定义以下路由导航守卫beforeRouterEnter
beforeRouterUpdate
beforeRouterLeave
完整的导航解析流程
- 导航被触发。
- 在失活的组件里调用
beforeRouteLeave
守卫。 - 调用全局的
beforeEach
守卫。 - 在重用的组件里调用
beforeRouteUpdate
守卫 (2.2+)。 - 在路由配置里调用
beforeEnter
。 - 解析异步路由组件。
- 在被激活的组件里调用
beforeRouteEnter
。 - 调用全局的
beforeResolve
守卫 (2.5+)。 - 导航被确认。
- 调用全局的
afterEach
钩子。 - 触发 DOM 更新。
- 调用
beforeRouteEnter
守卫中传给next
的回调函数,创建好的组件实例会作为回调函数的参数传入。
1 |
|