使用的是vue-element-admin。

需求

项目需求是在点击左边侧边栏的时候判断如果是外部的页面之后,将此页面在右侧打开,每打开一个,tagview中也会相应加上,当切换这些tagview时,要保持每个页面切换前的状态,就是不重载。

在这里插入图片描述

尝试

在这里插入图片描述
新建了iframe.vue文件,里面套iframe标签,通过地址的参数不同,跳转不同的iframe页面,但是在做切换时,会导致iframe页面重载,利用了keep-alive 只是对非iframe页面作用,iframe页面没有作用。
因为keep-alive不是简单地隐藏的,它只会保留组件实例对象,但Dom已经没有了。所以你要让iframe不刷新,就必须让iframe隐藏,所以要把iframe与其它页面分开对待。

经过咨询别人和查资料,在路由配置中通过参数来判断该路由是否由iframe来展示,meta: { iframe: true }
然后在页面显示这里,通过判断 meta.iframe 来决定是显示 router-view 还是 iframe 页面。
在这里插入图片描述
在这里插入图片描述

问题

通过这种指向同一个iframe组件的方法测试之后iframe页面切换时依然会重载。在页面上查找元素时发现就是一个iframe在切换时会不断的销毁和重建,每次都是新的iframe导致会重载。这就找到了问题出现的原因。

方法

在点击侧边栏的时候去动态创建iframe标签,不用同一个组件,通过控制多个iframe的显示隐藏解决在页签之间切换的时候刷新重载的问题。这样就是每个都是独立的,互不影响。
在这里插入图片描述

点击左侧时,动态创建iframe标签
在这里插入图片描述
当然这样就会存在问题,点击多次左侧打开多个iframe,多个iframe就会堆到一起。这时需要根据判断地址栏路由和tagview中打开的选项visitedViews遍历子项比较判断即可。
大致方向是这样,踩了很多坑,下面可能还会有一些小问题,比如点击关闭tagview时需要去移除掉关闭项的iframe,不然也会出现一些问题。

这只是一种方法,有好的思路大家可以来分享。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