Почему документы React рекомендуют делать AJAX в componentDidMount, а не componentWillMount?

94

Название говорит все. Я понимаю, почему componentDidMount подходит для всего, что требует доступа DOM, но запрос AJAX не обязательно или обычно нуждается в этом.

Что дает?

  • 0
    @FurkanO Я думаю, что он имел в виду доступ к элементам DOM, отображаемым компонентом. И он совершенно прав, потому что, если вы попытаетесь получить доступ к указанным элементам в componentWillMount он потерпит неудачу, учитывая, что компонент ... не смонтирован.
  • 0
    @AlanH. Удалил мой вопрос, конечно у вас есть доступ к dom на componentDidMount. Это правило, ничего не объяснять. Благодарю.
Показать ещё 1 комментарий
Теги:

3 ответа

60
Лучший ответ

componentDidMount для побочных эффектов. Добавление прослушивателей событий, AJAX, мутация DOM и т.д.

componentWillMount редко бывает полезным; особенно если вы заботитесь о рендеринге на стороне сервера (добавление прослушивателей событий вызывает ошибки и утечки, а также множество других вещей, которые могут пойти не так).

Говорят об удалении componentWillMount из компонентов класса, поскольку он выполняет ту же задачу, что и конструктор. Он останется на компонентах createClass.

  • 1
    Добавление прослушивателей событий приводит к ошибкам и утечкам все время на сервере или только в componentWillMount ? Я не вижу различия.
  • 18
    @Alan - Если вы используете React как на стороне клиента, так и на стороне сервера, вы обнаружите, что все, что находится внутри componentWillMount будет выполняться при рендеринге на стороне сервера. Если бы вы использовали componentDidMount то это было бы выполнено только на стороне клиента. В результате помещение в componentWillMount вещей, которые выполняют внешние взаимодействия или привязываются к событиям и т. Д., Не является хорошей идеей. Если вы не планируете рендерить свои компоненты на стороне сервера, это все еще не очень хорошая идея только для потенциальной переносимости кода. Это все за пределами основной причины, по которой это плохо, что объясняется в ответе @daniula.
Показать ещё 9 комментариев
34

У меня была такая же проблема и в начале. Я решил попробовать сделать запросы в componentWillMount, но в конечном итоге это связано с небольшими проблемами.

Я запускал рендеринг, когда вызов ajax заканчивается новыми данными. В какой-то момент рендеринг компонента занял больше времени, чем получение ответа от сервера, и на этом этапе обратный вызов ajax вызывал рендеринг на немонтированном компоненте. Это своего рода краевой кейс, но, вероятно, больше, поэтому безопаснее придерживаться componentDidMount.

  • 0
    Хорошо спасибо. Думал, что это может быть что-то подобное, но вы правы, удивительно, что запрос ajax может закончиться раньше, чем это сделает рендер.
  • 1
    @daniula Вы уверены? Как завершить запрос AJAX перед рендерингом?
Показать ещё 5 комментариев
3

В соответствии с настройкой документации состояние в componentWillMount не приведет к повторному рендерингу. Если вызов AJAX не блокируется, и вы возвращаете Promise, которые обновляют состояние компонента при успешном выполнении, есть вероятность, что ответ будет получен после того, как компонент будет визуализирован. Поскольку componentWillMount не запускает повторную визуализацию, у вас не будет ожидаемого поведения, которое будет отображаться компонентом с запрошенными данными.

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

  • 0
    componentWillMount не запускает повторную визуализацию только потому, что новое состояние определяется перед первой визуализацией. Но если setState вызывается в setState вызове AJAX, он будет определенно вызываться после первого рендеринга и будет вызывать ре-рендеринг.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню