Вы передали пустой массив в качестве второго аргумента для использованияEffect.И это то, что является вашей ключевой проблемой для того, чтобы не вызывать useEffect после его запуска.
Чтобы решить эту проблему, просто не передавайте второй аргумент.
useEffect(() => {
window.addEventListener("scroll", handleScroll);
return () => window.removeEventListener("scroll", handleScroll);
});
Или вызовитеuseEffect всякий раз, когда изменяется свойство:
useEffect(() => {
window.addEventListener("scroll", handleScroll);
return () => window.removeEventListener("scroll", handleScroll);
}, [isFetching]); // re-run useEffect on isFetching changed
Это похоже на то, что мы делаем в componentDidUpdate:
if (prevState.count !== this.state.count) {
// do the stuff
Для получения более подробной информации см. документацию ..
Примечание из документов:
Если вы хотите запустить эффект и очистить его только один раз (при монтировании и размонтировании), вы можетепередать пустой массив ([]) в качестве второго аргумента.Это говорит React, что ваш эффект не зависит от каких-либо значений из реквизита или состояния, поэтому его не нужно повторно запускать.Это не обрабатывается как особый случай - это следует непосредственно из того, как всегда работает массив зависимостей.
Если вы передадите пустой массив ([]), реквизиты и состояние внутри эффекта всегда будут иметь свои начальные значения.ценности.Хотя передача [] в качестве второго аргумента ближе к знакомой ментальной модели componentDidMount и componentWillUnmount, обычно существуют лучшие решения, позволяющие избежать слишком частого повторного запуска эффектов.Кроме того, не забывайте, что React откладывает запуск useEffect до тех пор, пока браузер не выполнит рисование, поэтому выполнение дополнительной работы представляет собой меньшую проблему.