본문 바로가기

Front/React

React - React Hook (중요 포인트)

공식 홈페이지

ko.reactjs.org/docs/hooks-intro.html

 

 

Hook 이란

React에서 제공하는 기능. (React 16.8 이후 추가됨)

함수형 컴포넌트에서 state와 lifeCycle method를 잘 사용할 수 있게 만들어진 것

this를 사용하지 않아 가독성 및 편리성이 좋고, 코드중복을 줄일 수 있다는 장점이 있다.

 

출처

ko.reactjs.org/docs/hooks-overview.html

 

 


 

state와 props가 변경될 때 호출 차이 (클래스컴포넌트 vs 함수형 컴포넌트)

클래스 컴포넌트에서 멤버변수는 클래스가 만들어질 때 한번만 만들어지고, render함수만 반복적으로 호출된다.

함수형 컴포넌트에서는 함수의 블럭안에 있는 코드 전부가 반복적으로 호출된다. (함수 내 지역변수 포함)

 

함수가 prop으로 자식컴포넌트에 전달되는 경우,

부모컴포넌트에서는 함수가 계속해서 새로 만들어지므로

자식컴포넌트에서는 prop의 오브젝트가 변경되었다 여기고 컴포넌트를 업데이트하기 때문에 

side effect가 발생할 수 있다. (아래 코드 참고)

 

이 때, useCallback() 을 이용해 함수를 메모리에 저장해 둘 수 있다.

 

--------------------------------------------------------------------------------------

const handleIncrement = () => {

    setCount(count + 1);

  }

 

  return (

      <button

        className="habit-button habit-increase"

        onClick={handleIncrement}

      >

        <i className="fas fa-plus-square"></i>

      </button>

  );

}

--------------------------------------------------------------------------------------

 

 

 


 

Hook의 사용법

useState, useRef, useCallback, useEffect

위의 api들은 모두 메모리에 별도로 저장시키기 때문에 업데이트로 인해 반복적으로 호출되어도 초기화 되지 않는다.

 

1. useState : state사용

const [변수명, set함수명] = useState(초기값);

 

2. useRef : ref사용

const 변수명 = useRef();

인자 없음.

 

3. useCallback : 함수를 메모리에 저장

const 함수명 = useCallback(함수);

 

4. useEffect : componentDidMount + componentDidupdate

useEffect(실행함수, 실행조건-변화했는지 체크할 변수의 배열)

두번째 인자는 필수아님.

두번째 인자를 넣지 않았을 때는 mount될때와 update될때 무조건 함수 실행.

 

 

 

--------------------------------------------------------------------------------------

import React, { useState, useRef, useCallback, useEffect } from 'react';

 

const SimpleHabit = (props) => {

 

  const [count, setCount] = useState(0);

  const spanRef = useRef();

  const handleIncrement = useCallback(() => {

    setCount(count + 1);    //count state사용 및 set

  });

 

  useEffect(()=>{

    console.log(`mount & update!! count : ${count}`);

  }, []);    //두번째 인자가 []일때는 mount일때만 함수 실행.



  return (

    <li className="habit">

      <span ref={spanRef} className="habit-name">Reading</span>

      <span className="habit-count">{count}</span>

      <button

        className="habit-button habit-increase"

        onClick={handleIncrement}

      >

        <i className="fas fa-plus-square"></i>

      </button>

    </li>

  );

};

 

export default SimpleHabit;

--------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

'Front > React' 카테고리의 다른 글

React - Netlify에 배포하기  (0) 2021.05.12
React - GitHub Page에 배포하기  (0) 2021.05.11
React - PureComponent & memo  (0) 2021.05.10
React - 디버깅 tip  (0) 2021.05.10
React - Dom과 컴포넌트에 접근하는 방법(Refs)  (0) 2021.05.09