react์ ๋ฐ์ดํฐ ํ๋ฆ์ ๋จ๋ฐฉํฅ
์ด๋ค. ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ฒฝ์ฐ์๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ์๊ฒ๋ง ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ค ์ ์๋ค.
๋ง์ฝ ๋ถ๋ชจ ์ปดํฌ๋ํธ ์๋์ ์์ ์ปดํฌ๋ํธ1๊ณผ ์์ ์ปดํฌ๋ํธ2๊ฐ ์๋ค๋ฉด, ์์ ์ปดํฌ๋ํธ1์ state๋ฅผ ์์ ์ปดํฌ๋ํธ2์์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
๋ฐ๋ก ์์ ์ปดํฌ๋ํธ state์ setState๋ฅผ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก ๋์ด์ฌ๋ ค ์ ์ธํด์ฃผ๋ ๊ฒ์ด๋ค! ๊ทธ๋ฆฌ๊ณ props๋ก state๋ฅผ ๋ด๋ ค์ค ๊ฒฝ์ฐ, ์์ ์ปดํฌ๋ํธ 1,2์์ ๋ชจ๋ state๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด๊ฒ์ state ๋์ด์ฌ๋ฆฌ๊ธฐ(state lifting)์ด๋ผ๊ณ ํ๋ค.
state lifting์ ์์์ state๋ฅผ ๋ถ๋ชจ์๊ฒ ๋๊ฒจ์ค ๊ฒ ๊ฐ์ ํจ๊ณผ๋ฅผ ์ค๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์์ ์ปดํฌ๋ํธ1์ state๋ฅผ ์์ ์ปดํฌ๋ํธ2์๋ ๋๊ฒจ์ค ์ ์๊ฒ ๋๋ค. ์์๋ฅผ ๋ณด๋ฉด ๋ ์ ์ดํดํ ์ ์๋ค.
// ๋ถ๋ชจ ์ปดํฌ๋ํธ
import Child1 from "../../src/components/units/14-lifting-state-up/Child1";
import Child2 from "../../src/components/units/14-lifting-state-up/Child2";
import { useState } from "react";
export default function LiftingStateUpPage() {
const [count, setCount] = useState(0);
return (
<div>
<Child1 count={count} setCount={setCount} />
<div>=========================================</div>
<Child2 count={count} />
</div>
);
}
// ์์ ์ปดํฌ๋ํธ - Child1.tsx
export default function Child1(props) {
const onClickCountUp = () => {
props.setCount((prev) => prev + 1);
};
return (
<div>
<div>์์ 1 ์นด์ดํธ: {props.count}</div>
<button onClick={onClickCountUp}>์นด์ดํธ ์ฌ๋ฆฌ๊ธฐ</button>
</div>
);
}
// ์์ ์ปดํฌ๋ํธ - Child2.tsx
export default function Child2(props) {
return (
<div>
<div>์์ 2 ์นด์ดํธ: {props.count}</div>
<button>์นด์ดํธ ์ฌ๋ฆฌ๊ธฐ</button>
</div>
);
}
๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์๋ state(count)๋ฅผ ์์ ์ปดํฌ๋ํธ๋ค์๊ฒ props๋ก ๋๊ฒจ์ฃผ์๋ค. ์ฌ๊ธฐ์ ์์ ์ปดํฌ๋ํธ1์ ์๋ ์นด์ดํธ ์ฌ๋ฆฌ๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด, ์์ ์ปดํฌ๋ํธ2์ ์๋ count๋ ๊ฐ์ด ์ฆ๊ฐํ๊ฒ ๋๋ค!
์ด์ฒ๋ผ state lifting์ ์๋ก ๋ค๋ฅธ ์์ ์ปดํฌ๋ํธ๋ค๋ผ๋ฆฌ state๋ฅผ ๊ณต์ ํ๊ณ ์ถ์ ๋ ํ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.