React Hooks中的removeEventListener使用问题

const App= ()=>{
    const divRef = useRef()
    useEffect(()=>{
        const test = () => { console.log('click'); }
        
        divRef.current.addEventListener('click', test)
        return ()=>{
            divRef.current.removeEventListener('click', test)
        }
    })
    return <div ref={divRef}>111</div>
}

当App组件卸载的时候,就会警告 Cannot read property 'removeEventListener' of null

有特殊写法可以避免这个问题吗 ?

阅读 3.6k
2 个回答

改改:

const App= ()=>{
    const divRef = useRef()
    useEffect(()=>{
        const test = () => { console.log('click'); }
        const currentDivRef = divRef.current;
        
        currentDivRef.addEventListener('click', test)
        return ()=>{
            currentDivRef.removeEventListener('click', test)
        }
    })
    return <div ref={divRef}>111</div>
}
import React, { useEffect, useRef } from 'react';

const App = () => {
  const divRef = useRef();

  const test = () => {
    console.log('click');
  };

  useEffect(() => {
    if (divRef.current) {
      divRef.current.addEventListener('click', test);
    }

    return () => {
      if (divRef.current) {
        divRef.current.removeEventListener('click', test);
      }
    };
  }, []); 

  return <div ref={divRef}>111</div>;
};

export default App;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题