[React] 리액트 훅에 대해 알아보기(React Hooks란?)

2022. 5. 29. 02:55· Web dev/React
목차
  1. 1. React Hooks란?
  2. 2. Hook 규칙
  3. 3. 자주 사용하는 React Hook 알아보기
  4. 1) useState
  5. 2) useEffect
  6. 3) useRef
  7. 4) useMemo, useCallback
반응형

1. React Hooks란?

리액트 훅은 리액트 클래스형 컴포넌트에서 이용하던 코드를 작성할 필요없이 함수형 컴포넌트에서 다양한 기능을 사용할 수 있게 만들어준 라이브러리라고 할 수 있는데 React 16.8버전에 새로 추가된 기능이다. 이는 함수형 컴포넌트에 맞게 만들어진 것으로 함수형 컴포넌트에서만 사용 가능하다.

 

2. Hook 규칙

1) 최상위에서만 Hook을 호출해야한다.

  • 반복문이나 조건문 혹은 중첩된 함수 내에서 Hook을 호출하면 안된다.
  • 리액트 훅은 호출되는 순서에 의존하기 때문에 조건문이나 반복문 안에서 실행하게 될 경우 해당 부분을 건너뛰는 일이 발생할 수도 있기 때문에 순서가 꼬여 버그가 발생할 수 있다. 
  • 그렇기 때문에 이 규칙을 따르면 useState 와 useEffect가 여러번 호출되는 경우에도 Hook의 상태를 올바르게 유지할 수 있게 된다.

2) 리액트 함수 내에서만 Hook을 호출해야한다.

  • Hook은 일반적인 js 함수에서는 호출하면 안된다.
  • 함수형 컴포넌트나 custom hook에서는 호출 가능하다.

 

3. 자주 사용하는 React Hook 알아보기

1) useState

useState는 상태를 관리하는 훅으로 다음과 같은 특징을 가진다.

  • 함수형 컴포넌트 안에 state를 추가하여 사용한다.
  • 현재 상태를 나타내는 state값과 이 상태를 변경하는 setState값을 한 쌍으로 제공한다.
  • state는 초기값을 설정할 수 있으며, 초기값은 첫 렌더링 때 한번 사용된다.
  • state는 객체일 필요 없이 문자열, 숫자, boolean, 배열, null, 객체 등의 여러가지 다양한 값을 넣을 수 있다.
import React, { useState } from 'react';

function Example() {
  // "count"라는 새 상태 변수를 선언합니다
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      // 버튼을 클릭할 때마다 기존의 state 기본값인 0에 1이 더해진다.
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

 

2) useEffect

useEffect는 기존 클래스형 컴포넌트에서 사용했던 componentDidMount, componentDidUpdate, componentWillUnmount를 하나의 API로 통합한 것으로 다음과 같은 특징을 가진다.

  • useEffect는 기본적으로 useEffect(function, deps)의 형태를 사용한다.
  • function에는 실행시킬 함수를 넣고 deps에는 의존성 배열을 담는다.
  • 의존성 배열에 어떤 것이 담기느냐에 따라 부수적인 효과 함수가 실행된다.
  • 가장 먼저 의존성 배열 없이 useEffect를 실행시키게 되면 페이지가 렌더링 될 때마다 데이터를 불러온다.
import React from 'react';

React.useEffect(() => {
  dispatch(getActions.getFundingAC(page));
});
  • 두번째로 의존성 배열에 빈배열을 담아주게 될 경우에는 첫 렌더링 시에만 함수를 실행한다.
import React from 'react';

React.useEffect(() => {
  dispatch(getActions.getFundingAC(page));
}, []);
  • 마지막으로 의존성 배열에 state값이나 props로 상속받은 데이터값 등을 담아주게 되면 해당값이 변할 때마다 함수를 실행한다.
import React from 'react';

const [page, setPage] = React.useState(1)

React.useEffect(() => {
  dispatch(getActions.getFundingAC(page));
}, [page]);

