Использование useRef addEventListener

я использую 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>
  )
})

Чтобы событие scroll работало, содержимое компонента Child должно иметь достаточную высоту, чтобы веб-страницу можно было прокручивать. Попробуйте установить высоту 200vh для элемента div в компоненте Child. Затем вы увидите, что событие scroll работает как надо.

Yousaf 26.12.2020 12:42

Useref не запускает повторную визуализацию и привязывает объект ref перед useEffect. Просто используйте el.current без элемента.

Cenk Çetinkaya 26.12.2020 12:42
stackoverflow.com/users/6094348/yousaf Да, вы правы, у меня достаточно прокрутки для элемента, но все равно не работает
mohammad nowresideh 26.12.2020 12:48
stackoverflow.com/users/6165701/cenk-%c3%87etinkaya Сделал как вы сказали, но все равно не работает.
mohammad nowresideh 26.12.2020 12:50
stackoverflow.com/users/6094348/yousaf Большое спасибо за помощь, но я хочу element.addEventListener не window.addEventListener я написал не так, чувак. можешь еще раз проверить?
mohammad nowresideh 26.12.2020 13:02

Вот рабочая демка. Чтобы событие scroll работало над элементом, этот элемент должен быть прокручиваемым, и вам нужно использовать el.current вместо element внутри хука useEffect.

Yousaf 26.12.2020 13:11
stackoverflow.com/users/6094348/yousaf Спасибо, чувак.
mohammad nowresideh 26.12.2020 13:22
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
7
1 356
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

измените свой родительский компонент на это, чтобы избежать получения 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 Устаревшее состояние`

Taghi Khavari 26.12.2020 12:49
stackoverflow.com/users/11432102/taghi-khavari Спасибо, чувак, ты можешь еще раз увидеть мой вопрос, я немного отредактировал
mohammad nowresideh 26.12.2020 12:53

пожалуйста. Я изменил свой ответ. вам не нужно element variable использовать свой el variable напрямую

Taghi Khavari 26.12.2020 13:04
stackoverflow.com/users/11432102/taghi-khavari Большое спасибо.
mohammad nowresideh 26.12.2020 13:21

Рад, что смог помочь :)

Taghi Khavari 26.12.2020 14:11

Другие вопросы по теме