我在react组件中使用socket.io-client。这是大多数教程建议的方法:
import openSocket from 'socket.io-client';
const socket = openSocket('http://localhost:8000');
这工作得很好(我可以在我的函数/生命周期钩子中使用socket.on和socket.emit)。
但是这样声明openSocket会导致连接请求(每25秒一次),即使组件没有挂载。这给了我一个错误(当我使用npm start
没有后端)ERR_CONNECTION_REFUSED
在控制台。
我找到了一个折中的解决办法
componentWillUnmount(){
socket.disconnect();
}
这样做的问题是,它只在我挂载和卸载组件后工作,如果我只是upen另一个路由器,如主页,例如,连接仍然运行。
问题:最好的处理方法是什么?我应该在哪里申报const socket = openSocket('http://localhost:8000');
谢谢,对不起我的英语。
3条答案
按热度按时间z31licg01#
等你找到了
代码在组件加载时运行,这通常意味着页面已加载。您应该仅在主组件(或相关组件)已安装时打开套接字,使用
componentDidMount()
,然后在组件卸载时断开/关闭,使用componentWillUnmount()
。其次,默认的import不应该被称为
openSocket
。默认的import是一个让你创建一个socket连接但不打开它的函数。打开连接是一个单独的调用 * 在 * 你创建socket之后。你应该这样称呼它:从“socket.io-client”导入io
综上所述,你可以尝试这样做:
sczxawaw2#
我认为你更喜欢在你真正需要的时候创建连接。所以,也许是在组件将要或已经挂载的时候。然后在你不再需要它的时候处理它。
哪个组件?我想应该是依赖于那个连接的最顶层的组件。
也许可以给予this,看看从容器组件连接是否有意义
zxlwwiss3#
另一种方法是使用React函数组件和useEffect钩子,以确保您仅在需要时连接,如www.example.com文档中所述socket.io:https://socket.io/how-to/use-with-react