React

[React] Hooks

gaongg 2024. 10. 10. 19:56

📑React Hook 이란??

  • 리액트 클래스형 컴포넌트에서 이용하던 코드를 작성할 필요없이 함수형 컴포넌트에서 다양한 기능을 사용할 수 있게 만들어준 라이브러리다.
  • 함수형 컴포넌트에 맞게 만들어진 것으로 함수형 컴포넌트에서만 사용 가능하다.

📑Hook의 규칙

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

  • 호출되는 순서에 의존하기 때문에 조건문이나 반복문 안에서 실행하게 될 경우 해당 부분을 건너뛰는 일이 발생할 수 있어 오류가 발생할 수 있다.

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

  • 일반적인 js 함수에서는 호출하면 안되며 함수형 컴포넌트나 커스텀 훅에서는 호출이 가능하다.

📑자주 사용하는 Hook 

📍useState

useState는 상태를 관리하는 훅으로 아래와 같은 특징이 있다.

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

function Counter() {
    // count라는 상태 변수와 count를 업데이트하는 함수 setCount를 정의
    const [count, setCount] = useState(0);

    return (
        <div>
            <p>현재 카운트: {count}</p>
            <button onClick={() => setCount(count + 1)}>
                카운트 증가
            </button>
        </div>
    );
}

export default Counter;

-useState(0)를 호출하여 count라는 상태 변수를 생성하고, 초기값을 0으로 설정
-useState는 두 개의 요소가 담긴 배열을 반환
 1.첫 번째 요소는 현재 상태 값인 count.
 2.두 번째 요소는 상태를 업데이트하는 함수인 setCount.
-버튼을 클릭할 때마다 setCount를 호출해 count 값을 1씩 증가시킴
-React는 count 값이 업데이트되면 컴포넌트를 다시 렌더링하여 최신 count 값을 표시

 

📍useEffect

useEffect는 기존 클래스형 컴포넌트에서 사용했던 componentDidMount, componenetDidUpdate, componentWillUnmount를 하나로 통합한 것으로 아래와 같은 특징이 있다.

  • 기본적으로 useEffect(function,deps)의 형태를 사용한다.
  • function에는 실행시킬 함수를 넣고 deps에는 의존성 배열을 담는다.
  • 의존성 배열에 어떤 것이 담기느냐에 따라 부수적인 효과 함수가 실행된다.

1. 의존성 배열이 없이 useEffect를 실행시키는 경우 페이지가 렌더링 될 때마다 데이터를 불러온다.

import React from 'react';

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

2. 의존성 배열에 빈배열을 담아주게 될 경우에는 첫 렌더링 시에만 함수를 실행한다.

import React from 'react';

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

3. 의존성 배열에 state값이나 props로 상속받은 데이터값 등은 담아주게 되면 해당값이 변할때마다 함수를 실행한다.

import React from 'react';

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

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

📍useMemo

useMemo는 컴포넌트의 성능을 최적화하는데 사용된다.

메모이제이션 된 값을 반환하는 함수로 deps에 변화가 생기면, 내부에 정의된 콜백 함수를 실행하고 그 함수를 반환하게 된다.

import React, { useState, useCallback, useMemo } from "react";

export default function App() {
  const [buttonX, setButtonX] = useState(0);
  const [buttonY, setButtonY] = useState(0);
  
  const handleButtonX = () => {
    setButtonX((prev) => prev + 1)
  };
  
  const handleButtonY = () => {
    setButtonY((prev) => prev + 1)
  };
  
  useMemo(() => {console.log(buttonX)}, [buttonX]);

  return (
    <>
      <button onClick={handleButtonX}>X</button>
      <button onClick={handleButtonY}>Y</button>
    </>
  );

 


useMemo의 deps가 buttonX이기 때문에 X 버튼을 누를때만 console.log(buttonX)가 실행되게 된다.
Y 버튼을 눌러도 함수 컴포넌트는 리렌더링되지만, buttonX 값은 변하지 않기 때문에 useMemo의 변화가 없게 되는 것이다.

 

 

📍useCallback

useCallback은 useMemo와 다르게 값이아닌 함수를 반환하는 함수이다.

import React, { useState, useCallback, useMemo } from "react";

function App() {
  const [buttonX, setButtonX] = useState(0);
  const [buttonY, setButtonY] = useState(0);
  
  const handleButtonX = () => {
    setButtonX((prev) => prev + 1)
  };
  
  const handleButtonY = () => {
    setButtonY((prev) => prev + 1)
  };
  
  const returnUseCallback = useCallback(() => {console.log(buttonY)}, [buttonX]);
  
  returnUseCallback();
    
  return (
    <>
      <button onClick={handleButtonX}>X</button>
      <button onClick={handleButtonY}>Y</button>
    </>
  );
}

export default App;

 - useCallback 구문은 () => {console.log(buttonY)} 라는 함수를 반환하지만, deps인 buttonX의 변화가 생길때만 반환되게 된다.
- Y 버튼을 계속 누른다고 해도 X 버튼을 누르지 않으면 () => {console.log(0)}의 함수가 반환되고, X 버튼을 누를때에 Y값을 가져와 () => {console.log(새로운값)}이 반환되게 된다.
 - useCallback은 함수와 상관없는 상태 값이 변할 때, 함수 컴포넌트에서 불필요한 업데이트가 일어나는 것을 방지해 준다.

 

 


이 외에도 많은 훅의 종류가 있다고 하여 다음엔  이 글에 이어서 다른 훅을 정리해보려고 한다!