[英]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.