vue项目中使用iframe引入了一个3d地图html页面,要求不要每次打开这个页面都重新加载。
项目框架本身设置了切换路由时会使用keep-alive缓存页面,但对iframe页面没有效果。
iframe页里的内容是一个独立的文件,并不属于vue页面结点的信息。iframe结点每一次渲染就相当于打开一个新的网页窗口,所以即使把结点保存下来,在渲染时iframe页还是刷新的。
参考网上的解决方案,最终决定通过以下方法处理:
初始就加载iframe结点,在切换时利用v-show来控制显示隐藏,使iframe的节点不被删除,以此来防止界面节点被重新更新。
路由设置时,属性component改为iframeComponent,懒加载组件;
path
:
''
,
component
:
Layout
,
hidden
:
true
,
redirect
:
'noredirect'
,
children
: [
path
:
'map'
,
iframeComponent
:
() =>
import
(
'@/views/map/index'
),
name
:
'Map'
,
meta
: {
title
:
'查看地图'
,
affix
:
true
}
在含router-view的主页面,初始化时,将含iframeComponent的路由信息都收集起来,声明并渲染component,此时v-show控制属性值为false;
created(){
const componentsArr = this.getComponentsArr();
componentsArr.forEach((item) => {
Vue.component(item.children[0].name, item.children[0].component);
this.componentsArr = componentsArr;
this.isOpenIframePage();
getComponentsArr() {
const router = this.$router;
const routes = router.options.routes;
const iframeArr = routes.filter(item=>{
if(item.children){
return item.children[0].iframeComponent;
return iframeArr.map(item=>{
if(item.children[0]){
const name = item.children[0].name || item.children[0].path.replace('/','');
item.children[0] = {
name: name,
path: item.children[0].path,
hasOpen: false,
meta: item.children[0].meta,
component: item.children[0].iframeComponent
return item;
监听$route,判断当前路由为iframe页面的时候,v-show控制属性值为true;否则为false;
watch: {
$route() {
this.isOpenIframePage();
isOpenIframePage() {
const target = this.componentsArr.find(item => {
return item.children[0].path === this.$route.path.replace('/','')
if (target) {
target.children[0].hasOpen = true;
if(this.$route.path==='/map'){
let frame = document.getElementById("mapView");
if(frame){
if(this.$route.query){
let landId = this.$route.query.landId? this.$route.query.landId : undefined;
let landCode = this.$route.query.landCode? this.$route.query.landCode : undefined;
let longitude = this.$route.query.longitude? this.$route.query.longitude : undefined;
let latitude = this.$route.query.latitude? this.$route.query.latitude : undefined;
frame.contentWindow.dingwei_point(landCode, longitude, latitude);
frame.contentWindow.landId = landId;
frame.contentWindow.landCode = landCode;
html模板部分:
<keep-alive :include="cachedViews">
<router-view :key="key"/>
</keep-alive>
<component
v-for="item in hasOpenComponentsArr"
:key="item.children[0].name"
:is="item.children[0].name"
v-show="($route.path.replace('/','')===item.children[0].path && item.children[0].hasOpen)"
</component>
粉丝