상태란?
객체지향 프로그래밍(OOP)에서 객체(Object)가 변수로 자신의 상태(state)를 가짐.
프론트엔드에선 동적으로 표현할 수 있는 데이터
목표한 UI/UX를 구현하기 위해 적절히 상태(데이터)와 그 구조를 정의, 설계하고 상태를 잘 추적하는 일.
가장 좋은 상태 관리는 관리할 상태가 없는 것
‘상태’는 잠재적인 사이드 이펙트(Side-Effect)이다.
useState
훅 또는 componentDidUpdate
메서드 사용해 DOM 조작, API 호출 등의 side effect 발생 가능ref
객체 생성 시 state 값 변화에 따른 side effect 발생 가능사이드 이펙트의 증가는 곧 개발의 복잡도로 이어지며, 이를 최소화하는 것이 좋다.
따라서 무작정 상태를 선언하고 관리하며 전역 변수 라이브러리를 남용하는 것이 아닌,
useState
useReducer
import { useReducer } from 'react';
function reducer(state, action) {
if (action.type === 'incremented_age') {
return {
age: state.age + 1
};
}
throw Error('Unknown action.');
}
export default function Counter() {
const [state, dispatch] = useReducer(reducer, { age: 42 });
return (
<>
<button onClick={() => {
dispatch({ type: 'incremented_age' })
}}>
Increment age
</button>
<p>Hello! You are {state.age}.</p>
</>
);
}
useContext
import { createContext, useContext } from 'react';
const ThemeContext = createContext(null);
export default function MyApp() {
return (
<ThemeContext.Provider value="dark">
<Form />
</ThemeContext.Provider>
)
}
function Form() {
return (
<Panel title="Welcome">
<Button>Sign up</Button>
<Button>Log in</Button>
</Panel>
);
}
function Panel({ title, children }) {
const theme = useContext(ThemeContext);
const className = 'panel-' + theme;
return (
<section className={className}>
<h1>{title}</h1>
{children}
</section>
)
}
function Button({ children }) {
const theme = useContext(ThemeContext);
const className = 'button-' + theme;
return (
<button className={className}>
{children}
</button>
);
}