使用useRef addEventListener

问题描述 投票:0回答:1

我使用

useRef
代替
addEventListener
但不起作用,这里出了什么问题吗?

父组件:

const parent = () => {
  const el = useRef()
  const element = el.current && el.current 

  useEffect(() => {
    if (element) {
      const scrollHandler = e => {
        console.log(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>
  )
})
reactjs react-hooks
1个回答
0
投票

基于

React Hook Flow
,将在渲染子项并设置
useEffect
后调用
refs
,因此您应该能够清空
useEffect
依赖项,并且仍然有正在设置的
ref
。 [![在此处输入图像描述][1]][1]

也请查看 Dan 的评论,这可能有助于澄清正在发生的事情:https://github.com/facebook/react/issues/14387#issuecomment-503616820

还创建了这个codesandbox,您可以使用代码来看看我在说什么:https://codesandbox.io/p/sandbox/elastic-cache-jgv7xw 将您的父组件更改为此以避免获得

stale state
:


const parent = () => {
  const el = useRef();

  useEffect(() => {
    if (el.current) {
      const scrollHandler = (e) => {
        console.log(e);
      };

      el.current.addEventListener("scroll", scrollHandler);

      return () => {
        el.current.removeEventListener("scroll", scrollHandler);
      };
    }
  }, []);

  return <Child ref={el} />;
};


  [1]: https://i.stack.imgur.com/YxEQ4.jpg
© www.soinside.com 2019 - 2024. All rights reserved.