Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在React上使用套接字时如何防止重新渲染?_Javascript_Reactjs - Fatal编程技术网

Javascript 在React上使用套接字时如何防止重新渲染?

Javascript 在React上使用套接字时如何防止重新渲染?,javascript,reactjs,Javascript,Reactjs,我的代码有这个问题,它喜欢多次重新呈现并重新连接到服务器,我希望它能够在他们登录时连接,这意味着它必须使用我的“useAuth()”函数,该函数使用不同的上下文 有没有办法防止重新渲染,使其不会多次重新连接,而只连接一次 这是我的代码: import React,{useffect}来自“React”; 从“/AuthContext”导入{useAuth}; 从“socket.io客户端”导入{io}; const SocketContext=React.createContext({}); 导

我的代码有这个问题,它喜欢多次重新呈现并重新连接到服务器,我希望它能够在他们登录时连接,这意味着它必须使用我的“useAuth()”函数,该函数使用不同的上下文

有没有办法防止重新渲染,使其不会多次重新连接,而只连接一次

这是我的代码:

import React,{useffect}来自“React”;
从“/AuthContext”导入{useAuth};
从“socket.io客户端”导入{io};
const SocketContext=React.createContext({});
导出常量SocketProvider=({children})=>{
const{isAuthenticated,user}=useAuth();
useffect(()=>{
如果(未经验证){
const socket=io(“ws://localhost:3002”{
重新连接延迟最大值:10000,
认证:{
令牌:user.socketAuth,
},
});
socket.on(“连接错误”,(错误)=>{
if(err instanceof Error){
控制台日志(错误消息);
控制台日志(错误数据);
}
});
}
}, []);
返回{children};
};

没关系,我已经解决了这个问题,它正在按预期的方式工作。服务器没有接受连接,只是一直记录套接字的ID,而不让它连接

io.use(异步(套接字,下一个)=>{
const user=await user.findOne({socketAuth:socket.handshake.auth.token});
如果(!用户){
常量错误=新错误(“未经授权”);
err.data={消息:“未经授权,请稍后再试。”};
下一个(错误);
}
next();//添加新行以允许连接
});

您只是在初始渲染时调用useEffect,因此除非您以某种方式从父级重新安装SocketProvider,否则您描述的行为不应该发生。您可以在useEffect内部登录,检查是否多次调用该组件,以了解您的组件是否正在重新安装useEffect钩子中传递一个空的依赖项数组。