问题:每当接收到新消息时执行侦听器功能时,我都希望将新消息(只是一个对象)添加到状态变量messages
中。但是状态变量始终处于初始状态(即空列表),即使在第二条或第三条消息之后也是如此。
预期结果:
收到消息后,将调用connection.onstream
,并使用messages
将新消息添加到状态变量setMessages
中。
const Messager = ( ) => {
let [messages, setMessages] = useState([]);
var connection = new ThirdPartyMessager();
connection.onstream = function (event) { // when recieve a message, this will be called
console.log(messages); // problem, this always shows initial state, i.e. []
setMessages([ // thus setmessage will always have 1 item after adding new message
...messages,
event.message
]);
}
};
答案 0 :(得分:1)
connection.onstream
中的 []
以connection.onstream
开头,而setMessages
在您呼叫messages
==> {{1 }}始终为[]
,它是JS的闭包概念。
您可以尝试解决此问题:
setMessages(prevMessages = > ([...prevMessages,event.message]));
已更新:This is a good example from React docs关于在这种情况下设置事件setInterval
的状态,但在您的情况下适用于事件onstream
。
答案 1 :(得分:0)
尝试使用效果
const Messager = () => {
let [messages, setMessages] = useState([]);
var connection = new ThirdPartyMessager();
useEffect(() => {
connection.onstream = function (event) {
console.log(messages);
setMessages([
...messages,
event.message,
]);
};
}, []);
};