Vue Router
捕获路由
匹配参数
1 | //匹配所有参数 |
含有通配符的路由通常放在最后,{path:"*"}
通常用于 404 页面.
路由后缀
当使用通配符时,$route.params
内会自动添加一个名为pathMatch
.包含了 URL 通过通配符被匹配的部分:
1 | //给出一个路由 { path: "/user-*"} |
路由跳转
router.push
声明式: <router-link :to="...">
编程式: router.push(...)
1 | //字符串 |
注意name
和params
搭配,path
和query
搭配
1 | const userId = '123' |
router.replace
此方法和 router.push 很像,不同的是不会向 history 添加新记录,而是替换掉当前的 history 记录.
声明式: <router-link :to="..." replace>
编程式: router.push(...)
router.go
此方法参数是整数,类似window.history.go()
和 window 的方法类似
router.push
=> window.history.pushState
router.replace
=> window.history.replaceState
router.go
=> window.history.go
路由命名
通过name
给路由命名
1 | //跳转调用 |
重定向
1 | const router = new VueRouter({ |
别名
区别:
重定向: 用户访问/a
,URL 被替换为/b
,匹配路由为 /b
别名: /a
的别名是/b
.用户访问/b
时,URL 会保持为/b
,但是路由匹配是/a
.就像访问了/a
一样.
1 | const router = new VueRouter({ |
路由传参
通过在路由 routes 中设置 props 进行解耦
1 | const User = { |
如果 props 为 true,就可以通过组件获取参数.
history 模式
除了在 new Router()中设置mode: history
外,还需要后端设置.
路由钩子(导航守卫,路由守卫)
beforeEach
可以设置进度条,
重置 store
1 | store.commit("SET_TABS", []); |
判断是否有不需要登录就可以看的页面
如果需要跳转到登录
如果已登录,操作一些需要做的
1 | //未登录不能验证身份 |
路由独享守卫
在路由配置上的beforeEnter
守卫:
1 | const router = new VueRouter({ |
路由元信息
1 | const router = new VueRouter({ |
一个路由匹配到的所有路由记录会暴露为$route
对象(还有在导航守卫中的路由对象)的$route.matched
数组.因此,我们需要遍历$route.matched
来检查路由记录中的meta
字段.
如果有的页面不用登录就可以访问,就可以在 meta 中设置字段.
1 | router.beforeEach((to, from, next) => { |
路由守卫
分为三种,全局,单个路由独享,组件的.
全局
相当于程序的页面生命周期.
全局守卫 3 个,beforeEach
, beforeResolve
, afterEach
分别表示进入路由前,解析前,离开路由时.
beforeEach: 路由跳转前触发,参数to,form,next
,主要用于登录验证.
beforeResolve: 和 beforeEach 类似,在 beforeEach 和 beforeRouteEnter 之后,afterEach 之前.
afterEach: 在路由跳转后触发.参数to,from
.
next()函数的作用是回调验证导航.
next(): 什么都不传,表示继续执行.多个 next()则可能不会解析或报错.
next(false): 中断当前导航.
next(‘/‘): 跳转到该地址.
next(error): 钩子中止将错误传递给 router.onerror()回调.
1 | const router = new VueRouter(); |
路由独享守卫
beforeEnter: 只在进入路由时触发.不会在params
,query
,hash
改变时触发.
1 | const router = new VueRouter({ |
组件内守卫
有三个,beforeRouteEnter
,beforeRouteUpdate
,beforeRouteLeave
.
分别代表,渲染该组件对应的路由被验证前调用,路由复用同一个组件,离开当前路由
1 | const Foo = { |
滚动行为
切换到新路由时,滚动到顶部或者保持原来的位置,可以设置滚动行为.
此功能只在支持
history.pushState
的浏览器可用
1 | const router = new VueRouter({ |
scrollBehavior
方法接收to
和from
路由对象.第三个参数savedPosition
当且仅当popstate
导航(浏览器的前进后退按钮触发)时才可用.
1 | scrollBehavior(to, form, savedPosition){ |
滚动到锚点
1 | scrollBehavior(to, form, savedPosition){ |
平滑滚动
1 | scrollBehavior(to, form, savedPosition){ |
路由懒加载
1 | { |
常见问题
- 两个页面参数不同使用同一组件,默认情况下当这两个页面切换时并不会触发 created 或者 mounted 钩子。
- 通过
watch
$route 的变化处理
1 | watch: { |
- 通过在
<route-view>
上加唯一的key保证渲染.
1 | <router-view :key='$route.fullPath'></router-view> |
刷新当前页面
1 | this.$router.go(0); |
跳转到其他页面
1 | //直接跳转,可以用后退返回 |