Reactjs рендеринг дважды

В моем проекте reactjs компонент отображается дважды. если я удалю componentDidMount, проблема будет решена. Но мне это нужно в моем проекте. Я пробовал решения в Интернете, но не смог.

App.js

export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      users: []
    };
  }
  componentDidMount() {
    fetch("https://reqres.in/api/users?page=2")
      .then(res => res.json())
      .then(result => {
        this.setState({
          users: result.data
        });
      });
  }

  render() {
    return (
      <BrowserRouter>
        <Switch>
          <Route exact path = "/" render = {() => <Home />} />
        </Switch>
      </BrowserRouter>
    );
  }
}

Home.js

export default class Home extends Component {
  render() {
    console.info("Render");
    return (
      <div>
        <h1>console.info render twice</h1>
      </div>
    );
  }
}

https://codesandbox.io/s/wyjk931z6l

console.info работает с Home.js дважды.

Он будет отображаться дважды, так в чем проблема? вот как работает вызов API

Just code 04.01.2019 09:56

Пожалуйста, объясните, почему вы считаете, что компонент, визуализируемый несколько раз, в чем-то плохой. Потому что так работает React (или любое другое программное обеспечение, использующее экран).

Chris G 04.01.2019 10:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
4 976
1

Ответы 1

Компонент вашего приложения выполняет повторную визуализацию, потому что вызов API, который вы выполняете в componentDidMount, в случае успеха приводит к setState. Из-за этого дочерние компоненты также проходят повторный рендеринг, хотя их свойства не изменились. Чтобы этого избежать, вы можете написать дочерний компонент, расширив React.PureComponent, который реализует shouldComponentUpdate, путем неглубокого сравнения свойств и состояния.

export default class Home extends PureComponent {
  render() {
    console.info("Render");
    return (
      <div>
        <h1>console.info render twice</h1>
      </div>
    );
  }
}

Рабочая демонстрация

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

Chris G 04.01.2019 10:11

@ChrisG да, вы правы, однако я попытался объяснить, что именно происходит в коде OP, и посоветовал использовать PureComponent вместо того, чтобы реализовывать shouldComponentUpdate самостоятельно

Shubham Khatri 04.01.2019 10:14

Другие вопросы по теме