Предоставляя пустой массив в качестве второго аргумента эффекта, вы сказали, что реагируйте никогда не создавать этот эффект заново. Так что это происходит только один раз, и переменные, которые он имеет при закрытии, никогда не изменятся.
Опция 1:
Вы можете получить эффект для повторного запуска, либо удалив массив зависимостей, либо заполнив его нужными вам переменными. Так как это приведет к многократному запуску эффекта, вам также потребуется обеспечить функцию очистки для снятия предыдущего эффекта.
useEffect(() => {
const callback = () => requestAnimationFrame(() => {
setTest(test + 1);
})
window.addEventListener('scroll', callback);
return () => window.removeEventListener('scroll', callback);
}) // <------
Вариант 2:
Поскольку единственное, что вам нужно обновить, это последнее значение состояния, вы можете использовать версию обратного вызова setTest. React передаст вам последнее значение, и вы можете рассчитать изменение на основе этого.
Вы по-прежнему хотите иметь функцию разрыва, чтобы слушатель мог быть удален, если этот компонент отключен:
useEffect(() => {
const callback = () => requestAnimationFrame(() => {
setTest(prev => prev + 1); // <------
})
window.addEventListener('scroll', callback);
return () => window.removeEventListener('scroll', callback);
}, [])