反应状态重置
React state resetting
我有一个订阅 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 出于某种原因在开始时缓存 'messages',并重用原始值,但不知道我将如何调试或修复它。
这是 React hooks 非直观状态设置机制的常见问题。
尝试使用 setMessages
并将函数作为其参数,而不是新值。这将保证您使用它的最新值:
setMessages(prevMessages => [...prevMessages, message]);
我有一个订阅 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 出于某种原因在开始时缓存 'messages',并重用原始值,但不知道我将如何调试或修复它。
这是 React hooks 非直观状态设置机制的常见问题。
尝试使用 setMessages
并将函数作为其参数,而不是新值。这将保证您使用它的最新值:
setMessages(prevMessages => [...prevMessages, message]);