当前位置: 首页 > news >正文

同一个项目两个页签之间通信之 BroadcastChannel

一、什么是Broadcast Channel

MDN 中解释如下:
允许同源的不同浏览器窗口,Tab 页,frame 或者 iframe 下的不同文档之间相互通信。通过触发一个 message 事件,消息可以广播到所有监听了该频道的 BroadcastChannel 对象。

二、Broadcast Channel 与 window.postMessage区别

BroadcastChannel 只能用于同源的页面之间进行通信,而window.postMessage 却可以用于任何的页面之间,所以,跨域的情况,需要使用 window.postMessage 来处理。

三、如何使用

1、创建实例
const channel = new BroadcastChannel('test');
2、监听消息
// 1、使用addEventListener监听
function onMessage(event) {console.log(event)      
}
channel.addEventListener('message', onMessage);// 2、直接调用实例上的 onmessage
channel.onmessage = function(event) {console.log('event:', event.data);
}; 
3、监听错误消息
// 1、使用addEventListener监听
function onMessageError(event) {console.log(event)      
}
channel.addEventListener('onmessageerror', onMessageError);// 2、直接调用实例上的 onmessageerror 
channel.onmessageerror = function(event) {console.log('error:', event);
}; 
4、发送消息
channel.postMessage({type:'test'});
5、关闭广播监听
// 1、如果上边监听消息是通过实例上调用onmessage
channel.close();// 2、如果上边监听消息通过addEventListener
function onMessage(event) {console.log(event)      
}
channel.removeEventListener('message', onMessage)

四、封装通用方法

比如项目中封装统一的 utils

const channel = new BroadcastChannel('test');
// 发送消息
export function postMessage(message: object) {console.log(channel, 'channel');channel.postMessage(message);
}// 监听消息
export function listenMessage(callback) {function onMessage(event) {callback && callback(event);}channel.addEventListener('message', onMessage);return () => {channel.removeEventListener('message', onMessage)}
}
1、在 react 项目中监听消息
import React, { useEffect, useState } from 'react'
import { listenMessage } from './utils'export default function Home() {const [age, setAge] = useState('10');useEffect(() => {function getMessage(e) {const {data} = e;setAge(data?.data);}const channel = listenMessage(getMessage);// 清除副作用return channel;}, [])return (<div><div>{age}</div></div>);
}
2、在 react 项目中发送消息
import { postMessage } from './utils';
function App() {function hanldePostMessage() {postMessage({ type: 'update', data: '20' })}return (<div><div onClick={hanldePostMessage}>点击发送消息</div></div>);
}export default App;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ANN(Approximate Nearest Neighbor)搜索和索引库到底是什么?
  • 为什么knife4j报错,401,404
  • JavaEE 从入门到精通(一) ~ Maven
  • 使用海外服务器解决docke-pull镜像失败的网络问题
  • git 合并多次提交
  • 基于主从Reactor模式的高性能服务器
  • 【视频讲解】Python灰色关联度分析直播带货效用、神经退行性疾病数据
  • 数字**笔试题--链表翻转与list排序笔试题
  • Day 21
  • 智慧农场数字港系统设计与实现
  • fastDDS-gen编译
  • 生成订单幂等性(防止订单重复提交)
  • 职场上,不想受气,就要气场强大,以下三招见效
  • Java哈希算法
  • 【RTOS面试题】ISR中可以使用互斥锁和信号量吗?
  • 时间复杂度分析经典问题——最大子序列和
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【EOS】Cleos基础
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Javascript基础之Array数组API
  • js操作时间(持续更新)
  • k个最大的数及变种小结
  • node.js
  • PAT A1120
  • php中curl和soap方式请求服务超时问题
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • springMvc学习笔记(2)
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • zookeeper系列(七)实战分布式命名服务
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 将回调地狱按在地上摩擦的Promise
  • 全栈开发——Linux
  • 使用 @font-face
  • -- 数据结构 顺序表 --Java
  • 在Docker Swarm上部署Apache Storm:第1部分
  • HanLP分词命名实体提取详解
  • Prometheus VS InfluxDB
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (Note)C++中的继承方式
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (五)activiti-modeler 编辑器初步优化
  • (转载)hibernate缓存
  • .NET Core引入性能分析引导优化
  • .NET 依赖注入和配置系统
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .stream().map与.stream().flatMap的使用
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • :not(:first-child)和:not(:last-child)的用法
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @ohos.systemParameterEnhance系统参数接口调用:控制设备硬件(执行shell命令方式)