프로그래밍/React

React - useRef() 그리고 useEffect의 ComponentWillUnmount

삐제제 2021. 8. 26. 04:15

useRef : Component의 어떤 부분을 선택 할 수 있는 방법.  document.getElementByID()를 사용한 것 과 같은 효과

 

사용법 + 간단한 예제

import React, { useRef, useEffect } from "react";

const App = () => {
  const input = useRef();
  useEffect(() => {
    setTimeout(() => {
      input.current.focus();
    }, 5000);
  }, []);
  return (
    <div className="App">
      <div>Hi</div>
      <input ref={input} placeholder="la" />
    </div>
  );
};

export default App;

const 변수이름 = useRef();

.

.

.

<태그 ref={변수이름} />

 

이런식으로 사용한다. document.getElementByID() 와 같은 역할을 한다고 생각하면 편하다.

위 코드는 useEffect 와 setTimeout를 이용하여, mount 되면 5초 뒤에 input창이 focus 되게하는 코드이다.

 

예제 2

import React, { useRef, useEffect, useState } from "react";

const useClick = (onClick) => {
  const element = useRef();
  useEffect(() => {
    if (element.current) {
      element.current.addEventListener("click", onClick);
    }
    return () => { // ComponentWillUnMount
      if (element.current) {
        element.current.removeEventListener("click", onClick);
      }
    };
  }, []);
  return element;
};

const App = () => {
  const sayHello = () => console.log("Hello");
  const title = useClick(sayHello);
  return (
    <div className="App">
      <h1 ref={title}>Hi</h1>
    </div>
  );
};

export default App;

위와 같은 방법으로, 이벤트 리스너 등록도 가능!

 

* useEffect에 함수를 넣으면 라이프 사이클이 ComponentDidMount / ComponentDidUpdate 일 때 호출 된다. (dependency가 존재하지 않을 경우임! 만약 dependency가 존재한다면 기본적으로는 ComponentDidMount 일 때만 호출됨!)

 

* 라이프 사이클이 ComponentWillUnMount 일 때 return, 만약 함수를 return 한다면 useEffect를 return 받은 그 함수는 라이프 사이클이 ComponentWillUnMount 일 떄 실행됨.

 

useEffect 정리 : 

useEffect(() => {
    if (element.current) { // ComponentDidMount / (ComponentDidUpdate) 일 때 호출될 부분
      element.current.addEventListener("click", onClick);
    }
    return () => { // 라이프 사이클이 ComponentWillUnMount 일 때 호출될 부분
      if (element.current) {
        element.current.removeEventListener("click", onClick);
      }
    };
  }, []); 
  // dependency가 빈 배열로 존재함. 
  //이게 의미하는것은 여기서의 useEffect는 ComponentDidUpdate 사이클이 와도, 안에 있는 함수 실행을 안한다는 의미 => 처음 마운트됬을때 한번만 실행

위에서 빈 배열로 dependency를 준 이유는, 만약 dependency가 없으면, 코드 안에서 변화가 일어날 때마다 이벤트 리스너가 추가될것이다. (코드 내에 useState로 인해 값이 변한다던지 할 때)

 

상당히 어렵게 느껴지는 내용이다 ㅠㅠㅠ 자주 접하다보면 익숙해지겠지..

'프로그래밍 > React' 카테고리의 다른 글

React - useCallback  (0) 2021.09.01
React - useReducer  (0) 2021.09.01
React - useEffect  (0) 2021.08.26
React - useState  (0) 2021.08.26
React 에서 Form 태그의 Input값 변경?  (0) 2021.08.21