前端路上那些坑——keep-alive

vue项目中切换页签如何保留当前正在创建/编辑的表单输入的内容呢?

一、可以使用vuex

结合组件中的导航守卫beforeRouteLeave

在导航守卫中将输入的数据存入vuex中

再切回页面时从vuex中读取数据进行回显

但是这样很麻烦诶~

从vuex中读取数据,按照每个字段回显

然后编辑的时候也需要做回显

需要严格保证事件的执行顺序:先初始化数据,再将编辑请求回来的数据进行回显赋值,然后vuex中的数据再来一遍

此外,还需要保证数据的响应式,否则debug的时候能找哭

比如,vuex中state存obj的时候在mutation中直接用state.obj={a: 1}

这样在组件中无法监听到这个obj的变化

正确的方法是:

在mutation中使用Vue.set(state.obj, 'a', 1)

二、使用keep-alive

当你尝试使用keep-alive当时候,你就会发现网上有铺天盖地的推荐这样用:

 

 

 亲测不行!!!

这样会出现什么问题呢?先描述一下我的使用过程:

1. 我从创建页切换到列表页不需要缓存创建页数据,于是在beforeRouteLeave中判断将创建页的keepAlive设置为false;

2. 我从创建页切换到非列表页需要缓存创建页的数据,于是在beforeRouteLeave中判断将创建页的keepAlive设置为true;

3. 为了保险起见,我在列表页的beforeRouteLeave中判断它要进入创建页了,我将创建页的keepAlive设置为false

看起来是不是很完美?没什么问题对不对?

奇怪的事情发生了:我一顿如下操作:

当我从创建页(以下称为A)的表单某个input中输入1

切换页签到非列表页(以下称为B)

再切换回A发现1还在,没毛病对不对?

接下来我从A返回列表页(以下称为C)

再切换回A发现1没了,也很正确的样子

然后,问题来了:

现在我在A页把输入的1改成2

再切换到B

再切换回A

发现居然还是1!!!

发现这说明之前的缓存并没有被清掉,具体原因网上有很多解释,就不赘述了

所以此法不通~

摆正姿势,再来:

 

 

 

 

 

 就这样~ok

 

posted @ 2020-09-24 19:10  风吹叶不飘  阅读(841)  评论(0编辑  收藏  举报