
클래스 컴포넌트에서만 가능했던 state(상태관리)와 lifecycle(라이프사이클)이 가능하도록 돕는 기능 → 함수형 컴포넌트에서도 사용 가능
메모이제이션 이란?
컴퓨터 프로그램이 동일한 계산을 반복해야 할 때, 이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도를 빠르게 하는 기술
const memoizedValue = useMemo(callback, dependency);
function calc(a,b) {
return a + b;
}
// 함수형 컴포넌트
const MyComponent() {
const result = calc(3,5);
return <p>{result}</p>
}
const memoizedCallback = useCallback(callback, dependency);
const onClick = useCallback(e => {
e.preventDefault();
setNumber(number + 1);
}, [number]),
Reducer 란?
현재 상태와 업데이트를 위해 필요한 정보를 담은 액션 값을 전달받아 새로운 상태를 반환하는 함수
const [state, dispatch] = useReducer(reducer, initialState);
// state : 현재 상태
// dispatch : 액션을 발생시키는 함수
// reducer : state를 업데이트하는 함수
// initialState : 상태의 초기값
import React, { useReducer } from 'react';
const initState = { value : 0 }; // 초기 상태값
// 3. Reducer - 현재 state와 action 값을 전달받아 새로운 state 반환
const reducer = (prevState, action) => {
// action : {type: xxx}
switch (action.type) {
case 'INCREMENT':
return { value: prevState.value + 1 };
case 'DECREMENT':
return { value: prevState.value - 1 };
case 'RESET':
return initState;
default:
return {value: prevState.value};
}
};
export default function UseReducerEx() {
// reducer: state를 업데이트 하는 함수
// dispatch : 액션(state가 어떻게 변경되어야 하는지에 대한 힌트)을 발생시키는 함수
// state : 현재 상태
// 1. Reducer 정의
const [state, dispatch] = useReducer(reducer, initState);
// 2. dispatch 함수로 action 값 전달 - dispatch는 action 값을 받아 state와 함께 3으로 전달
const increment = () => dispatch({ type: 'INCREMENT' });
const decrement = () => dispatch({ type: 'DECREMENT' });
const reset = () => dispatch ({ type: 'RESET' });
return (
<div>
<h1>{state.value}</h1>
<button onClick={increment}>Plus</button>
<button onClick={decrement}>Minus</button>
<button onClick={reset}>Reset</button>
</div>
);
}
useState() vs. useReducer()
- useReducer()가 useState() 기반이라고 해서 더 좋은 것은 아님
- 상황에 따라 유동적으로 선택
- state가 단순하면 → useState()를 사용
- state가 복잡하면 → useReducer()를 사용 (객체, 배열 같이 하위 요소가 많은 경우)
더 많은 Hooks를 알고 싶다면?
https://react.dev/reference/react