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

反应状态重置

反应状态重置

Smart猫小萌 2022-10-21 10:54:55
我有一个订阅 EventEmitters 事件的基本组件。它要做的就是积累一系列消息。然而,正在发生的事情是消息数组最终只包含最新消息。这是组件源:export const MessageList = ({serverId, connection}) =>{    var [messages, setMessages] = useState([]);    const appendSystem = (message) =>    {        console.log("Appending " + message);        console.log(messages);        setMessages([...messages, message]);    }    useEffect(() =>    {        connection.on('system', appendSystem);        return () => connection.removeListener('system', appendSystem);    },    [serverId]);    console.log("Rendering");    console.log(messages);}然而,我得到的输出......Rendering[]Appending Permission granted. Attempting connection.[]Rendering["Permission granted. Attempting connection."]Appending Connection Succeeded[]Rendering["Connection Succeeded"]所以看起来每次appendSystem调用,messages都是一个空数组。因此,setMessages 总是将新消息附加到一个空数组中。有谁知道这可能是什么原因造成的?我的印象是 appendSystem 出于某种原因在开始时缓存“消息”,并重用原始值,但不知道我将如何调试或修复它。
查看完整描述

1 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

这是 React 钩子的非直观状态设置机制的常见问题。

尝试使用setMessages函数作为其参数,而不是使用新值。这将保证您使用它的最新值:

setMessages(prevMessages => [...prevMessages, message]);



查看完整回答
反对 回复 2022-10-21
  • 1 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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