All Articles

React Event bind & unbind

리액트 함수형 / 클래스형 컴포넌트에 따른 이벤트 등록/해제

Isssue

  1. 어떤 이벤트를 등록하고 다른 컴포넌트로 이동
  2. 언마운트된 컴포넌트에 쓰였던 함수가 계속 실행되어 오류 발생
  3. 컴포넌트 마운트/언마운트시 이벤트 등록/해제 처리가 필요

함수형 컴포넌트

useEffect 를 통해 이벤트 등록/해제

반환된 매개변수는 마운트 직전 or 언마운트시 실행

return () => {
  //마운트 직전 or 언마운트시 실행 
}

sample

/**
 * useEffect 두번째 매개변수에 [] 빈배열을 넣으면
 * 마운트시 : 첫번째 매개변수로 넣은 함수가 실행
 * 언마운트시 : return 반환된 함수가 실행
 **/ 
useEffect(() => {
  // 마운트시 1번만 실행 (두 번째 매개변수로 []를 넣었으므로)
  // 이벤트 바인딩
  window.addEventListener('resize', handleFunc);

  // 언마운트시 실행
  return () => {
      // console.log('unmount');
      // 이벤트 해제
      window.removeEventListener('resize', handleFunc);
  }
}, []);

setInterval 사용시

useEffect(() => {
  // 클리어 해야하므로 useEffect 안에 정의
  const interval = setInterval(()=>{
      document.getElementById('dinor').classList.toggle('rotate-effect');
      // console.log('repeat');
  },3000)

  // 언마운트시 실행
  return () => {
      // console.log('unmount');
      clearInterval(interval);
  }
}, []);

클래스형 컴포넌트

componentDidmount, componentWillUnmount 시 등록/해제 처리 필요

class Hello extends React.Component {

  // 마운트시 이벤트 등록
  componentDidmount(){
    window.addEventListener('resize', this.handleFunc);
  }

  // 언마운트시 이벤트 해제
  componentWillUnmount(){
    window.removeEventListener('resize', this.handleFunc);
  }

  handleFunc = () => {
    //fnc...
  }
}

Reference