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