功能逻辑
HomePage ——> OrderList ——> OrderDetail
1、首页跳转的订单列表页,列表页刷新并请求数据;
2、列表页跳转到详情页,再返回列表页不刷新页面。
一、设置页面缓存
如果想要保住页面不刷新,首先需要设置路由管理。这里需求是OrderList页面不刷新,那么在 router.js 设置如下:
{
name: 'HomePage',
path: '/HomePage',
component: () => import('./page/HomePage.vue')
},
{
name: 'OrderList',
path: '/OrderList',
component: () => import('./page/OrderList.vue'),
meta: {
keepAlive: true
}
},
{
name: 'OrderDetail',
path: '/OrderDetail',
component: () => import('./page/OrderDetail.vue')
}
meta: { keepAlive: true} 设置后页面保持缓存,无论怎么访问均显示第一次缓存的内容。
二、设置页面跳转回调方法
这里回调主要是控制页面刷新的行为,所以只要在OrderList页面里处理这方面的逻辑。介绍两个方法:
1、beforeRouteLeave:页面跳转/返回前的回调方法,可以在离开当前页面之前做自定义的处理;
2、activated:页面激活时的回调方法,无论是返回还是跳转到此页面都会触发。
坑在这里
一开始在OrderList设置了跳转回调,如下:
beforeRouteLeave(to, from, next) {
if (to.name == "OrderDetail") {
from.meta.keepAlive = true;
} else {
from.meta.keepAlive = false;
}
next();
}
逻辑上在跳转到OrderDetail前设置OrderList保持缓存为true,返回到HomePage前设置OrderList保持缓存为false。理论上没有问题,但是实际测试时缓存并没有保存,从OrderDetail返回以后数据一片空白。可以知道这样缓存机制在目前的VUE版本是实现不了的。
解决方案
在上面动态设置缓存状态行不通的情况下,只能自定义字段来判断一下OrderList页面是否需要刷新数据。前提就是默认OrderList页面是有缓存的,就是上面在 router.js 中的设置。
自定义后的OrderList代码如下:
data() {
return {
needRefresh: true //判断页面是否需要刷新
};
},
beforeRouteLeave(to, from, next) {
if (to.name == "OrderDetail") {
this.needRefresh = false;
} else {
this.needRefresh = true;
}
next();
},
activated() {
if (this.needRefresh) {
this.getOrderList();
}
},
逻辑很简单,加个needRefresh标识,在进入/回到不同页面时设置变量值,在每次页面唤醒activated回调时判断是否需要刷新,根据需要进行处理即可。