๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ‘ฉ‍๐Ÿ’ป ๊ฐœ๋ฐœ ๊ณต๋ถ€/๊ฐœ๋ฐœ ์„œ์  Read&Write

[์ฒ˜์Œ ๋งŒ๋‚œ ๋ฆฌ์•กํŠธ] React ์ฑ…์ฝ๊ธฐ : Chapter 9-12 ์ •๋ฆฌ

728x90
๋ฐ˜์‘ํ˜•


[ ์ฐธ๊ณ  ์„œ์  : ์†Œํ”Œ์˜ ์ฒ˜์Œ ๋งŒ๋‚œ ๋ฆฌ์•กํŠธ(2ํŒ) - ํ•œ๋น›๋ฏธ๋””์–ด ]

 

โœ… ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง (Conditional Rendering)

์กฐ๊ฑด์— ๋”ฐ๋ผ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋„๋ก ํ•˜๋Š” ๊ฒƒ


๐Ÿ”น 1. ์—˜๋ฆฌ๋จผํŠธ ๋ณ€์ˆ˜

  • ๋ฆฌ์•กํŠธ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์ €์žฅํ•ด์„œ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์„ ํƒ์ ์œผ๋กœ ๋ Œ๋”๋ง
let button;
if (isLoggedIn) {
  button = <LogoutButton />;
} else {
  button = <LoginButton />;
}
return <div>{button}</div>;

๐Ÿ”น 2. ์ธ๋ผ์ธ ์กฐ๊ฑด

โ–ถ ์ธ๋ผ์ธ If

  • ์กฐ๊ฑด๋ฌธ์„ ์ฝ”๋“œ ์•ˆ์— ์ง์ ‘ ์ง‘์–ด๋„ฃ๋Š” ๋ฐฉ์‹
  • ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž && (AND) ์‚ฌ์šฉ
  • ์•ž์˜ ์กฐ๊ฑด์ด true์ผ ๋•Œ๋งŒ ๋’ค์˜ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ๋ Œ๋”๋ง๋จ
  • {isLoggedIn && <LogoutButton />}

โ–ถ ์ธ๋ผ์ธ If-Else

  • ์‚ผํ•ญ ์—ฐ์‚ฐ์ž ? : ์‚ฌ์šฉ
  • ์กฐ๊ฑด์ด true๋ฉด ์ฒซ ๋ฒˆ์งธ, false๋ฉด ๋‘ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ๋ Œ๋”๋ง
  • ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐ€์ง€ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋ณด์—ฌ์ค„ ๋•Œ ์‚ฌ์šฉ
  • {isLoggedIn ? <LogoutButton /> : <LoginButton />}

๐Ÿ”น 3. ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๋ง‰๊ธฐ

  • ๋ฆฌ์•กํŠธ์—์„œ๋Š” null์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ™”๋ฉด์— ์•„๋ฌด๊ฒƒ๋„ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Œ
  • ๋ Œ๋”๋ง์„ ๋ง‰๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉ
function Warning({ show }) {
  if (!show) return null;
  return <div>๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค!</div>;
}

 


๐Ÿ“‹ ๋ฆฌ์ŠคํŠธ & ํ‚ค (List & Key)

๊ฐ™์€ ์ข…๋ฅ˜์˜ ์•„์ดํ…œ์„ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•œ ๊ฒƒ
๋ฆฌ์•กํŠธ์—์„œ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ํ‚ค(Key) ์‚ฌ์šฉ์ด ์ค‘์š”ํ•จ


๐Ÿ”น 1. ๋ฆฌ์ŠคํŠธ๋ž€?

  • ๊ฐ™์€ ์•„์ดํ…œ์„ ์ˆœ์„œ๋Œ€๋กœ ๋ชจ์•„ ๋†“์€ ๊ตฌ์กฐ
  • ๋ฆฌ์•กํŠธ์—์„œ ๋ฆฌ์ŠคํŠธ๋Š” ์ฃผ๋กœ map() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ์‚ฌ์šฉ๋จ

๐Ÿ”น 2. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง

const names = ['Tom', 'Jerry', 'Spike'];
const nameList = names.map((name) => <li>{name}</li>);
  • map() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑ
  • ์ƒ์„ฑ๋œ ์—˜๋ฆฌ๋จผํŠธ์—๋Š” ๋ฐ˜๋“œ์‹œ key๋ฅผ ๋ถ€์—ฌํ•ด์•ผ ํ•จ โ—

๐Ÿ”น 3. ํ‚ค(Key)๋ž€? ๐ŸŽฏ

  • ๊ฐ ๊ฐ์ฒด๋‚˜ ์•„์ดํ…œ์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์œ ํ•œ ๊ฐ’
  • ๋ฆฌ์•กํŠธ๊ฐ€ ๋ฆฌ์ŠคํŠธ ๋‚ด์˜ ์•„์ดํ…œ์„ ๋ณ€๊ฒฝ/์ถ”๊ฐ€/์‚ญ์ œํ•  ๋•Œ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

