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 确保你使用回调方法来更新状态

TA贡献1900条经验 获得超5个赞
套接字是副作用。
useEffecf(() => {
const callback = (msg) => {
setMessages([...messages, msg]);
};
socket.socket.on("chatMessage", callback);
return () => {
socket.socket.off("chatMessage", callback);
};
}, []);
添加回答
举报