实现跨窗口通信

在 Vue 3 中,使用 window.open() 打开新窗口后,由于新窗口和原窗口是不同的上下文,无法直接通过 Vue Router 修改原窗口的路由,所以我们如何进行跨窗口的通信呢?

可以使用 postMessage 方法,postMessage 是一种安全的跨源通信机制,允许不同源的窗口之间进行通信。

在原窗口我们通过 window.open() 打开了一个新窗口,同时,添加一个 message 事件监听器来监听来自新窗口的消息,通过handleMessage 方法会监听到新窗口发送的消息。如果消息内容为 'updateRoute',则调用 router.push 修改路由,并关闭新窗口。

在新窗口我们可以写相关的逻辑,在逻辑写完之后使用 window.opener.postMessage 向原窗口发送消息,postMessage 的第一个参数是消息内容,第二个参数是目标窗口的源(origin),用于安全检查。

那我们还可以通过什么来修改原窗口的路由呢?可以通过window.opener,但仅适用于新窗口是由原窗口通过 window.open() 打开的情况

所以postMessage 方法更为通用,适用于更复杂的跨窗口通信场景,并且更安全。

使用 Broadcast Channel API也可以进行跨窗口通信

在发送页面进行如下代码操作:

     首先需要创建一个 Broadcast Channel,可以使用 new BroadcastChannel(channelName) 构造函数 channelName 是频道的名称,所有使用相同名称的页面都能收到彼此的消息。

在接收页面进行以下代码进行监听:

在接收消息的页面中,同样需要创建一个同名的广播频道,并通过 addEventListener 监听消息事件。

在页面关闭的时候要关闭频道:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容