usestate似乎没有与插座io一起使用

发布于 2025-01-19 21:48:24 字数 1928 浏览 3 评论 0原文

我正在使用 socket.io 制作消息功能。 当我发送/接收消息时,我想更改 newMsgNO 的状态,但它似乎不起作用。 在下面的第二个 useEffect 中,第一个 console.log 始终显示 newMsgNO: 0 的初始状态,而第二个 console.log< /code> 每当它们进来时都会很好地显示 newMessages.current 的值。

这是我尝试的内容之一。在下面的 testMessage 中,我尝试更改状态,并使用新消息再次呈现组件。但newMsgNO的状态也是0。我不应该这样做,因为这只在我发送消息时才有效。我应该在 socket.on("new message", ...) 的代码中工作。

如何更改 socket.on("new message", ...)newMsgNO 的状态?


...

 const newMessages = useRef([
    {
      userImg: "",
      userName: "",
      talkContent: "",
      talkTime: "",
      isContinuous: false,
    },
  ]);

  const [newMsgNO, countNewMsg] = useState(0);

  const testReceiveM = {
    userImg: "",
    userName: "ab",
    talkContent: "hello my name is...",
    talkTime: "22.03.04.12:22",
    isContinuous: false,
  };

  const testMessage = () => {
    socket.emit("send message", { roomId, msg: testReceiveM });
  };

  useEffect(() => {
    socket.emit("join room", roomId);
  }, []);

  useEffect(() => {
    socket.on("new message", (currentMsg: NewMessage) => {

      if (newMessages.current.length === 1 && !newMessages.current[0].userName) {
        newMessages.current = [currentMsg];

        countNewMsg(newMsgNO + 1);

      } else {
        newMessages.current.push(currentMsg);

        countNewMsg(newMsgNO + 1);

      }

      countNewMsg(newMsgNO + 1);

      console.log("newMsgNO: ", newMsgNO);
      console.log("newMessages.current: ", newMessages.current);

    });
  }, []);

  return (

        ...

      {newMsgNO > 0 &&
        newMessages.current.map((_, idx) => (
          <MessageRecord key={_.userName + idx.toString} message={_} />
        ))}

      <button onClick={testMessage}>testMessage</button>

       ...
  );

I'm making a message feature with socket.io.
When I send/receive a message, I want to change the state of newMsgNO, but it doesn't seem to work.
In the second useEffect below, first console.log always show the initial state that newMsgNO: 0, while second console.log shows the value of newMessages.current well whenever they come in.

This is one of what I tried to. In the testMessage below I tried to change the state, and component was rendered again with new message. But the state of newMsgNO was the 0 too. and I should not do like that because that works only when I sending the message. I should do work in the code of socket.on("new message", ...).

How can I change the state of newMsgNO in socket.on("new message", ...) ?


...

 const newMessages = useRef([
    {
      userImg: "",
      userName: "",
      talkContent: "",
      talkTime: "",
      isContinuous: false,
    },
  ]);

  const [newMsgNO, countNewMsg] = useState(0);

  const testReceiveM = {
    userImg: "",
    userName: "ab",
    talkContent: "hello my name is...",
    talkTime: "22.03.04.12:22",
    isContinuous: false,
  };

  const testMessage = () => {
    socket.emit("send message", { roomId, msg: testReceiveM });
  };

  useEffect(() => {
    socket.emit("join room", roomId);
  }, []);

  useEffect(() => {
    socket.on("new message", (currentMsg: NewMessage) => {

      if (newMessages.current.length === 1 && !newMessages.current[0].userName) {
        newMessages.current = [currentMsg];

        countNewMsg(newMsgNO + 1);

      } else {
        newMessages.current.push(currentMsg);

        countNewMsg(newMsgNO + 1);

      }

      countNewMsg(newMsgNO + 1);

      console.log("newMsgNO: ", newMsgNO);
      console.log("newMessages.current: ", newMessages.current);

    });
  }, []);

  return (

        ...

      {newMsgNO > 0 &&
        newMessages.current.map((_, idx) => (
          <MessageRecord key={_.userName + idx.toString} message={_} />
        ))}

      <button onClick={testMessage}>testMessage</button>

       ...
  );

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

独闯女儿国 2025-01-26 21:48:24

我明白了!多亏了前端开发的开放聊天室的“뚜아아아”。

countnewmsg(((prev)=&gt; prev + 1);这就是与此有关的。

  useEffect(() => {
    socket.on("new message", (currentMsg: NewMessage) => {

      if (newMessages.current.length === 1 && !newMessages.current[0].userName) {
        newMessages.current = [currentMsg];
      } else {
        newMessages.current.push(currentMsg);
      }

      countNewMsg((prev) => prev + 1);

      console.log("newMsgNO: ", newMsgNO);
      console.log("newMessages.current: ", newMessages.current);

    });
  }, []);

由于异步逻辑,我以前的尝试无效。
因此,我像同步设计一样使其正常工作。 (prev)=&gt; prev + 1

和当SetState设置了多次,只有最后一个设置。
因此,我在条件下删除了它们。因为它们是进行测试的,现在没有必要,因此不需要对此进行额外的工作。

我很高兴能解决这个问题。
晚安大家!

I got this! Thanks to "뚜아아아" from open chat room in frontend development.

countNewMsg((prev) => prev + 1); this is all about this.

  useEffect(() => {
    socket.on("new message", (currentMsg: NewMessage) => {

      if (newMessages.current.length === 1 && !newMessages.current[0].userName) {
        newMessages.current = [currentMsg];
      } else {
        newMessages.current.push(currentMsg);
      }

      countNewMsg((prev) => prev + 1);

      console.log("newMsgNO: ", newMsgNO);
      console.log("newMessages.current: ", newMessages.current);

    });
  }, []);

Because of asynchronous logic, my previous try didn't work.
So I made it work like synchronous design. (prev) => prev + 1

And when setState is set many times, only the last one works.
So I deleted them on if condition. Because they were for test and now they are not necessary, it is not required to do additional work about it.

I'm so glad to solve this.
Goodnight everyone!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文