Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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 socket.io-client在从服务器响应到特定房间(Python后端)后不重新呈现组件_Javascript_Python_Reactjs_Socket.io_Flask Socketio - Fatal编程技术网

Javascript React socket.io-client在从服务器响应到特定房间(Python后端)后不重新呈现组件

Javascript React socket.io-client在从服务器响应到特定房间(Python后端)后不重新呈现组件,javascript,python,reactjs,socket.io,flask-socketio,Javascript,Python,Reactjs,Socket.io,Flask Socketio,我有一个用Python编写的带有Flask SocketIO的服务器后端。我正在利用它的房间功能进行私人对话。在join room事件发生时,服务器启动以下功能,让前端知道向特定用户发送消息的位置: socketio.emit('room name response', {'roomName': room_name, 'recipient': recipient}, to=sid) 其中,sid是连接到插座时仅为用户创建的私人房间。然后我想在地图中保持此信息处于反应状态,如下所示: 函数聊天窗

我有一个用Python编写的带有Flask SocketIO的服务器后端。我正在利用它的房间功能进行私人对话。在join room事件发生时,服务器启动以下功能,让前端知道向特定用户发送消息的位置:

socketio.emit('room name response', {'roomName': room_name, 'recipient': recipient}, to=sid)
其中,
sid
是连接到插座时仅为用户创建的私人房间。然后我想在地图中保持此信息处于反应状态,如下所示:

函数聊天窗口({username,token}){
const[responses,setResponses]=useState([]);
const[roomsMap,setRoomsMap]=useState(newmap());
const[currentRoom,setCurrentRoom]=使用状态(“”);
const[messageValue,setMessageValue]=useState(“”);
var-socket=null;
useffect(()=>{
套接字=socketIOClient(端点);
});
useffect(()=>{
socket.on(“全局响应”,(数据)=>{
setResponses((响应)=>[…响应,数据];
});
socket.on(“房间名称响应”,(数据)=>{
log(`joined${data.roomName}与${data.recipient}`);
setCurrentRoom((currentRoom)=>data.roomName);
setRoomsMap((roomsMap)=>roomsMap.set(data.recipient,data.roomName));
});
return()=>socket.close();
}, []);
const sendMessage=()=>{
if(messageValue.length<1){
返回;
}
发出(“全局消息”{
用户名:用户名,
message:messageValue,
时间戳:Date.now(),
});
setMessageValue(“”);
};
const joinRoom=(收件人)=>{
socket.emit(“join”{
令牌:令牌,
用户名:用户名,
收件人:收件人,
});
//setCurrentRoom(()=>roomsMap.get(收件人));
};
const leaveRoom=(收件人)=>{
socket.emit(“离开”{
令牌:令牌,
用户名:用户名,
收件人:收件人,
});
const newRooms=roomsMap;
newRooms.delete(收件人);
log(`left room with${recipient}`);
forEach((val,key)=>console.log(`${val}:${key}`);
setRoomsMap(新房);
};
const checkUser=(userToCheck)=>{
if(userToCheck==用户名){
返回styles.chatFromUser;
}否则{
返回styles.chatToUser;
}
};
回报率(…);
}
导出默认聊天窗口;
遗憾的是,React不会对发出套接字的消息做出反应,即使它可以在开发人员工具的network选项卡中看到。
全局响应
工作正常。 当我将后端函数更改为:

socketio.emit('room name response', {'roomName': room_name, 'recipient': recipient})
React突然起到了预期的作用。我正在试图理解为什么会发生这种情况,特别是当浏览器似乎看到了如上所述的传入消息时,所以这很可能是我的错误编码或React/Javascript之类的东西


感谢您事先提供的帮助。

问题在于有时会多次创建套接字,因此,useEffect当前正在侦听的套接字不一定是房间中的套接字。所以我做了一个,全球插座来解决这个问题,整个事情现在都可以工作了