Да, есть аналогичный (но не тот же!) Заменитель componentDidMount
с крючками, и это useEffect
крючок.
Другие ответы на самом деле не отвечают на ваш вопрос о том, где вы можете делать вызовы API. Вы можете выполнять вызовы API, используя useEffect
и , передавая пустой массив или объект в качестве второго аргумента в качестве замены для componentDidMount()
. Ключ здесь - второй аргумент. Если вы не предоставите пустой массив или объект в качестве второго аргумента, вызов API будет вызываться при каждом рендеринге, и он фактически становится componentDidUpdate
.
Как уже упоминалось в документах:
Передача пустого массива [] входных данных говорит React, что ваш эффект не зависит от каких-либо значений компонента, так что эффект будет работать только при монтировании и очищаться при размонтировании; он не будет запускаться при обновлении.
Вот несколько примеров сценариев, в которых вам нужно будет выполнять вызовы API:
Вызов API строго при монтировании
Попробуйте запустить приведенный ниже код и посмотрите результат.
Вызов API всякий раз, когда изменяются реквизит / состояние
Если вы, например, отображаете страницу профиля пользователя, где каждая страница имеет состояние user-prop / prop, вы должны передать этот идентификатор в качестве значения во второй параметр useEffect
, чтобы данные были повторно получены для новый идентификатор пользователя. componentDidMount
здесь недостаточно, поскольку компонент может не нуждаться в перемонтировании, если вы переходите непосредственно от пользователя A к профилю пользователя B.
Традиционным образом, вы должны сделать:
componentDidMount() {
this.fetchData();
}
componentDidUpdate(prevProps, prevState) {
if (prevState.id !== this.state.id) {
this.fetchData();
}
}
С крючками это будет:
useEffect(() => {
this.fetchData();
}, [id]);
Попробуйте запустить приведенный ниже код и посмотрите результат. Например, измените id на 2, чтобы увидеть, что useEffect
запускается снова.
Вам следует прочитать useEffect
, чтобы вы знали, что вы можете / не можете делать с ним.
Захватывающий
Как сказал Дэн Абрамов в этом выпуске GitHub :
В долгосрочной перспективе мы будем препятствовать этому (useEffect) паттерну, потому что он стимулирует условия гонки. Например, между началом и окончанием вызова может произойти все, и вы могли бы получить новые реквизиты. Вместо этого мы рекомендуем Suspense для извлечения данных
Так что следите за обновлениями Suspense!