Проблема из-за закрытия, которое формируется при запуске эффекта.Поскольку вы устанавливаете useEffect
для запуска только при первоначальном монтировании, он получает значение pendingMessages
из замыкания, которое формируется при его объявлении, и, следовательно, даже если pendingMessages
обновляется, pendingMessages
внутри onSendMessage
будет ссылаться на то же значение, которое присутствовало изначально.
Поскольку вы не хотите получать доступ к значению в onSendMessage
и просто обновлять состояние на основе предыдущего значения, вы можете просто использовать шаблон обратного вызова setter
const [ pendingMessages, setPendingMessages ] = React.useState([]);
React.useEffect(function() {
ref.current.addEventListener('send-message', onSendMessage);
return function() {
ref.current.removeEventListener('send-message', onSendMessage);
};
}, []);
function onSendMessage(event) {
const newMessage = event.message;
setPendingMessages(prevState =>([ ...prevState, newMessage ]));
}