리액트 기초 : Hook

Hook이란?
클래스형 컴포넌트에서 사용할 수 있었던 state 정의, state 업데이트, 생명 주기 함수를
함수형 컴포넌트에서도 사용할 수 있게 해주는 기술입니다.
Hook 중에서 자주 사용하는 몇가지 입니다.

useState

컴포넌트에 특정 값을 추가할 때 사용합니다.

사용법
const [변수명, set함수명] = useState(초기값);
Bad
import React, { useState } from "react";

function Counter(props) {
    var count = 0;

    return (
        <div>
            <h1>클릭 횟수 : {count}</h1>
            <button onClick={() => count++}>
                클릭
            </button>
        </div>
    )
}

위 예제는 버튼 클릭할 때 마다 count의 값은 증가하지만 재 렌더링이 일어나지 않아 화면에 표시되지 않습니다.

Good
import React, { useState } from "react";

function Counter(props) {
    const [count, setCount] = useState(0);

    return (
        <div>
            <h1>클릭 횟수 : {count}</h1>
            <button onClick={() => setCount(count + 1)}>
                클릭
            </button>
        </div>
    )
}

count의 값이 바뀜에 따라 재렌더링이 일어나 화면에 표시되게 됩니다.

useEffect

사용법
useEffect(이펙트 함수, 의존성 배열);

의존성 배열이 변경되었을때 이펙트 함수가 실행됩니다.
이펙트 함수는 첫 렌더링시, 재렌더링시 실행 됩니다.
의존성 배열에 빈 배열([])을 넣으면 마운트와 언마운트시에 단 한 번씩만 실행 됩니다.
의존성 배열을 생략하면 컴포넌트가 업데이트 될 때마다 실행 됩니다.

function useStatus(props) {
    const [count, setCount] = useState(0);
    useEffect(() => {
        document.title = `총 ${count}번 클릭했습니다.`;
    });

    const [isOnline, setIsOnline] = useState(null);
    useEffect(() => {
        ServerAPI.setUserStatus(props.user.id, toggleStatus);
        return () => {
            ServerAPI.resetUserStatus(props.user.id, toggleStatus);
        }
    });

    function toggleStatus(status) {
        setIsOnline(status.isOnline)
    }
}

useMemo

동일한 연산을 반복수행 할 때 연산한 결과를 저장해두고 동일한 연산시에 이를 생략하여
프로그램의 실행 속도를 높이는 Hook 입니다.

사용법
const memoizedValue = useMemo(() => {
        // 연산량이 높은 작업을 수행하여 결과를 반환
        return computedExpensiveValue(의존성 변수1, 의존성 변수2);
    },[의존성 변수1, 의존성 변수2]
);
import { useMemo } from 'react';

function TodoList({ todos, tab, theme }) {
  const visibleTodos = useMemo(() => filterTodos(todos, tab), [todos, tab]);
  // ...
}

현재 할일 목록과 tab 활성화가 변경 되었을 경우에만 함수가 실행 됩니다.
useEffect는 값이 변할때마다 실행을 하는 개념이고,
useMemo는 특정 결과값을 캐싱 해놓는다는 개념으로 접근하면 쉽습니다.

useCallback

useMemo Hook과 유사하지만 값 대신 함수를 반환합니다.

사용법
const memoizedCallback = useCallback(() => {
        doSomething(의존성 변수1, 의존성 변수2);
    },[의존성 변수1, 의존성 변수2]
)
동일한 기능의 useMemo와 useCallback
useCallback(함수, 의존성 배열);
useMemo(() => 함수, 의존성 배열);

useMemo와 마찬가지로 특정함수를 캐싱해 놓는다고 생각하면 쉽습니다.
물론 의존성 배열 값이 바뀌면 함수는 재정의 됩니다.

useRef

특정 요소를 참조하는 Hook 입니다.

사용법
const refContainer = useRef(초기값);
function textInput(props) {
    const inputElem = useRef(null);

    const onButtonClick = () => {
        inputElem.current.focus();
    };

    return (
        <input ref={inputElem} type="text" />
        <button onClick={onButtonClick}>
            Focus the Input
        </button>
    )
}