Пустой массив зависимостей действует как componentDidMount. Вы должны добавить тест в качестве одной из зависимостей, чтобы он снова запускался
function Test() {
const [test, setTest] = useState("init")
useEffect(() => {
window.addEventListener("resize", fun)
return () => {
window.removeEventListener("resize", fun)
}
}, [test])
return (
<button style={{ marginTop: "100px" }} onClick={() => setTest("new state")}>
{test}
</button>
)
}
Другая причина, по которой это происходит, заключается в том, что функциональный компонент использует значение устаревшего состояния.
Событие регистрируется один раз при монтировании компонента с использованием эффекта. Это та же самая функция в течение всего срока службы компонента, и она относится к устаревшему состоянию, которое было fre sh во время, когда этот eventListener был определен в первый раз.
Решением для этого является использование refs
Проверьте https://codesandbox.io/s/serverless-thunder-5vqh9, чтобы лучше понять решение