使用 React 管理多个 websocket

Posted

技术标签:

【中文标题】使用 React 管理多个 websocket【英文标题】:Manage multiple websockets with React 【发布时间】:2021-02-27 11:34:24 【问题描述】:

我目前正在使用 JSON RPC 2.0 后端 API 开发基于 React.js 的 SPA。该 API 基于 websockets,需要跨多个 React.js 组件同时打开和管理多个 websocket 连接。

首先,我想使用 React Context API 管理这些套接字连接,并使用自定义提供程序组件保存连接状态并更新上下文和 HOC/Hook。

ReactDOM.render(
    <WebsocketProvider>
        <App />
    </WebsocketProvider>,
    document.getElementById('root')
);

...

export default withWebsocket(App);

这对于单个连接非常有效,但不适用于多个连接。像 Redux 这样的全球性商店似乎不适合存放套接字连接!

我的第二种方法是从 React 生命周期中完全移除对 websocket 连接的管理,并让 react 组件使用一种服务单例。

class MyComponent extends React.Component 

    componentDidMount () 
        const socket = SocketService.get(this.socketId);
        socket.addEventListener('message', () =>  this.setState( ... ) );
    

这种方法原则上是可行的,但对我来说,简单地使用具有唯一标识符的地图似乎很麻烦。

大多数建议建议使用 React Context API 或 Redux 中间件来共享 websocket 连接。但是如何管理跨组件的多个连接呢?有什么建议或进一步的想法吗?

【问题讨论】:

【参考方案1】:

我认为您可以使用以下方式轻松地将多个实例放入您的上下文中:

function WebsocketProvider( children : Props) 
  // some connection codes

  return <Context.Provider value=[instance1, instance2, ...]>children</Context.Provider>;


然后您甚至可以使用一些钩子,例如:useSocketInstance(i),它从上下文中读取连接并为您提供对套接字实例的正确访问权限。 实现可能是这样的:

const useSocketInstance = (i) => 
   const instances = useContext(YourContext);
   return instances(i);


【讨论】:

以上是关于使用 React 管理多个 websocket的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一个 React 组件中管理多个 setState 调用?

如何使用 socket.io、react native、nodejs 管理聊天应用程序的多个套接字连接

[react] 什么时候使用状态管理器?

react+redux状态管理实现排序 合并多个reducer文件

在 React Js 中管理多个 HTTP 请求操作

React js:在单页应用程序中呈现多个索引 html