์ ์ด ์ปดํฌ๋ํธ์ ๋น์ ์ด ์ปดํฌ๋ํธ
๋ด๋ถ ๋ณ์ ์ญํ ์ ํ๋ State & ํ๋ผ๋ฏธํฐ ์ญํ ์ ํ๋ Props & React ๋ ๋ฆฝ์ Ref
React Hook ์ ํจ์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐํ๊ณ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๋์ ํ๋ค.
๋ฐ๋ผ์ ํ๋์ ์ปดํฌ๋ํธ๋ฅผ ํ๋์ ํจ์๋ก ์๊ฐํ๋ค๋ฉด, State & Props & Ref ์ธ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ดํดํ๊ธฐ๊ฐ ํจ์ฌ ์ฝ๋ค.
1. State: ๋ด๋ถ ๋ณ์ (์ ์ด ์ปดํฌ๋ํธ)
- State๋ ์ปดํฌ๋ํธ์ ๋ด๋ถ ์ํ๋ฅผ ๋ํ๋ด๋ ๋ณ์๋ก, React์์ ์ง์ ๊ด๋ฆฌํ๋ ๋ณ์์ด๋ค.
- State ๋ณ๊ฒฝ ์ ๋ฆฌ๋ ๋๋ง ๋ฐ์: React๋ state๊ฐ ๋ณ๊ฒฝ๋ ๋ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํ์ฌ UI๋ฅผ ์ต์ ์ํ๋ก ์ ์งํ๋ค.
- ๋ด๋ถ ๋ณ์์ ์๋ฏธ:
- State๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์๋ง ๊ด๋ฆฌ๋๋ฉฐ, ๋ค๋ฅธ ์ปดํฌ๋ํธ์์๋ ์ง์ ์ ๊ทผํ ์ ์๋ค.
- ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋์ผ๋ก ๋ฆฌ๋ ๋๋ง๋๊ธฐ ๋๋ฌธ์, UI๊ฐ ํญ์ ์ํ์ ๋๊ธฐํ๋ ์ํ๋ก ์ ์ง๋๋ค.
import { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0); // count๋ state, setCount๋ state ๋ณ๊ฒฝ ํจ์
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>Click me</button>
</div>
);
}
- ์ ์ฝ๋์์ `count`๋ state๋ก, ํด๋ฆญํ ๋๋ง๋ค ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉฐ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ค.
2. Props: ํ๋ผ๋ฏธํฐ
- Props๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ๋ ๋ฐ์ดํฐ์ด๋ค. ํจ์์ ํ๋ผ๋ฏธํฐ์ฒ๋ผ ๋์ํ๋ค.
- ๋ถ๋ณ(Immutable): Props๋ ์ ๋ฌ๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ, ์ค์ง ์ฝ๊ธฐ ์ ์ฉ์ด๋ค.
โ ๏ธ์ถํ์ ๋์ค๋ State Lifting(์ํ๋์ด์ฌ๋ฆฌ๊ธฐ)์์๋ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค.
props๊ฐ ์ฝ๊ธฐ ์ ์ฉ์ด๋ผ๊ณ ํ๋ ๊ฒ์ props๋ก ๋๊ธฐ๋ ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ ๋ป์ผ๋ฟ, State Lifting์ ์ํด setStateํจ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์๋ค. ํจ์๋ ๋ณํ์ง ์๊ธฐ ๋๋ฌธ์ props๋ก ๋๊ฒจ๋ ์ฝ๊ธฐ ์ ์ฉ์ ์ฌ์ ํ๋ค.
→ State Lifting์ ์์ ์ปดํฌ๋ํธ๋ props๋ฅผ ์์ ํ๋ ์๋ฏธ๊ฐ ์๋๋ผ ๋ถ๋ชจํํ ๋ฐ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ชจ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ.
- ์์ ์ปดํฌ๋ํธ์์ ๋ฐ์ดํฐ ์ ๋ฌ:
- ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ ์์ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ Props๋ฅผ ์ฌ์ฉํ๋ค.
- ์์ ์ปดํฌ๋ํธ๋ Props๋ก ์ ๋ฌ๋ฐ์ ๊ฐ์ ์ฌ์ฉํ์ฌ ๋ ๋๋ง์ ์ํํ๋ค.
function Greeting({ name }) {
return <h1>Hello, {name}!</h1>; // name์ props
}
function App() {
return <Greeting name="John" />; // 'John'์ด props๋ก ์ ๋ฌ๋จ
}
- ์ฌ๊ธฐ์ `name`์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ ๋ฌ๋ props๋ก, ์์ ์ปดํฌ๋ํธ์์ ์ด๋ฅผ ์ฌ์ฉํด ํ๋ฉด์ ์ถ๋ ฅํ๋ค.
3. Ref: ์ธ๋ถ ๋ณ์ (๋น์ ์ด ์ปดํฌ๋ํธ)
- Ref๋ React๊ฐ ์ง์ ๊ด๋ฆฌํ์ง ์๋ ๋ณ์๋ก, ์ปดํฌ๋ํธ์ DOM ์์๋ ์ธ๋ถ ์ํ์ ์ ๊ทผํ ๋ ์ฌ์ฉ๋๋ค
- Ref ๋ณ๊ฒฝ ์ ๋ฆฌ๋ ๋๋ง ์์: Ref์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋์ง ์๋๋ค. ์ด๋ React๊ฐ Ref์ ๋ณ๊ฒฝ์ ์ธ์ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ธ๋ถ ๋ณ์์ ์๋ฏธ:
- Ref๋ ์ฃผ๋ก DOM ์์์ ์ ๊ทผํ๊ฑฐ๋, ์ปดํฌ๋ํธ ์ธ๋ถ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋ ์ฌ์ฉ๋๋ค.
- ๊ฐ์ด ๋ณ๊ฒฝ๋์ด๋ ์ปดํฌ๋ํธ๋ ๋ฆฌ๋ ๋๋ง๋์ง ์์ผ๋ฉฐ, ์ด ๊ฐ์ ์ง์ ์ฐธ์กฐํ์ฌ ์ํ๋ ๋์์ ์ํํ ์ ์๋ค.
import { useRef } from 'react';
function TextInputWithFocusButton() {
const inputEl = useRef(null); // ref๋ก DOM ์์ ์ฐธ์กฐ
const onButtonClick = () => {
inputEl.current.focus(); // input์ ํฌ์ปค์ค ์ค์
};
return (
<>
<input ref={inputEl} type="text" />
<button onClick={onButtonClick}>Focus the input</button>
</>
);
}
- ์ ์ฝ๋์์ `useRef`๋ DOM ์์๋ฅผ ์ฐธ์กฐํ๋ ์ญํ ์ ํ๋ฉฐ, input์ ํฌ์ปค์ค๋ฅผ ์ค ์ ์๋ค. Ref๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์ปดํฌ๋ํธ๋ ๋ฆฌ๋ ๋๋ง๋์ง ์๋๋ค.
State, Props, Ref ์ฐจ์ด์ ์ ๋ฆฌ
๊ตฌ๋ถ | State | Props | Ref |
์ญํ | ์ปดํฌ๋ํธ ๋ด๋ถ ์ํ ๊ด๋ฆฌ | ๋ถ๋ชจ์ปดํฌ๋ํธ์์ ์ ๋ฌ๋ ๋ฐ์ดํฐ | DOM์์๋ ์ธ๋ถ ์ํ ์ฐธ์กฐ |
๋ฆฌ๋ ๋๋ง | ์ํ ๋ณ๊ฒฝ ์ ๋ฆฌ๋ ๋๋ง ๋ฐ์ | ๋ฆฌ๋ ๋๋ฆฌ ๋ฐ์(๋ณ๊ฒฝ ์์ฒด๋ ๋ถ๊ฐ๋ฅ) | Ref ๋ณ๊ฒฝ ์ ๋ฆฌ๋ ๋๋ง ๋ฐ์ํ์ง ์์ |
์ ์ด๋ฐฉ์ | ์ปดํฌ๋ํธ ์์ฒด์์ ๊ด๋ฆฌ, ๋ณ๊ฒฝ ๊ฐ๋ฅ | ๋ถ๋ชจ ์ปดํฌ๋ํธ์์๋ง ๋ณ๊ฒฝ ๊ฐ๋ฅ | ์ธ๋ถ ๋ฐ์ดํฐ ์ฐธ์กฐ, ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ UI์ ์ํฅ ์์ |
โน๏ธ์ฐธ๊ณ
[ASAC 6๊ธฐ ๊ฐ์์๋ฃ]
'๐ปDEV-STUDY > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] Vite๋ก React ์ด๊ธฐ ์ฑ ์ค์ (2) | 2024.09.18 |
---|---|
[React] JSX ๋ฌธ๋ฒ + ๋จ๋ฐฉํฅ ๋ฐ์ธ๋ฉ + VDOM (1) | 2024.09.17 |
[React] ๋ ๋๋ง๋ฐฉ์(CSR)๊ณผ ์น ์ดํ๋ฆฌ์ผ์ด์ ๊ตฌ์กฐ(SPA) (1) | 2024.09.17 |
[React] React์ ๋ฑ์ฅ๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ vs ํ๋ ์์ํฌ (1) | 2024.09.17 |