You will learn
- 'state ๋์ด ์ฌ๋ฆฌ๊ธฐ'๋ก ์ด๋ป๊ฒ ์ปดํฌ๋ํธ๊ฐ์ state๋ฅผ ๊ณต์ ํ ์ ์๋์ง
- ์ ์ด ์ปดํฌ๋ํธ, ๋น์ ์ด ์ปดํฌ๋ํธ๋ ๋ฌด์์ธ์ง
Lifting state up
๋ ์ปดํฌ๋ํธ์ state๊ฐ ๋์์ ์ ๋ฐ์ดํธ๋๊ธฐ๋ฅผ ์ํ ์ ์๋ค. ๊ทธ๋ฌ๊ธฐ ์ํด์๋ ๊ฐ ์ปดํฌ๋ํธ์์ state๋ฅผ ์ ๊ฑฐํ๊ณ ๊ฐ์ฅ ๊ฐ๊น์ด ๋์ ๊ณตํต ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ state๋ฅผ ์ ์ธํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ถ๋ชจ๊ฐ ํ์ ์ปดํฌ๋ํธ์๊ฒ ์ ๋ฌํ๋ค. ์ด ๋ฐฉ๋ฒ์ state ๋์ด์ฌ๋ฆฌ๊ธฐ ๋ผ๊ณ ํ๋ค.
AccordionPanelPanel
์ฌ๊ธฐ์ ํ๋์ Panel ์ปดํฌ๋ํธ๋ง ์ด๋ฆฌ๊ธธ ์ํ๋ค๋ฉด? ์ฆ ํ Panel ์ปดํฌ๋ํธ๋ฅผ ์ด๋ฉด ๋ค๋ฅธ Panel ์ปดํฌ๋ํธ๋ฅผ ๋ซ๊ณ ์ถ๋ค๋ฉด? ๊ฐ Panel ์ปดํฌ๋ํธ์์ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ state๋ฅผ ์
๋ฐ์ดํธํ ์ ์๊ธฐ ๋๋ฌธ์ ๋์ ๋ถ๋ชจ์ธ Accordion ์์ ์ด๋ค Panel ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ค์ง ๊ฒฐ์ ํ๋ state๋ฅผ ์ ์ธํ๊ณ ์์์๊ฒ ๊ฑด๋ด์ค์ผ ํ๋ค. ์ฆ state ๋์ด์ฌ๋ฆฌ๊ธฐ๊ฐ ํ์ํ๋ค.
export default function Accordion() {
const [activeIndex, setActiveIndex] = useState(0);
return (
<>
<h2>Almaty, Kazakhstan</h2>
<Panel
title="About"
isActive={activeIndex === 0}
onShow={() => setActiveIndex(0)}
>
//...
</Panel>
<Panel
title="Etymology"
isActive={activeIndex === 1}
onShow={() => setActiveIndex(1)}
>
//...
</Panel>
</>
);
}
function Panel({
title,
children,
isActive,
onShow
}) {
return (
<section className="panel">
<h3>{title}</h3>
{isActive ? (
<p>{children}</p>
) : (
<button onClick={onShow}>
Show
</button>
)}
</section>
);
}
์ด๋ ๊ฒ ์์์๊ฒ ๋ ๊ฐ์ง๋ฅผ ์ ๋ฌํ๋ค.
- state ์
- state ๋ฅผ ์ ๋ฐ์ดํธํ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ
์ ์ด controlled vs ๋น์ ์ด uncontrolled
๋ฐ๋ก ์์ ๋ฐฉ์์ฒ๋ผ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ค์ํ ์ ๋ณด๋ฅผ props๋ก ์ ๋ฌํ๋ ๊ฒฝ์ฐ ์์ ์ปดํฌ๋ํธ๋ค์ ์ ์ด ์ปดํฌ๋ํธ๋ผ๊ณ ํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์์์ด ์ด๋ป๊ฒ ๋์ํ ์ง ๋ถ๋ชจ๊ฐ ๊ฒฐ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋๋ก ์์ ์ปดํฌ๋ํธ๊ฐ ์ค์ํ ์ ๋ณด๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์ง์ญ state๋ฅผ ๊ฐ๋ ๊ฒฝ์ฐ ๋น์ ์ด ์ปดํฌ๋ํธ๋ผ๊ณ ํ๋ค. ๋น์ ์ด ์ปดํฌ๋ํธ๋ ์ฝ๋๋ฅผ ์์ฑํ ๋ ๊ฐํธํ ์ ์์ง๋ง, ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ์กฐํฉํ์ฌ ์ฌ์ฉํ ๋ ์ ์ฐํ์ง ์์ ์ ์๋ค.
๋ง์ ๊ฒฝ์ฐ "์ ์ด"์ "๋น์ ์ด"๊ฐ ๋ถ๋ช ํ ๊ตฌ๋ถ๋์ง ์๋๋ค. ํ์ง๋ง ์ด ๊ตฌ๋ถ์ ํตํด ์ด๋ค ์ ๋ณด๊ฐ props๋ก ์ ์ด๋์ด์ผ ํ๋์ง ์ด๋ค ์ ๋ณด๋ state๋ก ๋น์ ์ด ๋์ด์ผ ํ๋์ง ์๊ฐํด๋ณด๋ ๊ด์ ์ ์ ๊ณตํ๋ค.
์์ ๋ฌธ์
2. ๊ฒ์์ด ํํฐ๋ง
์ ๋ ฅ์ฐฝ์ ๋ฃ์ ๊ฒ์๋ฅผ ๋ฐ์ํ์ฌ ํํฐ๋ง ๋ ๊ฒฐ๊ณผ๋ง ๋ณด์ฌ์ฃผ๋๋ก ์์ ํ๋ ๋ฌธ์ .
export default function FilterableList() {
const [query, setQuery] = useState('');
return (
<>
<SearchBar query={query} onChange={(e)=>setQuery(e.target.value)} />
<hr />
<List items={foods} query={query} />
</>
);
}
function SearchBar({query, onChange}) {
return (
<label>
Search:{' '}
<input
value={query}
onChange={onChange}
/>
</label>
);
}
function List({ items,query }) {
const result = filterItems(items,query);
return (
<table>
<tbody>
{result.map(food => (
<tr key={food.id}>
<td>{food.name}</td>
<td>{food.description}</td>
</tr>
))}
</tbody>
</table>
);
}
๋๋ ์์์ฒ๋ผ List ์ปดํฌ๋ํธ์์ ํํฐ๋ง์ ์งํํ๋๋ฐ ๋ต์์์๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ธ FilterableList์์ ํํฐ๋งํ ํ์ List ์ปดํฌ๋ํธ์ ํํฐ๋ง ๊ฒฐ๊ณผ๋ฅผ ๊ฑด๋ด์ฃผ๋๋ก ์ค๊ณํ๋ค.
๋ถ๋ชจ์์ ๊ณ์ฐํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๊ฑด๋ด์ฃผ๋ ๋ต์์ ๋ฐฉ์์ด ๋ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ด๋ค.
List์ปดํฌ๋ํธ๊ฐ ํน์ ๋ก์ง์ ์ข ์๋์ง ์๊ฒ ๋๊ณ (์ฌ์ฌ์ฉ์ฑ)List์ปดํฌ๋ํธ๋ UI ์ปดํฌ๋ํธ๋ก์ ํ๋์ ์ฑ ์๋ง ๊ฐ๋๋ค. (๊ด์ฌ์ฌ ๋ถ๋ฆฌ)

