【发布时间】:2020-11-28 06:31:47
【问题描述】:
我目前正在努力解决与 socket.io 和 React 有关的问题。每当调用 socket.on() 时,状态都会重置,并且之前的所有聊天数据都消失了。换句话说,每当用户收到一条消息时,“消息”状态就会被重置。
我在Socket.io resets React state? 上看到了类似的帖子,但我似乎无法对我的问题应用相同的解决方案。任何帮助将不胜感激!
function ChatComponent(props) {
const [messages, setMessages] = useState([]);
const [socket, setSocket] = useState(socketioclient("*********"));
function socket_joinRoom(room) {}
function _onMessageUpdate(message) {
setMessages([
...messages,
{
author: "them",
type: "text",
data: { text: message },
},
]);
}
useEffect(() => {
socket_joinRoom(parseInt(props.props[0], 10));
socket.on("updateMessage", (message) => {
//** When this is called, the state resets*
console.log(messages);
_onMessageUpdate(message);
});
return () => {
socket.off("updateMessage");
socket.disconnect();
};
}, []);
function _onMessageWasSent(message) {
setMessages([...messages, message]);
socket.emit("sendMessage", message.data.text);
}
return (
<div className="chatComponent" style={{ height: "100%" }}>
<Launcher
agentProfile={{
teamName: `Ongoing: Room #${props.props[0]}`,
}}
onMessageWasSent={_onMessageWasSent}
messageList={messages}
isOpen={true}
showEmoji
/>
</div>
);
}
【问题讨论】:
-
你可以试试
useRef吗?您可以简单地初始化数组并继续添加。 Refs 不会导致任何重新加载,因此您会很安全。此外,将数据写入 localStorage 也有助于在刷新之间保持持久性。 -
@Abhilash 在这种情况下我将如何使用“useRef”?消息需要是可变的
-
我的意思是您仍然需要您的状态来检测更改 n 刷新,但是将您的更新推送到 ref 以便您始终拥有旧数据和新数据。
标签: reactjs websocket socket.io