为什么我的简单react组件打印控制台两次?

IT技术 reactjs
2021-04-08 15:17:23

我制作了一个简单的组件,当单击按钮时,数字状态“a”会增加。

console.log()在组件内部编写以检查它何时呈现。我希望在console.log单击按钮时执行一次,因为组件的状态已更改。

但是,我错了,console.log()被执行了两次。

有什么问题吗?还是正确的?我错过了什么?

这是我的代码

jsx

import React, {useState} from 'react';

const A = () => {
    const [a, setA] = useState(0);
    const onClick = () => setA(a + 1);
    console.log('render')

    return (
        <div>
            <p>a : { a}</p>
            <button onClick = {onClick}>button</button>
        </div>
    )
}

export default A;

索引.jsx

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import A from './components/A';
import * as serviceWorker from './serviceWorker';

ReactDOM.render(
  <React.StrictMode>
    <A />
  </React.StrictMode>,
  document.getElementById('root')
);

serviceWorker.unregister();

这个应用程序是由 CRA 用 typescript 创建的。就这样。

谢谢。

****加******

我检查了 React 开发工具 Profiler 以检查当单击按钮并更改状态时组件是否真的渲染了两次。它在下面显示了我的结果

在此处输入图片说明

我认为只有一个渲染。如果组件真的渲染了一次,为什么 console.log 会执行两次?

1个回答

我认为这是因为React.StrictMode这只发生在开发中。如果您删除,React.StrictMode您将只获得 1 个日志。

有关更多详细信息,请查看 react repo 上的此线程:

https://github.com/facebook/react/issues/15074

在进一步阅读时,我也在 React 文档中发现了这一点:https : //reactjs.org/docs/strict-mode.html#detecting-unexpected-side-effects

希望这可以帮助!