为什么react setState在useEffect内部不起作用?

时间:2020-04-03 05:54:31

标签: reactjs socket.io setstate use-effect

你好,我正在尝试使用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)};

但是,什么都没有记录。

有人知道我在这里想念的吗?还是做错了?

1 个答案:

答案 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);
   });
}, []);