keepAlive使用

用vue作后台管理项目,特别是有列表页、列表数据详情页、列表数据修改页功能的码友们,几乎都被vue前进后退都刷新的逻辑坑过,有时候须要保存组件状态,
要求 : vue

1.列表页进入详情页返回列表页时列表不能刷新,连页数、筛选条件等都不能变ide

2.列表页进列表数据编辑页若数据有改动返回列表页列表数据得刷新,但页数、筛选条件等都不能变 ui

3.非详情页、编辑页进入列表页时列表数据得刷新,页数、筛选条件等都所有重置this

总结一下就是‘这个列表页我想让它刷新,他就得刷新,不想让他刷,他就无变化component

那么是啥呢?对,是keep-alive组件,对,是它。router

但单纯的keep-alive是前进后退都不会刷新的,因此须要改造一下,让它乖乖听话。这个过程须要路由路由参数meta配合咱们。接口

1.在路由文件中为目标列表页设置meta参数,里面包含keepAlive和ifDoFresh字段路由

复制代码
{
path:'*',
name:'datalists',
component: resolve => require(['@/view/datalist'], resolve),
meta:{
keepAlive: true,
ifDoFresh:false
}
},get

复制代码it

2.在程序主入口main.vue中设置页面根据keepAlive字段判断是否使用keep-alive组件。

复制代码
<div class="main">
<keep-alive>
<router-view v-if="$route.meta.keepAlive"/>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"/>
</div>

复制代码
3.在目标列表页的beforeRouteEnter方法中判断页面进入方式(详情页,编辑页或其余方式),根据需求将路由参数的ifDoFresh字段设为true/false,

在页面的activated(开启了 keepAlive: true的页面在第二次进入时是没法触发mounted发法的)方法中根据ifDoFresh字段判断是否刷新页面。

复制代码beforeRouteEnter (to, from, next) {if(from.name!='详情页'&&from.name!='编辑页'){ to.meta.ifDoFresh = true; } next(); }, activated(){ //开启了keepAlive:true后再次进入,之前的搜索条件和页数都不会变,不管什么状况都调用一下获取数据的接口,这样就能获得当前搜索条件和页数的最新数据if(this.$route.meta.ifDoFresh){//重置ifDoFreshthis.$route.meta.ifDoFresh = false;  //获取列表数据方法第一参数为是否重置搜索条件和页数this.getData(true);}else{this.getData();}}完结!

相关文章
相关标签/搜索