я использую useRef
вместо addEventListener
, но не работает, что-то здесь не так?
родительский компонент:
const parent = () => {
const el = useRef()
const element = el.current && el.current
useEffect(() => {
if (element) {
const scrollHandler = e => {
console.info(e);
};
element.addEventListener("scroll", scrollHandler);
return () => {
element.removeEventListener("scroll", scrollHandler);
};
}
}, [element]);
return (
<Child ref = {el} />
)
}
дочерний компонент:
const child = React.forwardRef((props, ref) => {
return (
<div ref = {ref}>something...</div>
)
})
Useref не запускает повторную визуализацию и привязывает объект ref перед useEffect. Просто используйте el.current без элемента.
element.addEventListener
не window.addEventListener
я написал не так, чувак. можешь еще раз проверить?
Вот рабочая демка. Чтобы событие scroll
работало над элементом, этот элемент должен быть прокручиваемым, и вам нужно использовать el.current
вместо element
внутри хука useEffect
.
измените свой родительский компонент на это, чтобы избежать получения stale state
:
const parent = () => {
const el = useRef();
useEffect(() => {
if (el.current) {
const scrollHandler = (e) => {
console.info(e);
};
el.current.addEventListener("scroll", scrollHandler);
return () => {
el.current.removeEventListener("scroll", scrollHandler);
};
}
}, [el.current]);
return <Child ref = {el} />;
};
@ Юсуф, я не говорил Stale Props
. element constant is unneccessary here and it may result in
Устаревшее состояние`
пожалуйста. Я изменил свой ответ. вам не нужно element variable
использовать свой el variable
напрямую
Рад, что смог помочь :)
Чтобы событие
scroll
работало, содержимое компонентаChild
должно иметь достаточную высоту, чтобы веб-страницу можно было прокручивать. Попробуйте установить высоту200vh
для элементаdiv
в компонентеChild
. Затем вы увидите, что событиеscroll
работает как надо.