【iframe】基于VUE项目,父子页面互传参数

写在前面的话:

        因为业务需求,现有A、B两个项目,需在A项目中的parent页面中,以iframe的形式,嵌入B项目的child页面。且两者需要互发消息,即互相传参。故有此文。

        另:如果条件允许,建议以MQTT的形式实现上述逻辑,详见

【MQTT】VUE集成MQTT_Francis X的博客-CSDN博客

--泰山不让土壤,故能成其大


目录

一、效果演示

二、工具类准备

三、父页面代码

四、子页面代码


一、效果演示

二、工具类准备

​

/*******************************************************************************
 * 系统工具类
 *
 * 说明:该工具类,当前已集成如下方法:
 *    1、iframe:发送消息
 *    2、iframe:监听消息
 *
 * 若要查阅相关工具类,建议先折叠方法内部代码
 *
 * @author Francis
 * @since 2022-10-14 18:46
 * @version v1.0
 *******************************************************************************/
/**
 * iframe 跨页面传参:发送消息
 *
 * @param msg 必须是字符串,若为对象,需 stringify
 * @param type 1:父=>子、2:子=>父
 * @param iframeEle 当type为1时需要,获取方式: document.getElementById("iframe_id")
 */
function sendMessage(msg, type, iframeEle) {
  if (type === 1) {
    // 父 => 子
    iframeEle.contentWindow.postMessage(msg, "*");
  } else if (type === 2) {
    // 子 => 父
    window.parent.postMessage(msg, "*");
  }
}

/**
 * 绑定事件监听
 *    主要用于 iframe 父、子页面,接收消息用
 *    【暂时弃用】会多次被调用
 *
 * @param element
 * @param eventName
 * @param eventHandle
 */
function bindEvent(element, eventName, eventHandle) {
  if (element.addEventListener) {
    element.addEventListener(eventName, eventHandle, false);
  } else if (element.attachEvent) {
    element.attachEvent('on' + eventName, eventHandle);
  }
}

// 输出方法
export {
  sendMessage,
  bindEvent
}

[点击并拖拽以移动]
​

三、父页面代码

<template>
  <div class="page-container pageBox">
    <button @click="handleSendMsg">点此发送消息给child页面</button>
    <iframe id="child" style="width: 97%; height: 99%;" :src="src"/>
  </div>
</template>

<script>
  import * as sysUtils from "@/utils/sysUtils";
  import qs from 'qs';

  export default {
    data() {
      return {
        // 引用的子页面的访问路径
        src: "http://127.0.0.1:30013/#/child",
      };
    },
    methods: {

      /**
       * 连接初始化
       */
      handleConnect() {
        let _this = this;
        window.onmessage = function (event) {
          _this.handleEvent(event.data);
        }
      },

      /**
       * 处理回调
       *
       * @param data 子页面传过来的参数
       */
      handleEvent(data) {
        console.log("收到了子页面的消息:", data)
      },

      /**
       * 发送消息
       */
      handleSendMsg() {
        let param = "儿砸,我是你爹";

        sysUtils.sendMessage(param, 1, document.getElementById("child"));
      }
    },
    mounted() {
      this.handleConnect();
    }
  };
</script>

四、子页面代码

<template>
  <div>
    <p>这是child的页面</p>
    <button @click="handleSendMsg">点此发送消息给parent页面</button>
  </div>
</template>

<script>
  import * as sysUtils from "@/utils/sysUtils";
  import qs from 'qs';

  export default {
    data() {
      return {};
    },
    created() {
      this.handleConnect();
    },
    methods: {

      /**
       * 连接初始化
       */
      handleConnect() {
        // 绑定监听事件
        let _this = this;
        window.onmessage = function (event) {
          _this.handleCallback(event.data);
        }
      },

      /**
       * 处理回调
       *
       * @param data 父页面传过来的参数
       */
      async handleCallback(data) {
        console.log("收到了父页面的消息:", data)
      },

      /**
       * 发送消息
       */
      handleSendMsg() {
        let param = "我是儿砸,这是我发来的消息";

        sysUtils.sendMessage(param, 2);
      }

    },
    mounted() {}
  };
</script>
Vue 项目中,当我们使用 Vue Router 创建了带有路由参数页面,并将项目打包后,如果我们在页面刷新时发现路由参数消失了。这是因为在打包后的项目中,Vue Router 将路由参数创建为前端路由,在刷新页面时,浏览器会向服务器发送请求获取页面,而服务器只返回打包后的静态文件,没有保存路由参数的信息。 为了解决这个问题,我们可以使用一些方法来保存并恢复路由参数。一种常见的方法是使用服务端渲染 (SSR)。通过 SSR,我们可以在服务器端将路由参数一同传递给浏览器,以便在页面刷新时能够恢复参数。但是,SSR 需要特殊的设置和服务器支持,并且会增加项目的复杂性和开发难度。 另一种方法是使用浏览器的本地存储机制,如 localStorage 或 sessionStorage。在页面加载时,我们可以将路由参数存储在本地存储中,然后在页面刷新后,通过读取本地存储中的参数来恢复。这种方法相对简单,但需要我们手动管理本地存储的数据,以确保数据的正确性和安全性。 除了以上两种方法,还可以考虑使用 URL 查询参数来保存路由参数。在页面加载时,我们可以通过读取 URL 查询参数来获取路由参数,并在刷新页面时,将参数添加到 URL 中以便浏览器重新获取。这个方法相对简单,但会在 URL 上暴露参数,可能对用户体验和安全性产生影响,需要谨慎使用。 综上所述,当 Vue 项目打包后,在页面刷新时路由参数会消失,我们可以考虑使用 SSR、浏览器本地存储或 URL 查询参数来保存和恢复路由参数。根据项目的需求和实际情况,选择最合适的方法来解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值