๐Ÿ”น 4. ํ‚ค๊ฐ’ ์‚ฌ์šฉ๋ฒ•

 

์‚ฌ์šฉ ์˜ˆ์‹œ ํŠน์ง• ์ฃผ์˜์ 
์ˆซ์ž ๊ฐ’ ์‚ฌ์šฉ ๊ฐ€๋Šฅ์€ ํ•˜๋‚˜, ์ค‘๋ณต๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ ๋ฐฐ์—ด์— ์ค‘๋ณต๋œ ์ˆซ์ž X
id ์‚ฌ์šฉ (์ถ”์ฒœ) โœ… ๊ณ ์œ ํ•œ ๊ฐ’์ด๋ฏ€๋กœ ๊ฐ€์žฅ ์ ํ•ฉ ๋ณดํ†ต API๋‚˜ DB์—์„œ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ์˜ id ์‚ฌ์šฉ
์ธ๋ฑ์Šค ์‚ฌ์šฉ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์•„์ดํ…œ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ โš 
 
const list = items.map((item) => <li key={item.id}>{item.name}</li>);

๐Ÿ”ธ ์ฃผ์˜: ํ‚ค๋Š” ๊ฐ™์€ ๋ฆฌ์ŠคํŠธ ๋‚ด์—์„œ๋งŒ ๊ณ ์œ ํ•˜๋ฉด ๋จ
๐Ÿ”ธ ๋ช…์‹œ์  ํ‚ค ์—†์œผ๋ฉด, ๋ฆฌ์•กํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•จ (๋น„์ถ”์ฒœ)


๐Ÿ“„ ํผ(Form)์ด๋ž€?

์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ์„ ๋ฐ›๊ธฐ ์œ„ํ•œ ์–‘์‹


๐Ÿ”น ์ œ์–ด ์ปดํฌ๋„ŒํŠธ (Controlled Component)

  • ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ๋ฆฌ์•กํŠธ state๋กœ ์ œ์–ด
  • ์ž…๋ ฅ๊ฐ’์„ ํ•ญ์ƒ ๋ฆฌ์•กํŠธ๊ฐ€ ๊ด€๋ฆฌ & ์—…๋ฐ์ดํŠธํ•จ

๐Ÿ”น ์ฃผ์š” ์ž…๋ ฅ ์š”์†Œ์™€ ํŠน์ง•

 

์š”์†Œ ์šฉ๋„ ๋ฆฌ์•กํŠธ์—์„œ ์ฒ˜๋ฆฌ ๋ฐฉ์‹
input type="text" ํ•œ ์ค„ ํ…์ŠคํŠธ ์ž…๋ ฅ value๋กœ ๊ฐ’ ๊ด€๋ฆฌ
textarea ์—ฌ๋Ÿฌ ์ค„ ํ…์ŠคํŠธ ์ž…๋ ฅ value๋กœ ๊ฐ’ ๊ด€๋ฆฌ
select ๋“œ๋กญ๋‹ค์šด ๋ชฉ๋ก ์„ ํƒ value๋กœ ์„ ํƒ๊ฐ’ ๊ด€๋ฆฌ
input type="file" ํŒŒ์ผ ์—…๋กœ๋“œ ์ฝ๊ธฐ ์ „์šฉ → ๋น„์ œ์–ด ์ปดํฌ๋„ŒํŠธ๋กœ ์‚ฌ์šฉ

๐Ÿ”น ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž…๋ ฅ ๋‹ค๋ฃจ๊ธฐ

  • ์ž…๋ ฅ ํ•„๋“œ๋งˆ๋‹ค state๋ฅผ ๋”ฐ๋กœ ์„ ์–ธํ•˜์—ฌ ๊ด€๋ฆฌ
  • ๋˜๋Š” ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋ฌถ์–ด ํ•œ state์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์Œ

๐Ÿ”น Input Null Value

  • ์ž…๋ ฅ ํ•„๋“œ์— ์ž์œ ๋กœ์šด ์ž…๋ ฅ์„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด
    value={undefined} ๋˜๋Š” value={null} ๋กœ ์„ค์ • ๊ฐ€๋Šฅ

 

๐Ÿ”„ Shared State (๊ณต์œ  ์ƒํƒœ)

์—ฌ๋Ÿฌ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ณตํ†ต๋œ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ state๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ.


๐Ÿ”ผ State ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ (Lifting State Up)

ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๋˜ state๋ฅผ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ ์˜ฌ๋ ค์„œ ๊ณต์œ 

  • ๋ถ€๋ชจ๊ฐ€ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ 
  • ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์€ props๋กœ ๊ทธ ์ƒํƒœ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ

๋‘ ๊ฐœ ์ด์ƒ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์œผ๋กœ,

๋ฆฌ์•กํŠธ์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘๊ฒŒ ๋‚˜๋ˆ„๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋ฏ€๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋จ.

(๊ณตํ†ต state๋ฅผ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ ,
ํ•„์š”ํ•œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋“ค์—” props๋กœ ๋‚ด๋ ค์คŒ)

728x90
๋ฐ˜์‘ํ˜•