概念:
- 前端路由:在单页面应用中,js可以拦截页面的跳转请求,动态获取新的数据,无需重新加载的情况下更新当前页面
- 后端路由:用户访问的 URL 路径返回不同的响应结果
两种模式
hash模式
- 使用哈希字符(
#)http://ppt.com#home看起来较丑。这部分 URL 从未被发送到服务器,改变hash不会重新加载页面, - 每一次改变hash(window.location.hash),都会在浏览器的访问历史中增加一个记录,改变hash可以监听到hashchange事件
- 使用query传参,刷新页面参数不丢失
history模式
- 利用HTML5 History api来操作浏览器历史记录栈。
- 这种模式看起来url很正常,
http://ppt.com/user/id; - 如果没有适当的服务器配置,用户在浏览器中直接访问
http://ppt.com/user/id,就会得到一个 404 错误。 - 使用params传参,对应的只能使用name,不能使用path参数;
刷新页面参数会丢失,可以将参数先缓存起来;
router 与 route 区别
- router 为 VueRouter 实例,拥有自己的方法,如: router.push 跳转。
- route 为当前活跃状态路由对象,有当前路由的信息。包括 path、params参数、query等
路由组件
- router-link 用于导航,相当于a链接
- router-view 用于占位,路由匹配到的组件将渲染在这
<!-- 添加路由 -->
<router-link to="/home">首页</router-link>
<router-link to="/about">关于</router-link>
<!-- 展示路由内容 -->
<router-view />
router-link的属性
tag属性,告诉router-link要渲染成什么标签。没有tag标签,默认渲染成a链接
// 渲染成button
<router-link tag="button">首页</router-link>
active-class
点击当前router-link选中的类,做样式切换
页面跳转方式
声明式 <router-link :to="...">
编程式 router.push(...)
<router-link :to="{ path:'/', query:{ id:'123'}}">
</router-link>
//
this.$router.push({
name: 'home' , params: { id:'123' }
})
路由懒加载
打包构建应用时,JavaScript 包会变得非常大;当路由被访问的时候才加载对应组件;可大大提高效率
const Foo = () => import(/* webpackChunkName: "group-foo" */ './Foo.vue')
动态路由
某种情况下,一个组件它对应的路径是不确定的;比如:详情页面,路径后面是不同的详情id
routers:[
{
path: '/goods/:id',
component:()=>{ import('../views/goods/detail.vue') }
}
]
参数变化
当从详情调到详情时,比如:在详情A页面中打了个详情B的广告链接。此时详情id变了,但组件会被复用,即组件的生命周期钩子不再被调用。此时想要页面做出响应,有两种方式:
1.watch监听route对象
watch: {
$route(to, from) {
// 对路由变化作出响应...
}
}
2.路由更新钩子
beforeRouteUpdate(to, from, next) {
// ...
}
路由钩子
全局钩子
- 全局前置守卫
router.beforeEach - 全局解析守卫
router.beforeResolve - 全局后置守卫
router.afterEach
router.beforeEach((to, from, next) => {
// ...
})
router.afterEach((to, from) => {
// ...
})
路由独享的守卫
beforeEnter进入路由时触发
组件内的守卫
beforeRouteEnter渲染该组件的对应路由被验证前调用beforeRouteUpdate当前路由改变,但是该组件被复用时调用beforeRouteLeave导航离开渲染该组件的对应路由时调用
守卫的三个参数:
-
to: 即将要进入的目标 路由对象
-
from: 当前导航正要离开的路由
-
next: 一定要调用该方法来 resolve 这个钩子。执行效果依赖
next方法的调用参数。- next() : 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
- next(false) : 中断当前的导航。
next('/')或者next({ path: '/' }): 跳转到一个不同的地址。next(error): (2.4.0+) 如果传入next的参数是一个Error实例,则导航会被终止且该错误会被传递给 router.onError()
导航解析流程
- 导航被触发。
- 在失活的组件里调用
beforeRouteLeave守卫。 - 调用全局的
beforeEach守卫。 - 在重用的组件里调用
beforeRouteUpdate守卫 (2.2+)。 - 在路由配置里调用
beforeEnter。 - 解析异步路由组件。
- 在被激活的组件里调用
beforeRouteEnter。 - 调用全局的
beforeResolve守卫 (2.5+)。 - 导航被确认。
- 调用全局的
afterEach钩子。 - 触发 DOM 更新。
- 调用
beforeRouteEnter守卫中传给next的回调函数,创建好的组件实例会作为回调函数的参数传入。