Подтвердить что ты не робот

Почему async-запросы должны быть сделаны в компонентеDidMount вместо getInitialState в ReactJS?

Эта страница из React docs показывает, что запрошенные асинхронные данные должны потребляться в событии componentDidMount, а getInitialState инициализировать объект состояния в пустое состояние по умолчанию.

Есть ли причина для этого? Может быть, getInitialState не должен делать это или имеет другую цель? Это связано с некоторой внутренней логикой библиотеки?

Примечание для модераторов и ответчиков: это не вопрос, основанный на мнениях: если причина существует, это был бы ответ, однако, правильный, правильный ответ на мой вопрос мог бы быть также "Нет, какая-либо особая причина, делайте все, что вам лучше"

4b9b3361

Ответ 1

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

componentDidMount разрешено иметь динамическое поведение и вызывать побочные эффекты, такие как манипуляция с dom и запросы ajax (что является основным намерением этого).

Обычный способ справиться с этим - с ранним возвратом либо пустого div, загружающего сообщения, <div>Loading</div>), либо индикатора загрузки (например, spinkit).

При первом отображении будет показан счетчик, а затем состояние будет обновлено данными, и основная часть рендера может быть запущена.

render: function(){
   // while loading
   if (!this.state.data){
     return <div className="spinner"></div>
   }

   // loaded, you can use this.state.data here
   return <div>...</div>
}

Ответ 2

Вы не хотели бы этого делать, потому что ваш компонент будет ждать асинхронного запроса, и он не сможет подключиться, пока он не завершится. Если у вас есть html с переменными состояния пары, пусть сначала реагирует на рендер, а не на ожидание. Я знаю, что это мнение, но это также разделение проблем.