iframe嵌套vue,iframe替代方案

  iframe嵌套vue,iframe替代方案

  本文主要介绍一个封装了iframe的vue组件的开发,帮助大家更好的理解和学习使用vue框架。感兴趣的朋友可以了解一下。

  一.部件介绍

  二。组件的内部结构和逻辑

  1.代码组织结构2。地图组件3。iframe接口

  四。外部接口

  动词(verb的缩写)经营成果六。摘要

  VUE的基本单位,我想应该是组件。用VUE开发前端项目,就是一个一个开发组件,然后像搭积木一样把项目搭建起来。组件包含在页面或更大的组件中。在这里,组件和页面之间的界限似乎并不明显。事实上,对于单页应用程序,只有一个页面。

  组件的优点,第一,可以加强重用;二是可以封装特定的功能,有利于调用;第三,由于职责明确,组件内聚度高,组件间耦合度低,有利于系统功能的优化、扩展和维护。好处很多。

  组件开发,主要由两部分组成:

  1.组件的内部逻辑

  2.外部接口

  由于我在过去两天制作的组件包含一个iframe,所以仍然有一些工作内容:

  3.iframe接口

  

目录

  这是一个地图插件。功能是显示地图,接受外部命令,加载图层,绘制图形等相关操作。该地图由arcgis for js实现。由于我们过去开发的项目,有一些地图操作的积累,但是没有前后分离,没有采用VUE或者REACT,还是传统的网页。因为时间紧,又想直接重用之前的成果,所以考虑用iframe加载地图页面,封装在VUE组件中,组件与外部命令接口,并在iframe中与地图页面交互。

  

一、组件介绍

  

二、组件内部结构及逻辑

  

1、代码组织结构

  Map.vue

  模板

  div class=地图容器

  !-拿着地图页-

  iframe:src= src ref= iframe @ load= iframe load /iframe

  /div

  /模板

  !-添加“scoped”属性以将CSS仅限制到此组件-

  style scoped=“scoped”。映射-容器iframe{

  宽度:100%;

  身高:100%;

  边框:无;

  }

  /风格

  脚本

  “导入自”中有路径信息././vue.config//。

  设iframeWin=null//私有变量

  导出默认值{

  道具:[size],//纯测试,没用,对应map ID= map ref= map size= 100 /map

  data() {

  返回{

  Src: ,//映射页面地址

  IsLoaded: false,//地图页面加载了吗?

  IMap: null,//地图页面为外部访问而公开的对象。

  Require:null//ArcGIS的require函数,用于引用自定义插件。我们以前写过很多自定义地图插件。

  }

  },

  已创建(){

  this . src=config . public path map . html

  },

  已安装(){

  //侦听iframe消息

  window . addevent listener( message ,this.handleMessage)

  iframeWin=this。$refs.iframe.contentWindow

  },

  方法:{

  iframeLoad() {

  this.isLoaded=true

  window.console.log(“地图准备就绪”)

  },

  异步消息(){//从iframe接收消息

  this . require=iframewin . require;

  this . IMAP=iframewin . IMAP;

  },

  负载层(节点、服务器){

  this.iMap.layerHandler.load(节点、服务器);

  },

  isReady(){

  返回this.isLoaded

  }

  }

  }

  /脚本

  关于组件的结构,例如

  导出默认值{

  props中的属性://标记

  Data() {//公共变量

  },

  加载时创建了(){//吗?

  },

  Mounted() {//当加载完成时

  },

  方法:{//公共方法

  }

  }

  出口代表这是外部的。所以里面的属性、变量和方法都可以从外部访问。如果要私有,应该在导出之外定义。如本例所示:

  这么简单的介绍在网上是找不到的。Vue的中文网站陈旧、碎片化,对初学者极其不友好,增加了学习成本。

  

