useState() 做双重渲染

IT技术 reactjs render react-hooks
2021-05-18 16:09:15

我在函数组件中使用 useState() 并且第一次渲染调用了两次。它是正确的还是错误的?如果正确,为什么要渲染两次?setCount 也渲染组件两次。

function Example() {
  const [count, setCount] = useState(0);
  console.log("render");

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

ReactDOM.render(<Example />, document.getElementById('uu5'));

谢谢

3个回答

根据 react 文档,这是一个有意的功能,可帮助您在使用 StrictMode 时检测意外的副作用

严格模式无法自动为您检测副作用,但它可以通过使它们更具确定性来帮助您发现它们。这是通过有意重复调用以下函数来完成的:

  • 类组件构造函数、render 和 shouldComponentUpdate 方法
  • 类组件静态 getDerivedStateFromProps 方法
  • 功能组件体
  • 状态更新器函数(setState 的第一个参数)
  • 传递给 useState、useMemo 或 useReducer 的函数

注意:这仅适用于开发模式。生命周期不会在生产模式下被双重调用。

https://reactjs.org/docs/strict-mode.html#detecting-unexpected-side-effects

问题出在 React DevTools 中。当控制台关闭时,组件只渲染一次。但是如果你打开 React DevTools 并重新加载页面,render 将显示两次。打开示例并尝试一下。(react 16.8.3)

删除 index.js 文件中的 <React.StrictMode> 包装器