如何在反应中使用socket.on?

Posted

技术标签:

【中文标题】如何在反应中使用socket.on?【英文标题】:How to use socket.on in react? 【发布时间】:2021-12-15 05:05:59 【问题描述】:

我正在构建一个小型聊天应用程序,但在接收响应消息时遇到问题。问题是当我收到一条消息时我setMessages,但同时messages 状态被清除。问题可能是我不知道在哪里放置socket.on,目前它在useEffect 挂钩内。

export const Room = ( socket ) => 
  const [messages, setMessages] = useState([]);
  const [input, setInput] = useState("");
  const  id  = useParams();
  
  useEffect(() => 
    socket.emit("join room", id);
  , []);

  useEffect(() => 
    socket.on("message", (message) => 
      setMessages([
        ...messages,
         message: message, createdBy: "other", id: uuidv4() ,
      ]);
    );
  , []);
  const sendMessage = () => 
    console.log("send");
    socket.emit("message", input);
    setMessages([
      ...messages,
       message: input, createdBy: "me", id: uuidv4() ,
    ]);
  ;
  console.log("foo");
  return (
    <div className="flex justify-center text-center">
      <div className="w-screen h-screen px-2 max-w-4xl mt-10">
        <p className="text-3xl">Code: id</p>
        <div className="bg-white w-full h-3/4 rounded-xl border-2 border-black overflow-y-auto">
          messages.map((message) => (
            <Message
              text=message.message
              createdBy=message.createdBy
              key=message.id
            />
          ))
        </div>
        <div className="flex flex-row border-2 border-black mt-2 rounded-xl p-2 bg-white">
          <input
            className="flex-grow border-none focus:outline-none"
            onInput=(e) => setInput(e.target.value)
          />
          <button
            className=" bg-green-500 rounded-xl px-2 py-1"
            onClick=sendMessage
          >
            Send
          </button>
        </div>
      </div>
    </div>
  );
;

【问题讨论】:

【参考方案1】:

我很确定您遇到了关闭问题。 messages 在 useEffect 中运行时并不是你想象的那样——它可能不是最新版本。

使用 setter 的功能变体是更安全和良好的做法。这样您就可以确定messages 是当前版本:

setMessages(messages => [
  ...messages,
   message: message, createdBy: "other", id: uuidv4() ,
]);

【讨论】:

以上是关于如何在反应中使用socket.on?的主要内容,如果未能解决你的问题,请参考以下文章

在 React 中,如何将“this.state”作为参数传递给“socket.on”回调函数?

如何在前端获取 socket.on 函数?事件被触发和处理。我正在使用 socket.io、NodeJS 服务器和 Redis.io

如何在socket.io上执行RPC?

组件安装时如何获取 socket.on("test", count)) 当前值?

如何通过 socket.io 进行 RPC?

如何在自定义原型方法中附加 socket.io 事件?