你好,我正在尝试使用React和Socket.io构建一个聊天应用程序。还有一部分,我从服务器向客户端发出“加入”事件,以使客户端知道他已成功加入会议室并发送会议室的聊天记录。客户端处理“加入”事件的方式如下:
useEffect(() => {
socket.on('joined', (roomx) => { setCurrentRoom(roomx); setMessages(roomx.messages)});
}, [currentRoom]);
我将第二个参数([currentRoom])传递给useEffect,因为如果不这样做,“ joined”将被调用4或5次。
我尝试在console.logging的setCurrentRoom回调中查看setCurrentRoom是否完全被调用,像这样:
setCurrentRoom(roomx, () => { console.log(currentRoom)};
但是,什么都没有记录。
有人知道我在这里想念的吗?还是做错了?
答案 0 :(得分:0)
implicit val reads: Reads[SectionProduct] = Json.reads[SectionProduct].preprocess {
case obj: JsObject =>
obj.as(
Reads
.at[Int](__ \ "vpid")
.map { vpid => obj + ("vpid" -> JsString(vpid.toString)) }
.orElse(Reads.pure(obj))
)
}
setCurrentRoom(roomx, () => { console.log(currentRoom)};
没有第二个参数作为回调,而不是setCurrentRoom
。这就是为什么什么都没有记录。
this.setState
第二个参数中不需要useEffect(() => {
socket.on('joined', (roomx) => { setCurrentRoom(roomx); setMessages(roomx.messages)});
}, [currentRoom]);
。 currentRoom
表示每次更改currentRoom时-从useEffect调用第一个参数。我想您只想调用一次socket.on。
这是一个例子
[currentRoom]
如果要卸载组件,则必须删除侦听器。
useEffect(() => {
socket.on('joined', (roomx) => {
setCurrentRoom(roomx);
setMessages(roomx.messages);
});
}, []);