这两天工作中遇到一个这样的需求,切换tab标签时,要求对应的tab页面不刷新,但是项目中加入了一部分含有iframe的页面,在切换路由的过程中,如果使用keep-alive是达不到缓存ifram嵌套的页面效果的。
vue中的keep-alive
1>.原理:vue 的缓存机制并
不是直接存储 DOM 结构
,而是将 DOM 节点抽象成了一个个VNode节点
。因此,Vue 的keep-alive 缓存也是基于 VNode节点 而不是直接存储 DOM 节点
。在需要渲染的时候从Vnode渲染到真实DOM上。
2>.参数:Keep-alive 组件提供了
include 和 exclude
两个属性,允许组件有条件
的进行缓存。
include: 字符串或正则表达式。只有匹配
的组件会被缓存。
exclude: 字符串或正则表达式。任何匹配
的组件都不会被缓存。
3>.iframe中keep-alive机制失效原因:
iframe页里的内容并不属于节点的信息
,所以使用keep-alive依然会重新渲染iframe内的内容。而且iframe每一次渲染就相当于打开一个新的网页窗口,即使把节点保存下来,在渲染时iframe页还是刷新的
。
route-view
节点上动些手脚。v-show来控制显示隐藏
,使iframe的节点不被删除,以此来防止界面节点被重新更新,从而达到保存iframe节点数据的效果。综上所述,主要思路就是利用v-show去控制对应tab的iframe显示隐藏,使iframe的节点不被删除,以此来防止界面节点被重新更新,从而达到iframe页面的缓存效果。
{path: '',component: Layout,redirect: 'indexNew1',hidden: true,children: [{path: 'indexNew1',component: (resolve) => require(['@/views/indexNew1'], resolve),meta: { title: ''}},]},// 在这里需要找到Layout文件中对应的
-根据上面的路由配置,找到了对应的layout组件中的router-view的引用,即appMain.vue页面
// 这里加载的就是正常的vue页面 // 针对iframe嵌套的页面需要将封装的iframe组件引入,因为是多个嵌套的页面,所以这里需要循环生成 //这里的tabSetList数组就是你点击某菜单对应的此菜单信息的iframe相关属性//因为tab有删除功能,所以不能用下标做key值
// 这里只是放了部分代码 具体逻辑根据对应的需求添加即可
因为tab一版包括删除功能,所以在循环iframe组件时对应的key值不能用数组下标,取一个唯一值即可,这里我取的是id
下一篇:【springboot】单元测试