Название говорит все. Я понимаю, почему componentDidMount подходит для всего, что требует доступа DOM, но запрос AJAX не обязательно или обычно нуждается в этом.
Что дает?
Название говорит все. Я понимаю, почему componentDidMount подходит для всего, что требует доступа DOM, но запрос AJAX не обязательно или обычно нуждается в этом.
Что дает?
componentDidMount
для побочных эффектов. Добавление прослушивателей событий, AJAX, мутация DOM и т.д.
componentWillMount
редко бывает полезным; особенно если вы заботитесь о рендеринге на стороне сервера (добавление прослушивателей событий вызывает ошибки и утечки, а также множество других вещей, которые могут пойти не так).
Говорят об удалении componentWillMount
из компонентов класса, поскольку он выполняет ту же задачу, что и конструктор. Он останется на компонентах createClass
.
У меня была такая же проблема и в начале. Я решил попробовать сделать запросы в componentWillMount
, но в конечном итоге это связано с небольшими проблемами.
Я запускал рендеринг, когда вызов ajax заканчивается новыми данными. В какой-то момент рендеринг компонента занял больше времени, чем получение ответа от сервера, и на этом этапе обратный вызов ajax вызывал рендеринг на немонтированном компоненте. Это своего рода краевой кейс, но, вероятно, больше, поэтому безопаснее придерживаться componentDidMount
.
В соответствии с настройкой документации состояние в componentWillMount
не приведет к повторному рендерингу.
Если вызов AJAX не блокируется, и вы возвращаете Promise
, которые обновляют состояние компонента при успешном выполнении, есть вероятность, что ответ будет получен после того, как компонент будет визуализирован.
Поскольку componentWillMount
не запускает повторную визуализацию, у вас не будет ожидаемого поведения, которое будет отображаться компонентом с запрошенными данными.
Если вы используете какую-либо библиотеку потоков и запрошенные данные в хранилище, к которому компонент подключен (или наследуется от подключенного компонента), это не будет проблемой, поскольку прием этих данных будет, скорее всего, смените реквизит в конце концов.