在SharedWorker中父子组件接收消息

问题描述 投票:0回答:1

我使用这个脚本创建了一个sharedWorker

// sharedWorker.js
importScripts('https://cdn.socket.io/4.3.1/socket.io.min.js');
let socket
let browserInstances = []
let counter = 0

onconnect = function(e) {
  const port = e.ports[0]
  browserInstances.push(port)


  if (!socket) {
    socket = io('socket-url');

    socket.on('message', (message) => {
      const msg = JSON.parse(message)
      browserInstances.map(instance => {
        instance.postMessage({type: msg.type, data: msg.data});
      });
    });
  }

}

我从套接字接收两种类型的消息 一个是 {type: 'notification', data: '12345'} 另一个是 {type: 'event', data: '12345'}

现在有两个监听器,一个是我的主 App.tsx 组件,另一个是我的子组件。

这是我的 App.tsx 监听器

worker.port.onmessage = (event: any) => {
            console.log(event.data)
            if (event.data.type === 'notification') {
                console.log('Notification received:', event.data.data);
                // Handle notification logic here
              }
              // Do not consume the message, let it propagate to other components
              return true;
          }

这是我的 childComponent.tsx 监听器

worker.port.onmessage = (event: any) => {
        console.log(event)
        if (event.data.type === 'event') {
          console.log('Event received:', event.data.data);
          // Handle event logic here
        }      
      }

问题是它仅在 App.tsx 组件中接收消息,消息不会传递到 childComponent.tsx,但是当我删除 App.tsx 侦听器时,它会传递到 childComponent。如何根据数据类型将消息传递给App和childComponent?

javascript reactjs web-worker shared-worker
1个回答
0
投票

worker.port.onmessage = ___
分配给
onmessage
属性,覆盖 之前的任何值(从而删除以相同方式设置的任何先前事件侦听器)。相反,请使用
worker.port.addEventListener("message", ___);
,这样您就可以为该事件拥有多个侦听器。

© www.soinside.com 2019 - 2024. All rights reserved.