为了账号安全,请及时绑定邮箱和手机立即绑定

使用 socket.io 事件更新状态

使用 socket.io 事件更新状态

鸿蒙传说 2022-06-16 10:06:51
我有一个反应功能组件:function Chat(props) {  const [messages, setMessages] = useState([]);  const inputRef = useRef();  //The socket is a module that exports the actual socket.io socket  socket.socket.on("chatMessage", (msg) => {    setMessages([...messages, msg]);  });  const inputChanged = (e) => {    if (e.key === "Enter") {      socket.sendMessage(inputRef.current.value)        .then(() => {          //do something        })        .catch(console.log);      inputRef.current.value = "";    }  };  return (      <div>        {messages.map((msg, i) => <ChatMessage key={i}>{msg}</ChatMessage>)}        <input ref={inputRef} onKeyPress={inputChanged} />     </div>  );}但是当我从 更新状态时socket.socket.on("chatMessage",我得到一个错误无法对未安装的组件执行 React 状态更新并且套接字告诉我响应需要很长时间,并且开始发生一些递归。我应该如何从套接字事件更新我的组件状态?
查看完整描述

2 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

您需要在 useEffect 函数中设置套接字侦听器,否则在每次重新渲染时都会创建一个新实例,而旧实例将继续侦听并导致内存溢出和意外的状态更新错误。还要清除您的套接字侦听器


function Chat(props) {

  const [messages, setMessages] = useState([]);


  const inputRef = useRef();


  useEffect(() => {

      //The socket is a module that exports the actual socket.io socket

      const addMessage = (msg) => setMessages(prevMessages => [...prevMessages, msg]);

      socket.socket.on("chatMessage", addMessage)

      () => {

            // turning of socket listner on unmount

          socket.off('chatMessage', addMessage);

       }

  }, [])


  const inputChanged = (e) => {

    if (e.key === "Enter") {

      socket.sendMessage(inputRef.current.value)

        .then(() => {

          //do something

        })

        .catch(console.log);

      inputRef.current.value = "";

    }

  };


  return (

      <div>

        {messages.map((msg, i) => <ChatMessage key={i}>{msg}</ChatMessage>)}

        <input ref={inputRef} onKeyPress={inputChanged} />

     </div>

  );

}

// PS 确保你使用回调方法来更新状态


查看完整回答
反对 回复 2022-06-16
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

套接字是副作用。


useEffecf(() => {

  const callback =  (msg) => {

    setMessages([...messages, msg]);

  };


  socket.socket.on("chatMessage", callback);


  return () => {

    socket.socket.off("chatMessage", callback);

  };

}, []);


查看完整回答
反对 回复 2022-06-16
  • 2 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号