React 钩子:使用 useEffect 时未获取状态更新

React hooks: Not getting the state update when using useEffect

我在混合 useStateuseEffect 挂钩时遇到问题。我似乎无法在 onReady().

中引用新的 query 状态
function Foo() {
  const [ query, setQuery ] = React.useState('initial query');

  React.useEffect(() => {
    myLibClient.onReady(onReady)
  }, []);

  function onReady() {
    const newQuery = myLibClient.createQuery({ options });
    setQuery(newQuery);
    console.log(query); // initial query :(
  }

  return null;
}

谁能看出我做错了什么或解释为什么这不起作用?

这里的问题是,在基于 class 的 React 组件中,与 this.setState 一样,setQuery 函数也会异步设置状态。

Reference react docs and RFC: Why it is asynchronous?

因此,如果您在设置状态后尝试访问该值,您将获得旧值。

您可以在此处验证此行为。 https://codesandbox.io/s/2w4mp4x3ry。 (参见名为 Counter.js 的文件) 您会看到计数器的前后值相同。

如果你想访问更新后的值,你可以在下一个渲染周期访问它。我创建了另一个示例,您可以在其中看到正在呈现新的查询值。

https://codesandbox.io/s/8l7mqkx8wl(参见名为 Counter.js 的文件)