이 외에도 useEffect에서는 언마운트시에 cleanup함수를 적용시킬 수 있다.

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

useEffect(() => {
    dispatch(getActions.getFundingDetailAC(fundId));
    return () => {
      dispatch(getActions.clean())
    }
}, []);

 

3) useRef

useRef는 특정 DOM에 접근하여 DOM 조작을 가능하게 하는 훅이다. 리액트 프로젝트에서도 특정 요소를 선택해야하는 상황이 생길 수 있는데 이러한 상황에서 useRef 함수를 사용할 수 있게 된다.

import React, { useState, useEffect, useRef } from "react";
import AudioPlayer from "react-h5-audio-player";
import "react-h5-audio-player/lib/styles.css";

const FundingDetail = () => {

  // 오디오플레이어에 접근하기 위함
  const player = useRef();
  
  // 오디오 플레이어 자동재생막기
  useEffect(() => {
    player.current.audio.current.pause();
  }, [fundingDetail]);
  
  return (
	<React.Fragment >
      {/* 오디오 플레이어 */}
      <AudioPlayer
        className="audio"
        autoPlay={false}
        src={fundingDetail.File}
        volume={1}
        showJumpControls={false}
        // useRef 사용을 위한 ref 지정
        ref={player}
      />            
    </React.Fragment >
  );
};

export default FundingDetail;

 

4) useMemo, useCallback

useMemo와 useCallback은 모두 메모이제이션과 관련이 있어 리액트를 사용하며 성능 개선을 위해 많이 사용한다. 여기서 메모이제이션이라는 것은 기존에 수행한 연산의 결과 값을 어딘가에 저장해두었다가 동일한 입력이 들어오면 재활용하겠다는 프로그래밍 기법이라고 할 수 있다. 그렇기 때문에 useMemo나 useCallback 훅을 적절하게 사용하면 중복된 연산을 피할 수 있어 애플리케이션의 성능을 최적화할 수 있다는 장점이 있다.

useMemo와 useCallback이 비슷한 동작을 하긴하지만 두가지의 차이도 존재한다. 먼저 useMemo의 경우에는 메모이제이션된 값을 반환하는 훅이고 useCallback은 메모이제이션 된 함수를 반환한다는 특징을 가진다.

반응형
저작자표시 비영리 동일조건 (새창열림)
  1. 1. React Hooks란?
  2. 2. Hook 규칙
  3. 3. 자주 사용하는 React Hook 알아보기
  4. 1) useState
  5. 2) useEffect
  6. 3) useRef
  7. 4) useMemo, useCallback
'Web dev/React' 카테고리의 다른 글
  • [React] 리액트 lazy loading 적용하기(lighthouse 성능 최적화)
  • [React] 리액트 전역상태관리 리덕스(Redux, Redux-thunk, immer 사용)
  • [React] 리액트 State와 Props의 차이(...defaultProps)
  • [React] 리액트 JSX 문법 컴포넌트 표현하기
도잎
도잎
프론트엔드 개발 성장기록
도잎
JDevelog
도잎
전체
오늘
어제
반응형
  • 분류 전체보기 (149)
    • Web dev (48)
      • React (22)
      • Vue (8)
      • Next.js (6)
      • Node.js (2)
      • Springboot (2)
    • App dev (2)
      • Flutter (2)
    • Language (33)
      • javascript (30)
      • typescript (2)
      • java (1)
    • StyleSeet (3)
      • CSS (3)
      • Sass (0)
    • Database (2)
      • PostgreSQL (1)
    • DevOps (11)
      • Webpack (4)
      • Linux (3)
      • Docker (2)
      • Tomcat (1)
    • 개발지식 (2)
      • Web (1)
    • 항해99(6기) (20)
    • UXUI (0)
    • 알고리즘 (25)
    • 유용정보 (2)

최근 글

hELLO · Designed By 정상우.v4.2.1
도잎
[React] 리액트 훅에 대해 알아보기(React Hooks란?)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.