Post

React Hooks

안녕하세요! 오늘은 React Hooks에 대해 알아보겠습니다. React Hooks는 함수형 컴포넌트에서 상태와 생명 주기 기능을 사용할 수 있게 해주는 기능입니다. Hooks를 사용하면 코드가 더 간결하고 직관적이게 됩니다.

React Hooks

1. useState

useState 훅은 함수형 컴포넌트에서 상태를 관리할 수 있게 해줍니다. 초기 상태 값을 인수로 받아 상태 값과 상태 값을 갱신할 수 있는 함수를 반환합니다.

1
2
3
4
5
6
7
8
9
10
11
12
import React, { useState } from 'react';

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

    return (
        <div>
            <p>Count: {count}</p>
            <button onClick={() => setCount(count + 1)}>Increment</button>
        </div>
    );
}

2. useEffect

useEffect 훅은 함수형 컴포넌트에서 사이드 이펙트를 수행할 수 있게 해줍니다. 컴포넌트가 렌더링될 때마다 특정 코드를 실행할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import React, { useState, useEffect } from 'react';

function Timer() {
    const [seconds, setSeconds] = useState(0);

    useEffect(() => {
        const interval = setInterval(() => {
            setSeconds(prevSeconds => prevSeconds + 1);
        }, 1000);

        return () => clearInterval(interval);
    }, []);

    return (
        <div>
            <p>Seconds: {seconds}</p>
        </div>
    );
}

3. useContext

useContext 훅은 Context API와 함께 사용되어 컨텍스트 값을 쉽게 접근할 수 있게 해줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import React, { useContext } from 'react';
import { ThemeContext } from './ThemeContext';

function ThemedButton() {
    const { theme, setTheme } = useContext(ThemeContext);

    return (
        <button
            style=
            onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}
        >
            Toggle Theme
        </button>
    );
}

4. useReducer

useReducer 훅은 상태 관리 로직을 컴포넌트 외부로 분리하고, 복잡한 상태 관리를 간단하게 할 수 있게 해줍니다. 이는 Redux와 비슷한 패턴을 제공합니다.

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
import React, { useReducer } from 'react';

const initialState = { count: 0 };

function reducer(state, action) {
    switch (action.type) {
        case 'increment':
            return { count: state.count + 1 };
        case 'decrement':
            return { count: state.count - 1 };
        default:
            throw new Error();
    }
}

function Counter() {
    const [state, dispatch] = useReducer(reducer, initialState);

    return (
        <div>
            <p>Count: {state.count}</p>
            <button onClick={() => dispatch({ type: 'increment' })}>Increment</button>
            <button onClick={() => dispatch({ type: 'decrement' })}>Decrement</button>
        </div>
    );
}

5. useRef

useRef 훅은 컴포넌트에서 DOM 요소나 변수 값을 저장하고 접근할 수 있게 해줍니다. 리렌더링 없이 값이 유지됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import React, { useRef, useEffect } from 'react';

function FocusInput() {
    const inputRef = useRef(null);

    useEffect(() => {
        inputRef.current.focus();
    }, []);

    return (
        <div>
            <input ref={inputRef} type="text" />
        </div>
    );
}

6. useMemo

useMemo 훅은 값의 계산을 메모이제이션하여 성능을 최적화할 수 있게 해줍니다. 특정 값이 변경될 때만 연산을 수행합니다.

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
import React, { useState, useMemo } from 'react';

function ExpensiveComputation({ num }) {
    const compute = (n) => {
        console.log('Computing...');
        return n * 2;
    };

    const result = useMemo(() => compute(num), [num]);

    return <div>Result: {result}</div>;
}

function App() {
    const [number, setNumber] = useState(1);
    const [increment, setIncrement] = useState(0);

    return (
        <div>
            <ExpensiveComputation num={number} />
            <button onClick={() => setNumber(number + 1)}>Change Number</button>
            <button onClick={() => setIncrement(increment + 1)}>Re-render</button>
        </div>
    );
}

7. useCallback

useCallback 훅은 함수의 메모이제이션을 통해 성능을 최적화할 수 있게 해줍니다. 특정 값이 변경될 때만 함수를 재생성합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import React, { useState, useCallback } from 'react';

const Button = React.memo(({ handleClick }) => {
    console.log('Button rendered');
    return <button onClick={handleClick}>Increment</button>;
});

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

    const increment = useCallback(() => {
        setCount(count + 1);
    }, [count]);

    return (
        <div>
            <p>Count: {count}</p>
            <Button handleClick={increment} />
        </div>
    );
}

결론

React Hooks는 함수형 컴포넌트에서 상태와 생명 주기 기능을 사용할 수 있게 해주는 강력한 도구입니다. useState, useEffect, useContext, useReducer, useRef, useMemo, useCallback 등 다양한 훅을 통해 코드의 가독성을 높이고, 상태 관리를 효율적으로 할 수 있습니다.

오늘도 제 글을 읽어주셔서 감사합니다. 다음 시간에 더 유익한 주제로 찾아뵙겠습니다.

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