带空数组的 useEffect 钩子中的 UseState(对于 socket.io.on)
UseState in useEffect hook with empty array (for socket.io.on)
目前我有以下代码:
export default function Chat() {
const [chat, setChat] = useState({ ID: 0, messages: [] })
const {socket} = useContext(SocketContext)
useEffect(() => {
socket.on('/chat', (message) => {
setChat({...chat, messages: [...chat.messages, message] }
//Some other interaction with variables inside this Chat function (eg: document.getElementById)
}
}, [])
return <div>{chat.toDivs()}</div>
}
但这并没有像预期的那样工作,因为 useEffect 总是使用相同的 chat 值。所以在 /chat 上接收消息的结果总是 [message] 而不是 [...prevMessages, message].
我搜索过这个问题,有人建议使用 componentDidMount(),但由于我没有使用 React.Component 可扩展 class,我无法使用该方法。
对此有什么好的、简单的解决方案吗?
使用功能状态更新,以便您从先前的状态而不是更新回调范围内关闭的状态值。
卸载清理资源时不要忘记取消订阅。
const [chat, setChat] = useState({ ID: 0, messages: [] });
useEffect(() => {
const onChat = (message) => {
setChat(chat => ({
...chat,
messages: [...chat.messages, message],
}));
};
socket.on('/chat', onChat);
return () => socket.off('/chat', onChat);
}, []);
目前我有以下代码:
export default function Chat() {
const [chat, setChat] = useState({ ID: 0, messages: [] })
const {socket} = useContext(SocketContext)
useEffect(() => {
socket.on('/chat', (message) => {
setChat({...chat, messages: [...chat.messages, message] }
//Some other interaction with variables inside this Chat function (eg: document.getElementById)
}
}, [])
return <div>{chat.toDivs()}</div>
}
但这并没有像预期的那样工作,因为 useEffect 总是使用相同的 chat 值。所以在 /chat 上接收消息的结果总是 [message] 而不是 [...prevMessages, message].
我搜索过这个问题,有人建议使用 componentDidMount(),但由于我没有使用 React.Component 可扩展 class,我无法使用该方法。
对此有什么好的、简单的解决方案吗?
使用功能状态更新,以便您从先前的状态而不是更新回调范围内关闭的状态值。
卸载清理资源时不要忘记取消订阅。
const [chat, setChat] = useState({ ID: 0, messages: [] });
useEffect(() => {
const onChat = (message) => {
setChat(chat => ({
...chat,
messages: [...chat.messages, message],
}));
};
socket.on('/chat', onChat);
return () => socket.off('/chat', onChat);
}, []);