Post

React Hooks

React Hooks

React 16.8 버전부터 추가된 개념이다. 함수형 프로그래밍을 위해 도입된 기능이며, 클래스를 사용하지 않고도 State를 이용하고 React의 기능들을 사용할 수 있다.

Hooks Rules

  • 최상위 코드레벨에서만 Hooks를 호출해야한다. 루프나 조건 혹은 함수 내에서 Hooks을 생성하면 안된다.

  • React의 함수 Component에서만 Hooks을 사용해야 한다. 일반 JavaScript에서는 사용할 수 없다.

useState

StateFul한 값과 이를 업데이트할 수 있는 함수를 반환한다.

Example

1
2
3
4
5
6
import React, { useState } from "react";

const [state, stateChanged] = useState<string>('');

// 이런식으로 state를 업데이트할 수 있다. 새 state 값은 Component의 ReRendering 목록에 쌓이게 된다.
stateChanged('변경값');

useEffect

useEffect는 React의 Component에서 DOM 변경, 데이터 변경 등의 이벤트가 일어날 때 발생되는 작업이다. useEffect 하나로 componentDidMount, componentDidUpdate 등의 React 클래스에서 제공한 라이프 사이클 같이 사용할 수 있다.

하나의 컴포넌트에서 여러개의 useEffect를 사용할 수 있다.

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import React, { useState , useEffect } from "react";

function EffectEx() {
    const [cnt, cntChanged] = useState(1);
    const [cnt2, cnt2Changed] = useState(1);

    // 두번째 인자를 무엇으로 넣는지에 따라 업데이트 기준을 잡을 수 있다.
    
    // cnt가 변경될 때만 실행
    useEffect(() => {
        console.log(cnt+1);
    }, cnt);

    // 컴포넌트가 처음 DOM에 올라갈 때 실행
    useEffect(() => {
        console.log('first Start');
    }, []);

    // cnt 또는 cnt2 가 변경될 때 실행
    useEffect(() => {
        console.log(`cnt2${cnt2}` );
    }, [cnt, cnt2]);

    return (
        <div>
            <p>Count: {cnt} </p>
            <button onClick={() => cntChanged(cnt+1)}>값 증가</button>
        </div>
    )
}

useMemo

메모리제이션 된 값을 반환하는 Hook이다. 쉽게 말해서 State를 메모리에 적재해 뒀다가 의존성 배열에 넘겨준 값이 변경되었을 때만 새로운 메모리제이션된 값을 반영한다. 복잡한 코드가 매번 리렌더링 될때마다 실행되는 걸 제한하기 위한 최적화를 위한 Hook이다.

1
2
3
4
5
6
import React, { useMemo } from "react";

const [stateVal, valChange] = useState(1)
const [stateVal2, valChange2] = useState(1)

const doubleValue = useMemo(() => stateVal * 2, [stateVal]) 

useMemo로 생성하지 않으면 stateVal2가 바뀔때마다 doubleValue도 항상 새로 계산하게 된다. useMemo로 생성하면 두 번째 인자로 들어가는 stateVal이 변경될때만 doubleValue을 새로 계산한다.

useCallback

메모리제이션 된 함수를 반환하는 Hook이다. useMemo와의 차이는 반환 하는 것에 차이 그 뿐이다.

1
2
3
4
5
6
import React, { useCallback } from "react";

const [stateVal, valChange] = useState(1)
const [stateVal2, valChange2] = useState(2)

const CallbackEx = useCallback(() => MemoValue(stateVal), [stateVal])

useCallback로 만들어 두지 않으면 stateVal, stateVal2 하나라도 값이 변경되면 리렌더링 되면서 CallbackEx 함수가 무조건 선언된다.

위에처럼 useCallback로 선언하고 2번째 인자(여기서는 StateVal) 로 의존할 배열을 채워 놓으면 stateVal이 변경될때만 CallbackEx함수가 선언되게 된다.

This post is licensed under CC BY 4.0 by the author.