2、地图组件

  组件Map.vue如何与内部的iframe通信?

  通过系统消息直接访问iframe的对象。直接访问iframe中的对象有一个前提,就是不能跨域。

  iframe托管的map.html地图页面

  !DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01//EN http://www .w3。org/TR/HTML 4/strict。 DTD

  超文本标记语言

  头

  .

  /头

  身体

  div id=map/div

  .

  /div

  /body

  /html

  脚本src= http://192。168 .0 .200/pubzy 211/ArcGIS _ js _ API/3.19/init。js /脚本

  脚本类型=文本/javascript

  var iMap={ };//外部引用接口

  要求([

  esri/config ,

  esri/map ,

  ESRI/几何/范围,

  esri/SpatialReference ,

   layerlib/LtLayer ,

  dojo/dom ,

   dojo/_base/array ,

  道场/解析器,

  dojo/domReady!

  ],函数(

  esriConfig,

  地图,

  程度,

  空间参考,

  LtLayer,

  多姆,

  arrayUtils,

  句法分析程序

  ) {

  //地图

  定义变量地图=.

  /* 外部接口*/

  iMap={

  地图:地图,

  传说:传说,

  家:家,

  tipDialog: tipDialog,

  切换:切换,

  概览地图:概览地图

  };

  iMap.drawHandler=.

  iMap.layerHandler=.

  iMap.centerAt=.

  iMap.clear=.

  IMAP。恢复检查=.

  //向父某视频剪辑软件页面发送加载完毕信号

  window.parent.postMessage({

  cmd: mapIsReady ,

  参数:{

  成功:真的,

  数据:真实

  }

  }, *);

  /*结束外部接口*/

  });

  /脚本

  地图组件Map.vue对应内联框架部分,详见一.2中的代码

  导出默认值{。

  已安装(){

  //监听内联框架的消息

  窗户。addevent侦听器( message ,this.handleMessage)

  //获得内联框架的窗户对象

  iframeWin=this .$refs.iframe.contentWindow

  },

  方法:{

  iframeLoad() {

  this.isLoaded=true

  window.console.log("地图准备就绪")

  },

  异步handleMessage() {//接收来自内联框架的消息

  这个。require=iframewin。要求;

  这个。IMAP=iframewin。IMAP

  },

  负载层(节点、服务器){

  //加载图层

  this.iMap.layerHandler.load(节点、服务器);

  }

  }

  }

  

三、iframe接口

  Map.vue是一个组件,它要跟它所在的组件或页面进行通信。

  现在,Map.vue放在了一个容器页面Home.vue(即测试页面)里,里面还有一个命令组件Layer.vue。点击命令组件里的按钮,地图要做出相应的响应。其中的原理如下:

  命令组件的按钮点击后,发射信息到容器页面,然后容器页面调用地图组件的方法。

  测试页面Home.vue

  模板

  div id=app1

  div id=地图容器

  差异地图组件/div

  Map id= Map ref= Map size= 100 /Map

  /div

  div id=图层-容器

  差异其他组件/div

  Layer @ load Layer= load Layer @ loadCloud= loadCloud @ clear= clear map /Layer

  /div

  /div

  /模板

  脚本

  导入地图自./components/Map.vue

  导入图层自./components/Layer.vue

  导出默认值{

  名称:"应用程序",

  组件:{

  地图,

  层

  },

  方法:{

  负载层(节点,服务器){//加载图层

  让地图=这个. refs.map

  map.loadLayer(节点、服务器);

  },

  装载云(数据){//加载卫星云图

  让地图=这个. refs.map

  map.require([drawlib/Cloud],function (Cloud) {

  设iMap=map.iMap

  设cloudId= cloud

  让云=新云(IMAP。地图);

  iMap.drawHandler.push(cloudId,cloud);

  cloud.draw(数据,cloudId);

  });

  },

  clearMap(){//清除

  让地图=这个. refs.map

  地图。IMAP。clear();

  }

  }

  }

  /脚本

  风格。

  /风格

  命令组件Layer.vue

  模板

  div class=层容器

  button @click=loadLayer 加载图层/按钮

  button @click=loadCloud 卫星云图/按钮

  button @click=clear 清除/按钮

  /div

  /模板

  脚本

  导出默认值{

  方法:{

  loadLayer() {

  让节点=.

  让服务器=.

  这个emit(loadLayer ),节点,服务器)

  },

  loadCloud(){

  让数据=.

  这个. emit(loadCloud ,data);

  },

  clear(){

  这个. emit( clear );

  }

  },

  }

  /脚本

  style scoped="scoped "。

  /风格

  注意命令组件发射消息中指定的方法,在容器页面中都有相关的属性与之对应:

  命令组件

  loadCloud(){

  让数据=.

  这个. emit(loadCloud ,data);

  },

  容器页面

  Layer @ load Layer= load Layer @ load cloud= load cloud @ clear= clear map /Layer

  

四、外部接口

  

五、运行结果

  其他组件必须通过容器页面与地图组件交互,其他组件与地图组件没有直接交互。这其实是一种命令模式。优点是其他组件与map组件解耦,它们没有耦合在一起,这意味着它们互不影响。这有利于地图组件本身的扩展和优化。如果有缺点,所有的东西都要通过容器页面转发,容器页面的代码可能是多余的。有些方法简直就是传声筒,给人一种重复写作的感觉,意义不大。

  以上是开发一个封装iframe的vue组件的详细内容。更多关于封装iframe的vue组件的信息,请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: