컴포넌트의 상태값을 리덕스처럼 관리하기: useReducer
useReducer
란?useReducer
를 사용하면 컴포넌트의 상태값을 리덕스의 리듀서처럼 관리할 수 있다.
useReducer
사용 예시import React, { useReducer } from 'react';
const INITIAL_STATE = { name: 'yr', age: 0 }; // (1)
const reducer = ( state, action ) => {
switch ( action.type ) { // (2)
case 'setName':
return { ...state, name: action.name };
case 'setAge':
return { ...state, age: action.age };
default:
return state;
};
};
const Profile = () => {
// (3)
const [state, dispatch] = useReducer( reducer, INITIAL_STATE );
return (
<div>
<p>{`name is ${state.name}`}</p>
<p>{`age is ${state.age}`}</p>
<input
type = 'text'
value = {state.name}
onChange = {(e) => // (4)
dispatch({ type: 'setName', name: e.currentTarger.value })
}
/>
<input
type = 'text'
value = {state.age}
onChange = {(e) => // (4)
dispatch({ type: 'setAge', age: e.currentTarger.value })
}
/>
</div>
);
};
useReducer
를 선언할 때엔 매개변수로 두 개의 인자를 받는데,dispatch
함수와 같은 방식으로 사용하여 처리보통 상위 컴포넌트에서 다수의 상태값을 관리한다.
이때 자식 컴포넌트로부터 발생한 이벤트에서 상위 컴포넌트의 상태값을 변경해야 하는 경우가 많은데, 이를 위해 상위 컴포넌트에서 트리의 깊은 곳까지 이벤트 처리 함수를 전달한다.
이 작업은 번거롭고, 코드의 가독성이 떨어진다.... 🥲🥲
useReducer 와 Context API 사용하면 쉽게 구현할 수 있다
useReducer
: 상태값 관리Context API
:Provider
로 전달
// ...
export const ProfileDispatch = React.createContext(null); // (1)
// ...
const Profile = () => {
const [state, dispatch] = useReducer( reducer, INITIAL_STATE );
return (
<div>
// ...
<ProfileDispatch.Provider value = {dispatch}> // (2)
<SomeComponent />
</ProfileDispatch.Provider>
</div>
)
};
Context 객체
생성dispatch
를 전달하는 Context 객체
생성Provider
를 통해 전달Provider
를 통해 dispatch
를 전달