Keep-Alive中通过component多次加载同样的动态组件无法保持状态的解决办法

Keep-Alive中通过component多次加载同样的动态组件无法保持状态的解决办法

Keep-Alive中通过component多次加载同样的动态组件无法保持状态的解决办法 | 软件开发服务商 (yidianhulian.com)icon-default.png?t=N7T8https://yidianhulian.com/?p=12263

问题描述

项目功能上有需要动态添加组件的需求,比如tab标签功能,动态添加标签,同时添加后的标签在切换时需要保存状态,自然而然想到了keep-alive,这就有了下面的代码:

Keep-Alive中通过component多次加载同样的动态组件无法保持状态的解决办法_第1张图片

tabPage 定义方式1:

通过components事先定义好所有会加载的组件:

Keep-Alive中通过component多次加载同样的动态组件无法保持状态的解决办法_第2张图片

tagPage 通过ref或computed的方式判断当前的标签的类型并返回:

这个时候keep-alive是工作的,但这里的问题是:

动态创建的组件有多个是同一个组件,比如APIAdd,

由于keep alive的缓存机制是通过组件名称来缓存的,同一个组件被打开多次的话其实显示的还是第一次打开的那个,这和我们实际的应用场景不符合,不能缓存界面状态(比如表单中输入的内容)

Keep-Alive中通过component多次加载同样的动态组件无法保持状态的解决办法_第3张图片

tabPage 定义方式2:

为了解决方式1中的同名组件只能加载一次的问题,需要同一个组件被加载多次,只是里面展示的内容不一样,所以tabPage通过defineAsyncComponent异步加载:

Keep-Alive中通过component多次加载同样的动态组件无法保持状态的解决办法_第4张图片

这里组件能加载成功,同名组件每次创建标签都会生成一个新的,但是这里的问题是:

没有起到keep-alive的效果,已经加载的组件,在切换时又重新创建了组件, 状态自然也没有得到保存,

Keep-Alive中通过component多次加载同样的动态组件无法保持状态的解决办法_第5张图片

解决办法:

为了解决同一个组件可以被动态加载多次,同时需要能keep-alive,解决的办法就是不用component,而是把所有动态添加的组件都各自放在一个keep-alive中,根据条件切换显示即可:

Keep-Alive中通过component多次加载同样的动态组件无法保持状态的解决办法_第6张图片

这样每个组件都可以加载自己的数据,并且可以keep alive保存状态:

Keep-Alive中通过component多次加载同样的动态组件无法保持状态的解决办法_第7张图片

你可能感兴趣的:(Keep-Alive,component)