π§ββοΈ state λμ΄μ¬λ¦¬κΈ°(Lifting State Up) ν¨μ : λΆνμν μμ μ»΄ν¬λνΈ λ¦¬λ λλ§ μ λ°
Summary
State λμ΄μ¬λ¦¬κΈ°λ μν 곡μ λ₯Ό μν μ€μν ν¨ν΄μ΄μ§λ§, κ³Όλνκ² μ¬μ©νλ©΄ λΆνμν 리λ λλ§μ μ λ°νκ³ μ±λ₯ μ νλ₯Ό μ΄λν©λλ€. νμν μ΅μ κ³΅ν΅ λΆλͺ¨κΉμ§λ§ μνλ₯Ό λμ΄μ¬λ¦¬κ³ , λ©λͺ¨μ΄μ μ΄μ κΈ°λ²κ³Ό μ»΄ν¬λνΈ λΆλ¦¬λ₯Ό ν΅ν΄ 리λ λλ§μ μ΅μ νν΄μΌ ν©λλ€.
Why Wrong?
State λμ΄μ¬λ¦¬κΈ°λ Reactμμ μ»΄ν¬λνΈ κ° μν 곡μ λ₯Ό μν ν΅μ¬ ν¨ν΄μ΄μ§λ§, 무λΆλ³νκ² μ μ©νλ©΄ μ€νλ € μ±λ₯ μ νλ₯Ό μ΄λν μ μμ΅λλ€. νΉμ μνμ κ΄λ ¨ μλ μμ μ»΄ν¬λνΈκΉμ§ 리λ λλ§μ μ λ°νμ¬ λΉν¨μ¨μ μΈ μ λ°μ΄νΈλ₯Ό λ°μμν€κΈ° λλ¬Έμ λλ€. νΉν 볡μ‘ν μ»΄ν¬λνΈ νΈλ¦¬μμ μ΅μμ μ»΄ν¬λνΈλ‘ μνλ₯Ό λμ΄μ¬λ¦¬λ κ²½μ°, μμ μν λ³νμλ μ± μ μ²΄κ° λ¦¬λ λλ§λ μ μμ΅λλ€. λν μνλ₯Ό λμ΄μ¬λ¦° μ»΄ν¬λνΈκ° λΆνμνκ² μ»€μ§κ³ 볡μ‘ν΄μ Έ μ μ§λ³΄μμ±μ΄ λ¨μ΄μ§ μ μμ΅λλ€.
How to Fix?
State λμ΄μ¬λ¦¬κΈ°λ₯Ό μ μ©νκΈ° μ μ μν 곡μ μ νμμ±μ μ μ€νκ² νλ¨ν΄μΌ ν©λλ€. μνκ° νμν μ΅μ κ³΅ν΅ λΆλͺ¨(Nearest Common Ancestor) μ»΄ν¬λνΈκΉμ§λ§ μνλ₯Ό λμ΄μ¬λ¦¬κ³ , Context APIλ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ μ μ μν κ΄λ¦¬κ° νμν κ²½μ°μλ§ μ΅μμ μ»΄ν¬λνΈλ‘ μνλ₯Ό μ΄λμν€λ κ²μ΄ μ’μ΅λλ€. React.memo, useMemo, useCallback ν μ μ¬μ©νμ¬ λΆνμν 리λ λλ§μ λ°©μ§νκ³ , μ»΄ν¬λνΈ λΆλ¦¬λ₯Ό ν΅ν΄ μν μ λ°μ΄νΈ λ²μλ₯Ό μ νν΄μΌ ν©λλ€.
Before Code (Bad)
// μ΅μμ μ»΄ν¬λνΈ
function App() {
const [text, setText] = useState('');
const handleChange = (e) => {
setText(e.target.value);
};
return (
<div>
<InputComponent text={text} onChange={handleChange} />
<DisplayComponent text={text} />
</div>
);
}
// μ
λ ₯ μ»΄ν¬λνΈ
function InputComponent({ text, onChange }) {
console.log('InputComponent rendered');
return (
<input type="text" value={text} onChange={onChange} />
);
}
// μΆλ ₯ μ»΄ν¬λνΈ
function DisplayComponent({ text }) {
console.log('DisplayComponent rendered');
return (
<p>μ
λ ₯ κ°: {text}</p>
);
}
After Code (Good)
// μ΅μμ μ»΄ν¬λνΈ
function App() {
const [text, setText] = useState('');
const handleChange = useCallback((e) => {
setText(e.target.value);
}, []);
return (
<div>
<InputComponent onChange={handleChange} />
<DisplayComponent text={text} />
</div>
);
}
// μ
λ ₯ μ»΄ν¬λνΈ (λ©λͺ¨μ΄μ μ΄μ
μ μ©)
const InputComponent = React.memo(function InputComponent({ onChange }) {
console.log('InputComponent rendered');
return (
<input type="text" onChange={onChange} />
);
});
// μΆλ ₯ μ»΄ν¬λνΈ
function DisplayComponent({ text }) {
console.log('DisplayComponent rendered');
return (
<p>μ
λ ₯ κ°: {text}</p>
);
}