- vue-router是基于路由和组件:路由用户设定访问路径,将路径和组件映射起来;
- 在vue-router的单页面应用中,页面的路径改变就是组件的切换。
(一)Vue-router的模式⭐⭐⭐⭐⭐
1. hash模式
- hash也就是#,它是URL的锚点,表示的是网页中的一个位置
hash的特点:它的改变不会导致页面重新加载,只是会触发hashchange事件 - 监听
hashchange事件实现前端路由,利用url中的hash来模拟一个hash,以保证url改变时,页面不会重新加载,也就是单页面应用了。
hashchange事件可以获取到变化前后的url(包含hash值):window.addEventListener("hashchange", 函数, false); - vue-router 默认使用
hash模式,所以在路由加载的时候,项目中的url会自带#。
hash模式是通过锚点值的改变,根据不同的值,渲染指定的DOM位置上不同的数据。 - hash模式会创建
hashHistory对象,在访问不同路由的时候,会发生两个操作:- ① HashHistory.push()将新的路由添加到浏览器访问的历史的栈顶;
- ② HasHistory.replace()替换到当前栈顶的路由。
2. history模式
pushState 和 replaceState。通过这两个 API , 我们可以改变 URL 地址,并且浏览器不会向后端发送请求,同时还会触发popstate事件。通过这两个API和 通 popstate事件,我们就能⽤另外⼀种⽅式实现前端路由。
如果不想使用 #, 可以使用 vue-router 的另一种模式 history
new Router({
mode: 'history',
routes: [ ]
})
需要注意的是,当我们启用
history模式的时候,由于我们的项目是一个单页面应用,所以在路由跳转的时候,就会出现访问不到静态资源而出现404的情况, 因为没有当前的真正路径,要想解决这一问题需要后端配合,将不存在的路径重定向到入口文件。这时候就需要服务端增加一个覆盖所有情况的候选资源:如果URL匹配不到任何静态资源,则应该返回同一个index.html页面
(二)Vue-router有哪几种钩子函数⭐⭐⭐⭐⭐
(1)beforeEach,参数有
- to(Route路由对象)
- from(Route路由对象)
- next(function函数) 一定要调用才能进行下一步
(2) afterEach
(3)beforeRouterLeave
(三)谈谈你对vue-router的 keep-alive 的理解⭐⭐⭐⭐⭐
1. 原理
Vue.js内部将DOM节点抽象成了一个个的VNode节点,keep-alive组件的缓存也是基于VNode节点的而不是直接存储DOM结构。- 它将满足条件
(pruneCache与pruneCache)的组件在cache对象中缓存起来,在需要重新渲染的时候再将vnode节点从cache对象中取出并渲染。
2. 作用
实现组件缓存,保持这些组件的状态,以避免反复渲染导致的性能问题。 适合需要缓存组件 频繁切换,不需要重复渲染的情况
3.场景
tabs标签页 后台导航,vue性能优化
4. 使用
- keep-alive 可以实现组件缓存,当组件切换时不会对当前组件进行卸载。
- 常用的两个属性
include/exclude,允许组件有条件的进行缓存。
5. 两个生命周期
activated/deactivated,用来得知当前组件是否处于活跃状态。
- keep-alive 的中还运用了 LRU(Least Recently Used)算法。
- keep-alive 有一个最大缓存限制,使用的是 LRU算法(最久未使用法,使用了就放到最上边,先删最下边)
- router-view也是一个组件,如果直接被包在keep-alive里面,所有路径匹配到的视图组件都会被缓存
(四)vue路由传参的三种基本方式
先有如下场景 点击当前页的某个按钮跳转到另外一个页面去,并将某个值带过去
<div class="examine" @click="insurance(2)">查看详情</div>
1. 方法一:路由path + id
特点:页面刷新数据不会丢失
(1)路由配置:path: '/particulars/:id,使用:/id来传递参数
{
path: '/particulars/:id',
name: 'particulars',
component: particulars
}
(2)使用方式:直接调用$router.push实现携带参数的跳转
methods:{
insurance(id) {
//直接调用$router.push 实现携带参数的跳转
this.$router.push({
path: `/particulars/${id}`,
})
}
可以看出需要在path中添加/:id来对应 $router.push 中path携带的参数。在子组件中可以使用来获取传递的参数值 另外页面获取参数如下
(3)获取参数:this.$route.params
this.$route.params.id
2. 方法二:params传值
特点:页面刷新数据会丢失
(1)路由配置:不使用:/id来传递参数,因为组件中,而是使用params来携带参数。
{
path: '/particulars',
name: 'particulars',
component: particulars
}
(2)使用方式:通过路由属性中的name来确定匹配的路由,通过params来传递参数。
methods:{
insurance(id) {
this.$router.push({
name: 'particulars',
params: {
id //通过params来传递参数。
}
})
}
(3)获取参数:this.$route.params.id
this.$route.params.id
3. 方法三:query传值
特点:使用path来匹配路由,然后通过query来传递参数,这种情况下query传递的参数会显示在url后面?id=?
(1)路由配置:路由配置:
{
path: '/particulars',
name: 'particulars',
component: particulars
}
(2)使用方式:
methods:{
insurance(id) {
this.$router.push({
path: '/particulars',
query: {
id: id //通过query来传递参数
}
})
}
(3)获取参数:this.$route.query.id
this.$route.query.id
4.name+params
可以根据name匹配对应的路由,然后query传参,
router.push({
name: 'OceanOrderAddOrEdit',
query: {
sexOrderId: row.id,
pageName: '海运出口订单维护2'
}
})
特别注意哦, 组件中 获取参数的时候是 route.params 而不是 router