为什么useState导致组件在每次更新时呈现两次?

时间:2020-05-03 16:44:28

标签: javascript reactjs

我这里有一些简单的代码

import React, { useState } from "react";
import "./styles.css";

export default function App() {
  const [number, setNumber] = useState(0);

  function chaneNumber() {
    setNumber(state => state + 1);
  }

  console.log("here");
  return (
    <div className="App">
      <button onClick={chaneNumber}>Change number</button>
      {number}
    </div>
  );
}

每次单击按钮时,控制台上都会显示2条日志,指示该组件呈现两次。我发现一个post说这是关于严格模式的,但是我没有启用严格模式。为什么该组件在每个状态更新时呈现两次?

这里是一个codesandbox链接,供您尝试。

1 个答案:

答案 0 :(得分:19)

您的App组件在React.StrictMode中呈现,这导致您的代码在严格模式下运行,并且在严格模式下,控制台显示两次,因为每个功能都在开发模式下运行了两次

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  rootElement
);

根据react docs

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

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