React Hooks:在监听器中获取useState的状态

时间:2019-02-05 06:27:37

标签: javascript reactjs react-hooks

我的组件内部有这个

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;
  console.log('Here not up to date :(', pendingMessages);
  setPendingMessages([ ...pendingMessages, newMessage ]);
}

问题在于pendingMessages在监听器内部不是最新的,因为它不在渲染器内部。它已经连接了。有什么想法可以解决吗?

谢谢!

1 个答案:

答案 0 :(得分:8)

问题是由于运行效果时形成了闭合。由于您将useEffect设置为仅在初始安装时运行,因此它会从声明时形成的闭包中获取pendingMessages的值,因此即使pendingMessages更新,{ pendingMessages中的{1}}将引用最初存在的相同值。

由于您不想访问onSendMessage中的值,而只是根据先前的值更新状态,因此您可以简单地使用setter的回调模式

onSendMessage