[英]How to add event listener for html element inside useEffect?
由于某些原因,我必须在useEffect
挂钩中为 html 元素添加一个事件侦听器。 该元素来自名为Comp
的组件。 所以我写了这个:
const Comp = () => {
return (
<div className="ele"></div>
// something else
)
}
const App = () => {
useEffect(() => {
const ele = document.querySelector(`.ele`)
const handleClick = () => {}
ele.addEventListener('click', handleClick)
return () => ele.removeEventListener('click', handleClick)
}, [])
return <Comp/>
}
我不能直接在Comp
中为ele
添加事件监听器,因为Comp
是第三个库组件。 所以唯一的办法就是查询ele
然后在useEffect
中添加事件监听器。
但是这段代码不起作用。 在 devtools 中使用window.getEventListener(ele)
时,它返回了一个没有click
属性的 null object。 此外, click
事件不起作用。 我发现下面的代码可以工作:
const App => {
const divRef = useRef(null)
useEffect(() => {
const handleClick = () => {}
const ele = divRef.current.querySelector(`.ele`)
ele.addEventListener('click', handleClick)
return () => ele.removeEventListener('click', handleClick)
}, [])
return (
<div ref={divRef}> <Comp/></div>
)
}
那么解决这个问题的正确方法是什么? 为什么第一种方式失败而第二种方式成功了?
完全使用您共享的代码(第一个片段)它工作得很好,监听器被启动。 不要使用window.getEventListener(ele)
来测试您的代码,只需添加一些占位符console.log
并重试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.