Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add event listener for html element inside useEffect?

Tags:

reactjs

For some reasons, I have to add an event listener for an html element inside useEffect hook. And the element is from a component named Comp. So I wrote this:

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/> 
}

I can't add event listener for ele inside Comp directly since Comp is a third library component. So the only way is to query ele and then add event listener in useEffect.

But this code didn't work. When using window.getEventListener(ele) in devtools, it returned a null object without click property. Also, the click event didn't work. And I found the code below can work:

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>
  )
}

So what is the corret way to solve this problem? Why the first way failed while the second way succeeded ?

like image 627
Chor Avatar asked Oct 24 '25 08:10

Chor


1 Answers

Using exactly the code you shared (the first snippet) it works perfectly fine, the listener is initiated. Instead of testing your code by using window.getEventListener(ele) just add some placeholder console.log and try again.

like image 66
Javg Avatar answered Oct 25 '25 22:10

Javg



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!