Дважды рендеринг компонента Basic React без каких-либо данных API

На моем локальном хосте в моей консоли я вижу, что мой компонент визуализируется дважды, и не знаю почему. Я не втягиваю какие-либо API с помощью componentDidMount, просто базовый компонент, в котором ничего нет. Ожидается ли это?

Когда я загружаю данные API, я получаю 4 повторных рендеринга в моей консоли, где я ожидал бы увидеть еще один повторный рендеринг при использовании componentDidMount для обновления состояния.

Я видел много потоков, касающихся обновлений состояния, вызывающих повторную визуализацию, но я не мог найти ничего, что касалось бы чего-то такого, что кажется таким простым.

App.js

import React from "react";
import Testing from "./components/Body/Testing"

function App() {

  return (

    <div className="App">

      <Testing />

    </div>
  );
}

export default App;

Testing.js

import React, { Component } from 'react'

export class Testing extends Component {

    constructor(props) {
        super(props);
        this.counter = 0;
      }

    render() {

        this.counter++;
        console.log('render ' + this.counter)

        return (
            <div>Test</div>
        )

    }
}

export default Testing

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import * as serviceWorker from './serviceWorker';
ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

Мой вывод на консоль выглядит следующим образом ...

Вывод консоли React


person chrsmrtn81    schedule 09.05.2020    source источник
comment
Что такое this.counter? Это не реквизит и не состояние ... разве это не вызывает повторного рендеринга? Вместо этой странной переменной count просто используйте console.count.   -  person Nick    schedule 09.05.2020
comment
Нет, это не то, что вызывает повторные рендеры, я добавил это, чтобы проиллюстрировать, что происходит. Я могу достать конструктор, и он сделает то же самое.   -  person chrsmrtn81    schedule 09.05.2020
comment
Покажи нам, как рендеринг приложения? Простое крепление DOM?   -  person Panther    schedule 09.05.2020
comment
@Panther .. Я добавил свой index.js, там ничего особенного. Как это было, когда я создавал приложение. Добавлю, что уже давно пользуюсь React :)   -  person chrsmrtn81    schedule 09.05.2020
comment
вам следует попробовать удалить режим Strict и посмотреть, произойдет ли то же самое. Это побочный эффект строгого режима.   -  person Panther    schedule 09.05.2020
comment
Потрясающие! Сделали свою работу :)   -  person chrsmrtn81    schedule 09.05.2020


Ответы (1)


Это сделано специально при использовании строгого режима. Это функция обнаружения неожиданных побочных эффектов в React.

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

Из документов ...

Строгий режим не может автоматически обнаруживать побочные эффекты, но он может помочь вам обнаружить их, сделав их более детерминированными. Это делается путем намеренного двойного вызова следующих функций:

Конструктор компонента класса, render и методы shouldComponentUpdate

Итак, да, React выполняет двойной рендеринг вашего компонента, чтобы показать вам, что вы делаете именно то, чего не должны делать (изменение счетчика в рендере).

Поскольку React не может сказать, что вы делаете при рендеринге, он считает, что двойной рендеринг - это самый быстрый способ привести приложение с ошибками в плохое состояние. Довольно здорово!

person Ryan    schedule 09.05.2020