ReactJS + Socket.IO - 处理套接字连接的最佳方式

Pho*_*355 10 sockets node.js socket.io reactjs

我正在尝试使用 Node 和 Socket.IO 制作一个 ReactJS 实时应用程序,但是我很难找出在客户端处理我的套接字连接的最佳方法。

我有多个 React 组件,它们都需要来自服务器的一些信息,最好通过套接字连接实时获取。但是,在导入socket.io-client依赖项并在不同文件中建立与服务器的连接时,我获得了与服务器的多个连接,这似乎并不是最佳选择。

所以我想知道是否有更好的解决方案来共享多个组件之间的连接,而不必为每个组件创建一个新的连接。也许通过在主app.js文件中建立连接,然后将其传递给子组件以供以后使用。

网上有些地方建议使用context属性来传递套接字变量,但 React 自己的文档强烈反对使用 context

下面的代码只是一个例子,不是实际的代码,因为实际项目中不必要的代码比说明问题所需的要多得多。

foo.js

import React from 'react';
import io from 'socket.io-client';

const socket = io("http://localhost:3000");

class Foo extends React.Component {
    // ...
    componentDidMount() {
        socket.on("GetFooData", (data) => {
            this.setState({
                fooData: data
            });
        });
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

bar.js

import React from 'react';
import io from 'socket.io-client';

const socket = io("http://localhost:3000");

class Bar extends React.Component {
    // ...
    componentDidMount() {
        socket.on("GetBarData", (data) => {
            this.setState({
                barData: data
            });
        });
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

应用程序.js

import React from 'react';
import ReactDOM from 'react-dom';
import Foo from './foo';
import Bar from './bar';

const App = () => {
    return (
        <div className="container">
            <Foo />
            <Bar />
        </div>
    );
};

ReactDOM.render(
    <App />,
    document.getElementById("root")
);
Run Code Online (Sandbox Code Playgroud)

Ash*_*sim 19

您可以创建一个套接字连接,然后将其导出,如下所示,

import io from "socket.io-client";
let socket = io("http://localhost:8000/chat");
export default socket;
Run Code Online (Sandbox Code Playgroud)

然后在任何地方导入

import socket from "../../socket/socket";
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,伙计,我在这里度过了一天,像你的回答这样简单的事情对我帮助很大 (5认同)
  • 如果您已经设置了一个计数器,并且有 7-20 个以上的随机连接,您试图找出这些连接,并且通过组件或上下文设置了套接字连接,请删除这些连接并使用它,清除我所有的随机连接。确保你也有清理功能!例如: return () =&gt; socket.close() 谢谢 jsRook,帮了我很多忙。有时最好回到基础:) (2认同)