window.open父子页面自定义事件通信

我们在vue项目中,使用vue-router跳转的时候,在某些需求中可以使用router.resolve({path: '/test'}),返回一个返回一个路由地址的规范化版本,其中包含href属性,那我们就可以使用window.open()来打开一个新的浏览器页签跳转至某个vue页面。这篇就是要说一下之间的通信。
例如我从A.vue页面通过window.open跳转至B.vue页面,那么我们称A页面为父页面,B页面为子页面。
我们可以在子页面中通过window.opener拿到父页面的window。当然我们可以使用postMessage进行通信,之前写过一篇关于postMessage的文章(iframe嵌入页面跨域通信),但是这篇不讲postMessage,说一下通过自定义事件的方式来进行父子页面的传值通信。

1. 父传子

1.1 父页面向子页面自定义事件发送数据:

javascript 复制代码
const detail = { source: 'Main' }
window.dispatchEvent(new CustomEvent('mainInfo', { detail }))

1.2 子页面监听父页面事件接受数据:

javascript 复制代码
// 监听父页面自定义事件
window.opener.addEventListener('mainInfo', mainInfo)

function mainInfo(e: any) {
  console.log(e.detail, '接受父页面的数据-->>')
}

2. 子传父

2.1 子页面向父页面自定义事件发送数据:

javascript 复制代码
const detail = { source: 'Test' }
window.opener.dispatchEvent(new CustomEvent('testInfo', { detail }))

2.2 父页面监听子页面事件接受数据:

javascript 复制代码
// 监听子页面自定义事件
window.addEventListener('testInfo', testInfo)

function testInfo(e: any) {
  console.log(e.detail, '接受子页面数据--->>')
}

3. demo

main.vue(父页面)

html 复制代码
<template>
  <div class="main">
    <button @click="toTest">走</button>
    <button @click="sendData">发送数据</button>
  </div>
</template>
<script setup lang="ts">
import { useRouter } from 'vue-router'

const router = useRouter()

const toTest = () => {
  let testUrl = router.resolve({ path: '/test' })
  window.open(testUrl.href, '_blank')
}

// 监听子页面自定义事件
window.addEventListener('testInfo', testInfo)

function testInfo(e: any) {
  console.log(e.detail, '接受子页面数据--->>')
}

// 向子页面发送自定义事件
const sendData = () => {
  const detail = { source: 'Main' }
  window.dispatchEvent(new CustomEvent('mainInfo', { detail }))
}
</script>
<style scoped>
.main {
  width: 100%;
  height: 100%;
}
</style>

test.vue (子页面)

html 复制代码
<template>
  <div class="test">
    <h1>Test</h1>
    <button @click="sendInfo">发送opener</button>
  </div>
</template>
<script setup lang="ts">

// 像父页面发送数据
const sendInfo = () => {
  const detail = { source: 'Test' }
  window.opener.dispatchEvent(new CustomEvent('testInfo', { detail }))
}

// 监听父页面自定义事件
window.opener.addEventListener('mainInfo', mainInfo)

function mainInfo(e: any) {
  console.log(e.detail, '接受父页面的数据-->>')
}
</script>
<style scoped>
.test {
  width: 100%;
  height: 100%;
}
</style>
相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
A黄俊辉A2 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁2 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄2 天前
JavaScript 隐式全局变量解析
javascript
honkun62 天前
vue 表格组件 vxe-table 配置 ajax 请求自动加载数据与表单查询
vue.js·vxe-table
kybs19912 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net