Skip to content

Latest commit

ย 

History

History

describing-the-ui

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
ย 
ย 

Describing the UI


Note

'Describing the UI' ์ฑ•ํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•
  • ๋‹ค์ค‘ ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ์‹œ๊ธฐ์™€ ๋ฐฉ๋ฒ•
  • JSX๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๋งˆํฌ์—…์„ ๋”ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • JSX์—์„œ {}๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•
  • props ์ธ์ˆ˜๋กœ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜๋ฅผ ์กฐ์ ˆํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ปจํ…์ธ ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ํ•ญ๋ชฉ์„ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜์—ฌ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

Describing the UI

  1. JSX๋Š” HTML๊ณผ ๋งค์šฐ ๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ ์กฐ๊ธˆ ๋” '์—„๊ฒฉ' ํ•˜๋‹ค

    • ๋‹น์—ฐ์‹œ ์—ฌ๊ฒจ์™€์„œ ์ธ์ง€ํ•˜์ง€ ๋ชปํ–ˆ๋˜ ํŠน์ง•
  2. ์ด์™€ ๊ฐ™์€ ๊ธฐ์กด HTML์ด ์žˆ๋‹ค๋ฉด converter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  3. React์—์„œ๋Š” if ๋ฌธ, &&, ? : ์—ฐ์‚ฐ์ž ๊ฐ™์€ JavaScript ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด ์กฐ๊ฑด๋ถ€๋กœ JSX๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • (LEARN REACT >DESCRIBING THE UI > Conditional Rendering) ์‹ค์ œ๋กœ ์ปดํฌ๋„ŒํŠธ์—์„œ null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ๋ Œ๋”๋งํ•˜๋ ค๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ๋†€๋ผ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ JSX์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ์กฐ๊ฑด๋ถ€๋กœ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ์ œ์™ธํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ๋งŽ์Šต๋‹ˆ๋‹ค.
    • && ์—ฐ์‚ฐ์ž๋ฅผ ์จ์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค (์กฐ๊ฑด) ? (์ปดํฌ๋„ŒํŠธ) : null ๋กœ ๋ Œ๋”๋ง ํ•˜๋Š” ๋ฐฉ์‹์ด ์ข‹๋‹ค๋Š” ์˜๊ฒฌ์„ ์ฐธ์กฐํ–ˆ๋Š”๋ฐ, ๊ณต์‹๋ฌธ์„œ์˜ ๊ด€๋ จ๋‚ด์šฉ์ค‘ ์ด๋Ÿฐ ๋ฐฉ์‹์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋‚ด์šฉ์ด ์žˆ์Œ
    • ์ด์— ๊ด€ํ•ด์„œ๋Š” ๋” ๊ณต๋ถ€ํ•˜๋ฉด ์ข‹์„๊ฒƒ๊ฐ™์Œ!
  4. prop์„ ์ „๋‹ฌํ•˜์—ฌ ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • prop์„ ์ „๋‹ฌํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ์˜๋„๊ฐ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ˆœ์ˆ˜ ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ฒƒ
    • ์ˆœ์ˆ˜ํ•จ์ˆ˜, ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๊ด€ํ•œ ์ด์•ผ๊ธฐ๋„ ์–ธ๊ธ‰ -> ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์–ด๋–ค์ƒํ™ฉ์— ์“ฐ์ด๋Š”๊ฒŒ ๋” ์ข‹์€์ง€ ์•Œ์•„๋ณด๋ฉด ์ข‹์„๊ฒƒ๊ฐ™์Œ

Your first component

  1. ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ ์ •์˜๋ฅผ ์ค‘์ฒฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค

export default function Gallery() {
 // ๐Ÿ”ด Never define a component inside another component!
 function Profile() {
   // ...
 }
 // ...
}
  • ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค ๐Ÿคฉ

๐Ÿคทโ€โ™€๏ธ ์งˆ๋ฌธ

  1. ํ”„๋กœ์ ํŠธ๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์ด๋ฏธ ์ž‘์„ฑํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ๋งŽ์€ ๋””์ž์ธ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.

    • Q: ํšŒ์‚ฌ์—์„œ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•ด์„œ ์‚ฌ์šฉ ์ค‘์ธ๋ฐ ๊ฐœ๋ฐœํ•  ๋•Œ ์ตœ๋Œ€ํ•œ ์žฌ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ ์„œ๋น„์Šค๋งˆ๋‹ค ์š”๊ตฌ์‚ฌํ•ญ์ด ๋‹ค๋ฅด๋‹ค๋ณด๋‹ˆ ์กฐ๊ธˆ์”ฉ ๋””์ž์ธ์ด ๋‹ฌ๋ผ์ ธ์„œ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์“ฐ๊ธฐ๋Š” ์–ด๋ ต๋‹ค. ๋””์ž์ด๋„ˆ ๋ถ„๋“ค๋„ ์ œ์•ฝ๋ฐ›๋Š”๋‹ค๋Š” ๋Š๋‚Œ์„ ๋ฐ›๋Š”๋‹ค, ํšŒ์‚ฌ์—์„œ ๋””์ž์ธ ์‹œ์Šคํ…œ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๋ถ„ ์žˆ๋Š”๊ฐ€?
    • A: ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •ํ•ด์„œ ๋งŒ๋“ค์–ด๋‘๋”๋ผ๋„ ๊ฒฐ๊ตญ์—” ๊ทธ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ณผ์ •์—์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋‚˜์™€์„œ ๋ฐ˜์˜ํ•˜๋‹ค๋ณด๋ฉด ๊ธฐ์กด์— ์˜๋„ํ•œ ์ปดํฌ๋„ŒํŠธ๋ณด๋‹ค ์ปค์Šคํ…€ ๊ฐ€๋Šฅ๋ฒ”์œ„๊ฐ€ ๋ณต์žกํ•ด์ ธ, ์š”๊ตฌ์‚ฌํ•ญ ์ค‘ ๊ณตํ†ต์š”์†Œ๋กœ ๋„ฃ๊ธฐ ํƒ€๋‹น ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ๋ถ€๋ถ„์€ ๋””์ž์ด๋„ˆ๋ถ„๋“ค๊ณผ ํšŒ์˜ ํ†ตํ•ด์„œ ๋ฐ˜์˜ ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—” ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ css ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ†ตํ•ด์„œ ๋ฎ์–ด์”Œ์šฐ๋Š” ์‹ ์œผ๋กœ ์ง„ํ–‰
  2. Material UI

    • Q: ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š”๊ฐ€? ์•„๋‹ˆ๋ฉด MUI ๊ฐ™์€ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?
    • A: stitches (https://stitches.dev/) ์‚ฌ์šฉํ•ด์„œ ๊ณตํ†ต์ ์ธ ํ…Œ๋งˆ๋งŒ ์ง€์ •ํ•ด์ค€๋’ค ์ง์ ‘ ์Šคํƒ€์ผ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑํ•˜๋Š” ์‹์œผ๋กœ ์ž‘์—…, ์š”์ฆ˜ tailwind (https://tailwindcss.com/) ๋Œ€์„ธ์ธ๋“ฏ ํ•˜์—ฌ ์ฐ๋จน ๊ณ ๋ฏผ์ค‘
    • A: tailwind ๋Š” ์ด๋ฏธ ์ •ํ•ด์ ธ์žˆ์–ด ์ปค์Šคํ…€์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋˜ํ•œ ์ •ํ•ด์ ธ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ ‘๊ทผ์ด ์‰ฌ์šธ์ˆ˜ ์žˆ์Œ ์‹ค์Šต๋งํฌ:(https://play.tailwindcss.com/)

Importing and exporting components

  1. ์ด ์˜ˆ์ œ์˜ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ๋ชจ๋‘ App.js๋ผ๋Š” root ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. Create React App์—์„œ๋Š” ์•ฑ ์ „์ฒด๊ฐ€ src/App.js์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์„ค์ •์— ๋”ฐ๋ผ root ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์œ„์น˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Next.js์ฒ˜๋Ÿผ ํŒŒ์ผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ผ์šฐํŒ…ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ผ ๊ฒฝ์šฐ ํŽ˜์ด์ง€๋ณ„๋กœ root ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ํ”„๋ ˆ์ž„์›Œํฌ๋ณ„ ๊ฒฝํ—˜๋“ค ๊ณต์œ ํ•ด์ฃผ์‹ฌ๐Ÿ’™
    • Next : (https://github.com/vercel/next.js/tree/canary/examples) -> nextํŒ€์—์„œ ๋งŒ๋“ค์–ด๋†“์€ ์˜ˆ์ œ๋“ค ๋ชจ์Œ. ์œ„ ์ฃผ์†Œ์— ๋‚˜์™€์žˆ๋Š” ๊ฐ ํด๋”๋“ค์ด ๊ฐ Next ํ”„๋กœ์ ํŠธ์ธ๋ฐ, ์•„๋ฌด๊ฑฐ๋‚˜ ๋ˆŒ๋Ÿฌ๋ณด์‹œ๋ฉด ๊ทธ ์•ˆ์˜ pages๋ผ๋Š” ํด๋”๊ฐ€ ์žˆ๋‹ค. next์—์„  ์ด page ํด๋”๋ฅผ ๊ธฐ์ค€ ์œผ๋กœ ๋ผ์šฐํŒ…์„ ์•Œ์•„์„œ ํ•ด์คŒ.(์ตœ๊ทผ์— ๋‚˜์˜จ app router ๋ฐฉ์‹์€ ์ œ์™ธ) ์˜ˆ๋ฅผ ๋“ค๋ฉด pages/index.tsx ๋Š” ๋ฉ”์ธํŽ˜์ด์ง€(example.com/), pages/about.tsx๋Š” example.com/about ์ฒ˜๋Ÿผ ๋˜๋Š” ๋ฐฉ์‹
    • gatsby : gatsby์—์„œ๋„ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ผ์šฐํŒ…, ๊ทธ๋ž˜์„œ ์ฒ˜์Œ์— nextjs์—์„œ gatsby๋กœ ๋„˜์–ด๊ฐˆ ๋•Œ ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ๊ฐ€ ๋น„์Šทํ•ด์„œ ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ์ ๊ฒŒ ๋Š๋‚Œ

  1. Default vs named exports

    • ์ด๋Ÿฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋…๋“ค์„ ์ค‘๊ฐ„์— ๊ฐ„๋‹จ๋ช…๋ฃŒํ•˜๊ฒŒ ์งš์–ด ์ฃผ๋Š” ๋ถ€๋ถ„์ด ์ฐธ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐ -ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ ๋ฅผ export default ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๊ณ , named export๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์œ ํ‹ธ ํ•จ์ˆ˜ ๊ฐ™์€๊ฑฐ ๋‚ด๋ณด๋‚ผ๋•Œ ์‚ฌ์šฉ
    • ๋งŒ์•ฝ ๋‚ ์งœ ๊ด€๋ จ ํ•จ์ˆ˜๋“ค์„ ๋ชจ์•„๋†“์€ dateUtils.ts ํŒŒ์ผ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ
    export const convertDateToYYYYMMDD  () => {...}
    export const convertTimeToString  () => {...}
    import { convertDateToYYYYMMDD, convertTimeToString } from './dateUtils.ts'
    

๐Ÿคทโ€โ™€๏ธ ์งˆ๋ฌธ

    • Q: (2๋ฒˆ๊ด€๋ จ) ์ •๋ง ๊ฐ„๋‹จํ•œ ๊ฑด ๊ฐ™์€ ํŒŒ์ผ์— ๋‘์ง€๋งŒ ๋Œ€๋ถ€๋ถ„ ํ•œ ํŒŒ์ผ์— ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋งŒ ์„ ์–ธ ํ•˜๋ ค๊ณ  ํ•˜๋Š” ํŽธ, ๋‹ค๋ฅธ ๋ถ„๋“ค ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ ํ•˜๋Š”๊ฐ€? ์ปดํฌ๋„ŒํŠธ ์„ ์–ธ ๋ฐฉ๋ฒ• ์ปจ๋ฒค์…˜ ์ •ํ•ด๋‘์‹œ๋Š” ๋ถ„์ด ์žˆ๋Š”๊ฐ€?
    • A: ์œ ํ‹ธํ•จ์ˆ˜๋“ค์€ ํ•˜๋‚˜์˜ ํŒŒ์ผ ์•ˆ์— ๋ชจ์•„๋‘๋Š” ์‹์œผ๋กœ ์‚ฌ์šฉ, ์ปดํฌ๋„ŒํŠธ ๊ฐ™์€ ๊ฒฝ์šฐ์—” ์ •๋ง ๊ฐ„๋‹จํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ํ•œ ํŒŒ์ผ์— ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋งŒ ์‚ฌ์šฉ ํ•˜๋ ค ํ•˜๋Š” ํŽธ. ์ด์ „์— ํ•œ ํŒŒ์ผ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •์˜ํ•ด๋‘๊ณ  ์‚ฌ์šฉํ–ˆ๋˜ ์ ์ด ์žˆ์—ˆ๋Š”๋ฐ ๊ฒฐ๊ตญ ํŒŒ์ผ์„ ์™”๋‹ค๊ฐ”๋‹ค ๋ณด๊ธฐ ํž˜๋“ค์—ˆ์–ด์„œ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ถ„๋ฆฌํ•˜๋Š” ์‹์œผ๋กœ ์ˆ˜์ •..!
    • Q: ํŒŒ์ผ์ด ๋งŽ์•„์ง€๋”๋ผ๋„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ๋” ํŽธํ•œ๊ฐ€?
    • A: ํŒŒ์ผ๋ช…์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ”๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด, ๋ถ„๋ฆฌํ•˜๋ฉด ๋” ๋ถ„๋ฆฌ์ˆ˜๋ก ํŽธํ•ด์ง„๋‹ค. ์‹œ๊ฐ„์ด ์žˆ๋‹ค๋ฉด ๋” ๋ถ„๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค.

Writing markup with JSX

  1. ํ•˜์ง€๋งŒ ์›น์ด ๋”์šฑ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•ด์ง€๋ฉด์„œ ๋กœ์ง์ด ์ปจํ…์ธ ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ JavaScript๊ฐ€ HTML์„ ๋‹ด๋‹นํ•˜๊ฒŒ ๋˜์—ˆ์ฃ ! ์ด๊ฒƒ์ด ๋ฐ”๋กœ React์—์„œ ๋ Œ๋”๋ง ๋กœ์ง๊ณผ ๋งˆํฌ์—…์ด ๊ฐ™์€ ์œ„์น˜์˜ ์ปดํฌ๋„ŒํŠธ์— ํ•จ๊ป˜ ์žˆ๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

    • JSX์˜ ํƒ„์ƒ ๋ฐฐ๊ฒฝ์„ ์ž˜ ์„ค๋ช…ํ•ด์คŒ, jQuery๋ฅผ ์จ๋ณธ ์ ์€ ์—†์ง€๋งŒ ๊ต‰์žฅํžˆ ์ดˆ์ฐฝ๊ธฐ์— ๋”์„ ์ง์ ‘ ์กฐ์ž‘ํ•ด๋ณธ ์ ์ด ์žˆ๋Š”๋ฐ React์— ๋น„ํ•˜๋ฉด ์“ฐ๊ธฐ ํž˜๋“ค๋‹ค.
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋งŒ์œผ๋กœ ๋” ์กฐ์ž‘ํ•˜๋Š” ๋ฐฉ์‹์„ ๊ฒฝํ—˜ํ•œ ์ดํ›„์— ๋ฆฌ์•กํŠธ๋ฅผ ๋ฐฐ์› ์—ˆ๋Š”๋ฐ ์ •๋ง ์‹ ์„ธ๊ณ„๋ผ๊ณ  ๋Š๋‚Œ
    • ํ˜„ ํšŒ์‚ฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž…์žฅ์œผ๋กœ ์ •๋ง ๊ณต๊ฐ์ด ๊ฐ€๋Š” ๋‚ด์šฉ ...๐Ÿ˜ฅ

  1. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ React์˜ ํ™”๋ฉด ์˜ค๋ฅ˜ ๋ฉ”์„ธ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ณณ์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋ง‰ํ˜”์„ ๋•Œ ์ฝ์–ด์ฃผ์„ธ์š”!

    • ์‚ฌ๋žŒ๋“ค์ด ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๊ทธ๋ ‡๊ฒŒ ์•ˆ ์ฝ๋‚˜ ์‹ถ์€๋ฐ๐Ÿคฃ. ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ดˆ๋ณด์ผ ๋•Œ๋Š” ์ œ๋Œ€๋กœ ์•ˆ ์ฝ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ํ•˜์‹ฌ
    • ํ˜„์žฌ๋„ ๊ทธ๋ž˜์„œ ๋ฐ˜์„ฑํ•˜๊ฒŒ ๋˜๋Š” ๋‚ด์šฉ
    • ์นœ์ ˆํ•œ docs..

  1. JSX๋Š” HTML์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” JavaScript ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋กœ ๊ฐ์‹ธ์ง€ ์•Š์€ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜์—์„œ๋Š” ๋‘ ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    • ์ด๊ฑธ ์•Œ๊ธฐ ์ „์—๋Š” ๊ทธ๋ƒฅ ๋ฌด์ง€์„ฑ์œผ๋กœ ๋”ฐ๋ž๋Š”๋ฐ JSX๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜ ๋กœ ๋ณ€ํ™˜๋œ๋‹ค๋Š” ๊ฑธ ์•Œ๊ณ  ๋‚˜๋‹ˆ๊นŒ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ดํ•ด๋˜์–ด์„œ ์ข‹์Œ!
    • ์ด ๋˜ํ•œ ๋งค์šฐ ๊ณต๊ฐ ๊ฐ€๋Š” ๋‚ด์šฉ

  1. ์—ญ์‚ฌ์ ์ธ ์ด์œ ๋กœ aria-* ๊ณผ data-*์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” HTML์—์„œ์™€ ๋™์ผํ•˜๊ฒŒ ๋Œ€์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • ์—ญ์‚ฌ์ ์ธ ์ด์œ ๊ฐ€ ์žˆ์ง€๋งŒ, ์ด์œ ๋ฅผ ์•Œ์ˆ˜๋Š” ์—†์—ˆ๋‹ค..

๐Ÿคทโ€โ™€๏ธ ์งˆ๋ฌธ

  1. ๋ณ€ํ™˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด HTML๊ณผ SVG๋ฅผ JSX๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

    • Q: ์‹ค์ œ๋กœ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?
    • A: ์š”์ฆ˜์—” html์„ ์ž‘์„ฑํ•  ์ผ์ด ๋ณ„๋กœ ์—†์–ด์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ jsx๋กœ ์ž‘์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ผ์ด ์—†์Œ
    • A: ๊ธฐ์กด html ํŒŒ์ผ์˜ ๊ฒฝ์šฐ์— ๋ณ€๊ฒฝ์„ ์œ„ํ•ด ์‚ฌ์šฉํ• ๋“ฏ ์‹ถ์Œ

JavaScript in JSX with curly braces

๋‚ด์šฉ์—†์Œ ๐Ÿ˜

Passing Props to a Component

  1. You can think of props like โ€œknobsโ€ that you can adjust. They serve the same role as arguments serve for functionsโ€”in fact, props are the only argument to your component! React component functions accept a single argument, a props object:

    • props๊ฐ€ ํ•˜๋Š” ์—ญํ• ์„ ์ž˜ ์„ค๋ช…ํ•ด์ฃผ๊ณ  ์žˆ๋‹ค. ๋‹ค์ด์–ผ๋กœ ์กฐ์ •ํ•œ๋‹ค๋Š” ํ‘œํ˜„์ด ์ธ์ƒ๊นŠ๋‹ค.
    • ๊ฐœ์ •๋œ React docs์—๋Š” ๋น„์œ ์ ์ธ ํ‘œํ˜„์ด ๋งŽ์ด ์‚ฌ์šฉ๋˜์–ด ์žˆ๋‹ค๊ณ  ๋Š๋‚Œ. (์ดํ•ดํ•˜๊ธฐ ์ข‹์Œ)

  2. Use spread syntax with restraint. If youโ€™re using it in every other component, something is wrong. Often, it indicates that you should split your components and pass children as JSX.

    spread ๋ฌธ๋ฒ•์€ ์ œํ•œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋‹ค๋ฅธ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ์ด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • ์ „๊ฐœ ๊ตฌ๋ฌธ(spread ๋ฌธ๋ฒ•)์„ ์–ธ์ œ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋Œ€์‹  ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋Œ€์•ˆ๊นŒ์ง€ ์•Œ๋ ค์ฃผ๋Š” ์ ์ด ์ข‹๋‹ค.
    • Q: ๊ฐœ๋ฐœ ์ž‘์—…์€ ๊ฒฐ๊ตญ ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์˜ ์‚ฌ์šฉ ์—ฌ๋ถ€์™€ ๊ฐ™์€ ์˜์‚ฌ ํŒ๋‹จ์˜ ์—ฐ์†์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋ฌธ์„œ์˜ ์ด ๋ถ€๋ถ„์€ ๊ทธ ์˜์‚ฌ ํŒ๋‹จ์˜ ๊ธฐ์ค€์„ ์–ด๋–ป๊ฒŒ ์„ธ์šฐ๋ฉด ์ข‹์€์ง€ ๊ฐ€์ด๋“œ ๋ผ์ธ์„ ์žก์•„์ฃผ๋Š” ์—ญํ• . ํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ ๋””ํ…Œ์ผํ•œ ํŒ๋‹จ์€ ๊ฐœ๋ฐœ์ž์˜ ์ฃผ๊ด€์— ๋‹ฌ๋ ค ์žˆ๋‹ค. ๋‹ค๋ฅธ ๋ถ„๋“ค์€ ์ด๋Ÿฌํ•œ ์˜์‚ฌ ํŒ๋‹จ์„ ๋ฌด์—‡์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜์‹œ๋Š”์ง€ ๊ถ๊ธˆํ•˜๋‹ค.
    • A1: ์–ด๋– ํ•œ ๊ฒƒ์„ ์„ ํƒํ–ˆ์„ ๋•Œ ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ ํŽธํ•œ์ง€.
    • A2: ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์„ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋””. ์˜ˆ์™ธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•  ๋•Œ. ์ปค์Šคํ…€ํ•œ props ์™ธ, default๋กœ ์ง€์ •๋˜์–ด์žˆ๋Š” props ๊ฐ’์„ ๋„˜๊ธธ ๋•Œ์—๋Š” spread๋กœ ์‚ฌ์šฉ.

  3. function Avatar(props) {
       let person = props.person;
       let size = props.size;
       // ...
    }
    
    • Q: ์ €๋Š” props ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น์‹œ ๋ณดํ†ต ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, props ๊ฐ€์ ธ์™€์„œ ์“ฐ๋Š” ๊ฒƒ๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ์‹๋“ค์ด ์žˆ๊ฒ ๊ตฌ๋‚˜ ์‹ถ๋‹ค. ๋‹ค๋ฅธ ๋ถ„๋“ค์€ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€?
      function Avatar(props) {
        const { person, size } = props;
      }
    • A1: ๋ฌธ์„œ์— ๊ธฐ์žฌ๋œ ๊ฒƒ ์ฒ˜๋Ÿผ props๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ ์†Œ๊ด„ํ˜ธ ์•ˆ์—์„œ ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹นํ•ด์„œ ๋Œ์–ด์˜ค๋Š” ๋ฐฉ์‹์„ ์„ ํ˜ธํ•จ.
      function Avatar({ person, size }) {
        // ...
      }
    • A2: ์–ด๋– ํ•œ ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋Š๋ƒ๋Š” ์ทจํ–ฅ์˜ ๋ฌธ์ œ์ด์ง€๋งŒ, ์ž‘์—…์ž๋ผ๋ฆฌ ์ปจ๋ฒค์…˜์œผ๋กœ ๊ณตํ†ต ๋ฐฉ์‹์„ ํ•ฉ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ. ์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก.

  4. children prop์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž„์˜์˜ JSX๋กœ โ€œ์ฑ„์šธโ€ ์ˆ˜ ์žˆ๋Š” โ€œ๊ตฌ๋ฉโ€์„ ๊ฐ€์ง„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจ๋„, ๊ทธ๋ฆฌ๋“œ ๋“ฑ์˜ ์‹œ๊ฐ์  ๋ž˜ํผ์— ์ข…์ข… children prop๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • typescript ์‚ฌ์šฉ ์‹œ children์„ props๋กœ ๋ฐ›๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” PropsWithChildren ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ์กฐ๊ธˆ ๋” ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž… ๋ช…์„ธ ๊ฐ€๋Šฅ (react18 ์ถ”๊ฐ€ ํƒ€์ž…)
    • ์ฐธ๊ณ  ๋งํฌ : https://trend21c.tistory.com/2280

  5. Thereโ€™s nothing wrong with repetitive codeโ€”it can be more legible. But at times you may value conciseness.

    • ๋ฐ˜๋ณต์— ๊ฐ€๋…์„ฑ์ด๋ผ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค๊ณ ๋Š” ๋ฏธ์ฒ˜ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ด€์ ์„ ๋ฐฐ์› ๋‹ค.
    • ๋ฐ˜๋ณต ์ฝ”๋“œ์™€ ์ค‘๋ณต ์ฝ”๋“œ๋Š” ๋‹ค๋ฅด๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ์Œ.

  6. However, props are immutableโ€”a term from computer science meaning โ€œunchangeableโ€. When a component needs to change its props (for example, in response to a user interaction or new data), it will have to โ€œaskโ€ its parent component to pass it different propsโ€”a new object! Its old props will then be cast aside, and eventually the JavaScript engine will reclaim the memory taken by them.

    ๊ทธ๋Ÿฌ๋‚˜ props๋Š” ๋ถˆ๋ณ€์œผ๋กœ, ์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ โ€œ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹คโ€๋Š” ๋œป์˜ ์šฉ์–ด์ž…๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ props๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ), ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์— ๋‹ค๋ฅธ props, ์ฆ‰,์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋„๋ก โ€œ์š”์ฒญโ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋Ÿฌ๋ฉด ์ด์ „์˜ props๋Š” ๋ฒ„๋ ค์ง€๊ณ (์ฐธ์กฐ๋ฅผ ๋Š๋Š”๋‹ค), ๊ฒฐ๊ตญ JavaScript ์—”์ง„์€ ๊ธฐ์กด props๊ฐ€ ์ฐจ์ง€ํ–ˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํŒ…. GC)ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

    • props๊ฐ€ ์–ด๋–ค ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•˜๊ธด ํ•ด๋„ ์ฐพ์•„๋ณด์ง„ ์•Š์•˜๋Š”๋ฐ ์ƒˆ๋กœ ์•Œ์•„๊ฐ„๋‹ค.

Conditional Rendering

  1. This style works well for simple conditions, but use it in moderation. If your components get messy with too much nested conditional markup, consider extracting child components to clean things up. In React, markup is a part of your code, so you can use tools like variables and functions to tidy up complex expressions.

    function Item({ name, isPacked }) {
      return (
        <li className="item">{isPacked ? <del>{name + " โœ”"}</del> : name}</li>
      );
    }
    • ์˜ˆ์‹œ๋กœ ๋‚˜์˜จ ์œ„ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๋ฆฌํ•˜๋ฉด ์กฐ๊ธˆ ๋” ์ฝ๊ธฐ ์ˆ˜์›”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•จ.
    function Item({ name, isPacked }) {
      return (
        <li className="item">{isPacked ? <PackedItem /> : <UnpackedItem />}</li>
      );
    }
    • del์ด๋ผ๋Š” html ํƒœ๊ทธ๋Š” ์ฒ˜์Œ ๋ดค์Œ. html๋„ ๊พธ์ค€ํžˆ ๋ฐœ์ „ํ•˜๊ณ  ์ƒˆ๋กœ์šด ์š”์†Œ๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  ์žˆ๊ตฌ๋‚˜..
    • ์ค‘๋‹จ์„ ์„ ํ‘œํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ†ต์ƒ์ ์œผ๋กœ text-decoration: line-through๊ฐ™์€ css๋ฅผ ์‚ฌ์šฉํ•ด์™”์Œ

  2. In practice, returning null from a component isnโ€™t common because it might surprise a developer trying to render it. More often, you would conditionally include or exclude the component in the parent componentโ€™s JSX.

    • ์ปดํฌ๋„ŒํŠธ๋Š” ํ•ญ์ƒ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฐ˜ํ™˜ํ• ๊ฑฐ๋ผ ์ƒ๊ฐํ•˜๋Š”๋ฐ null์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋ณด์ง€ ์•Š๋Š” ์ด์ƒ null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฑธ ๋ชจ๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ '๋†€๋ผ๊ฒŒ ๋œ๋‹ค'๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ๋ฐฉ์‹๋ณด๋‹ค๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ํ•ญ์ƒ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋˜ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ Œ๋”๋ง ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ถ”์ฒœ.

  3. If your components get messy with too much nested conditional markup, consider extracting child components to clean things up. In React, markup is a part of your code, so you can use tools like variables and functions to tidy up complex expressions.

    • ์ „์— ๋ฆฌํŒฉํ† ๋ง ์ฑ…์„ ์ฝ์œผ๋ฉฐ ๋ณต์žกํ•œ ํ‘œํ˜„์‹์ด๋‚˜ ๋กœ์ง์„ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•˜๊ณ  ์ ํ•ฉํ•œ ์ด๋ฆ„์„ ๋ถ€์—ฌํ•ด ์ถ”์ƒํ™”ํ•˜๋Š” ๋ฐฉ์‹์„ ๋ดค๋Š”๋ฐ ์ด์™€ ๋น„์Šทํ•œ ๊ฒƒ ๊ฐ™๋‹ค.
    • ์ƒํƒœ๋ช…์ด๋‚˜ ๋ณ€์ˆ˜๋ช…์„ ์‹œ๋ฉ˜ํ‹ฑํ•˜๊ฒŒ ์ง“๋Š” ๊ฒƒ์ด ์ค‘์š”. ์ด๋ฆ„ ์ง“๊ธฐ ์–ด๋ ต๋‹ค.. -> ์š”์ฆ˜ chatGPT์—๊ฒŒ ์ด๋ฆ„ ์ง“๊ธฐ๋ฅผ ๋งŽ์ด ์œ„์ž„ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ํŽธํ•˜๊ณ  ์ข‹๋‹ค.

  4. React considers false as a โ€œholeโ€ in the JSX tree, just like null or undefined, and doesnโ€™t render anything in its place.

    • ์ง€๋‚œ ์‹œ๊ฐ„์— ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋กœ null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ด ๋” ๋‚ซ๋‹ค๋Š” ์˜๊ฒฌ์„ ๋“ค์—ˆ๋‹ค๊ณ  ๊ณต์œ ํ–ˆ๋Š”๋ฐ, ๋‹คํ–‰ํžˆ React์˜ ์ž‘๋™ ์›๋ฆฌ์ƒ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์ฐจ์ด๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

  5. Donโ€™t put numbers on the left side of &&.

    • 0์œผ๋กœ ๊ณ„์‚ฐ๋œ ๊ฐ’์ด false๋กœ ๋„˜์–ด๊ฐ€๋ฉด์„œ ์ฝ”๋“œ๊ฐ€ ๊ผฌ์˜€๋˜ ๊ฒฝํ—˜์ด ์žˆ์–ด์„œ ๊ณต๊ฐ๋˜๋„ค์š”.. (+ ์—ฌ๋Ÿฌ ๋ช…์˜ ๊ณต๊ฐ)
    • ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ๋ฏธ์—ฐ์— ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ๊ฐ’์ด ์˜๋„๋Œ€๋กœ ๋“ค์–ด๊ฐ€๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ด๋ณด๋Š” ํŽธ
    • ??, ||, &&๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, string์„ number๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ ๋“ฑ ํ˜•๋ณ€ํ™˜ ๊ด€๋ จ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ด์Šˆ๊ฐ€ ์˜ˆ์ƒ๋˜๋Š” ๊ฒฝ์šฐ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
      • string์„ number๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ Number(), parseInt()์ค‘ ๋ฌด์—‡์„ ์‚ฌ์šฉํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฝค ์žฆ๋‹ค.

Rendering Lists

  1. import { people } from "./data.js";
    import { getImageUrl } from "./utils.js";
    
    export default function List() {
      const chemists = people.filter(
        (person) => person.profession === "chemist"
      );
      const listItems = chemists.map((person) => (
        <li>
          <img src={getImageUrl(person)} alt={person.name} />
          <p>
            <b>{person.name}:</b>
            {" " + person.profession + " "}
            known for {person.accomplishment}
          </p>
        </li>
      ));
      return <ul>{listItems}</ul>;
    }
    • Q: ์˜ˆ์‹œ ์ฝ”๋“œ์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ์ €๋Š” ListItems๋ฅผ List ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์— ๋ณ„๋„ ์„ ์–ธํ•˜์—ฌ ์ถ”์ƒํ™”ํ•˜๋Š” ๋ฐฉํ–ฅ์„ ๊ฐœ์ธ์ ์œผ๋กœ ์„ ํ˜ธํ•œ๋‹ค. ๋‹ค๋ฅธ ๋ถ„๋“ค์€ ์–ด๋– ์‹ ์ง€ ๊ถ๊ธˆ.

    • ๐Ÿ‘‡ ์ด๋Ÿฐ ๋Š๋‚Œ..

      import { people } from "./data.js";
      import { getImageUrl } from "./utils.js";
      
      const listItems = (person) => (
          <li>
             <img src={getImageUrl(person)} alt={person.name} />
             <p>
                <b>{person.name}:</b>
                {" " + person.profession + " "}
                known for {person.accomplishment}
             </p>
          </li>;
       )
      
      export default function List() {
        const chemists = people.filter(
          (person) => person.profession === "chemist"
        );
      
        return <ul>{chemists.map((person) => <listItems person={person} />)}</ul>
      
      }
    • A: ๋™์˜ํ•œ๋‹ค. ์˜คํžˆ๋ ค docs์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์€ ํ˜•ํƒœ๋ฅผ ์ฒ˜์Œ ๋ด์„œ ์‹ ๊ธฐํ–ˆ์Œ.


  2. Keys tell React which array item each component corresponds to, so that it can match them up later. This becomes important if your array items can move (e.g. due to sorting), get inserted, or get deleted. A well-chosen key helps React infer what exactly has happened, and make the correct updates to the DOM tree.

  3. Locally generated data: If your data is generated and persisted locally (e.g. notes in a note-taking app), use an incrementing counter, crypto.randomUUID() or a package like uuid when creating items.

    ๋กœ์ปฌ์—์„œ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ: ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ์ปฌ์—์„œ ์ƒ์„ฑ๋˜๊ณ  ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: ๋ฉ”๋ชจ ์ž‘์„ฑ ์•ฑ์˜ ๋ฉ”๋ชจ), ํ•ญ๋ชฉ์„ ๋งŒ๋“ค ๋•Œ ์ฆ๋ถ„ ์นด์šดํ„ฐ, crypto.randomUUID() ๋˜๋Š” uuid์™€ ๊ฐ™์€ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

    • ์–ผ๋งˆ ์ „์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•„๋‹Œ ํ”„๋ก ํŠธ์—์„œ ํ–‰์„ ์ถ”๊ฐ€ํ•  ์ผ์ด ์žˆ์–ด ์–ด๋–ป๊ฒŒ ๊ณ ์œ  ์•„์ด๋””๋ฅผ ๋ถ€์—ฌํ• ์ง€ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ uuid ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐ๋‹ค. ์›Œ๋‚™ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ id๋ฅผ ์ฃผ๋Š”๋ฐ ์ต์ˆ™ํ•ด์ ธ ์žˆ์–ด์„œ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ๋ฐ”๋กœ ๋– ์˜ค๋ฅด์ง€ ์•Š์•˜์Œ.
    • uuid ํŒจํ‚ค์ง€ ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฑธ ์•Œ์•˜๋‹ค. ํŠนํžˆ crypto.randomUUID()๋Š” ์ฒ˜์Œ ๋ณด๋Š” ์›น API๋ผ์„œ ์‹ ๊ธฐํ•จ!
    • ํŒจํ‚ค์ง€ ์—†์ด uuid๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” crypto.randomUUID()์˜ ์กด์žฌ๋ฅผ ์ตœ๊ทผ์— ์•Œ๊ฒŒ๋˜์—ˆ๋Š”๋ฐ (๊ธ์ •์ ) ์ถฉ๊ฒฉ์ด์—ˆ๋‹ค..
    • ์ด ๋•Œ, map์œผ๋กœ ๋ Œ๋”๋งํ•œ list์—์„œ ์ฆ‰์„์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋กœ์ปฌ์—์„œ ๋ฐ์ดํ„ฐ์— ๊ณ ์œ ํ•œ id๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ์ž‘์—…์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ํฌ์ธํŠธ๋ผ๊ณ  ์ƒ๊ฐ
    • ๋Œ€์ถฉ index๊ฐ’ ๋„ฃ์„ ๋•Œ๊ฐ€ ๋งŽ์•˜๋Š”๋ฐ ๋ฐ˜์„ฑํ•˜๊ฒŒ ๋œ๋‹ค..

  4. ์ž˜ ์„ ํƒํ•œ key๋Š” ๋ฐฐ์—ด ๋‚ด ์œ„์น˜๋ณด๋‹ค ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์žฌ์ •๋ ฌ๋กœ ์ธํ•ด ์–ด๋–ค ํ•ญ๋ชฉ์˜ ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„, ํ•ด๋‹น ํ•ญ๋ชฉ์ด ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ํ•œ, React๋Š” key๋ฅผ ํ†ตํ•ด ๊ทธ ํ•ญ๋ชฉ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ตœ๊ทผ์— key์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ๋ฐ›์•˜์„ ๋•Œ ์ œ๋Œ€๋กœ ๋Œ€๋‹ตํ•˜์ง€ ๋ชปํ–ˆ์Œ. ๋‘๋ฃจ๋ญ‰์ˆ ํ•˜๊ฒŒ๋งŒ ์•Œ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ํ™•์‹คํžˆ ์•Œ์•„๊ฐ„๋‹ค.

  5. ๋ฐฐ์—ด์—์„œ ํ•ญ๋ชฉ์˜ ์ธ๋ฑ์Šค๋ฅผ key๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ƒ๋‹จ ๋‚ด์šฉ ๋ณด๊ณ  ๋ฐ˜์„ฑํ•˜๊ณ  ์žˆ๋Š”๋ฐ ๋งˆ์นจ ์ด๋Ÿฐ ๊ธ€์ด...

  6. Similarly, do not generate keys on the fly, e.g. with key={Math.random()}. This will cause keys to never match up between renders, leading to all your components and DOM being recreated every time. Not only is this slow, but it will also lose any user input inside the list items. Instead, use a stable ID based on the data.

    ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ key={Math.random()}๊ณผ ๊ฐ™์ด ์ฆ‰์„์—์„œ key๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค key๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์•„ ๋งค๋ฒˆ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์™€ DOM์ด ๋‹ค์‹œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์†๋„๊ฐ€ ๋Š๋ ค์งˆ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชฉ๋ก ํ•ญ๋ชฉ ๋‚ด๋ถ€์˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ๋„ ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ๋ฐ์ดํ„ฐ์— ๊ธฐ๋ฐ˜ํ•œ ์•ˆ์ •์ ์ธ ID๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

    • ๋ฐ”๋กœ ์ด์ „ ๋ฌธ๋‹จ์—์„œ ์™œ ๋ Œ๋”๋ง ์ค‘์— ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์•ˆ๋œ๋‹ค๊ณ  ์ด์•ผ๊ธฐํ•˜๋Š”์ง€ ๊ถ๊ธˆํ–ˆ๋Š”๋ฐ ์กฐ๊ธˆ ํ…€์„ ๋‘๊ณ  ์„ค๋ช…ํ•ด์ฃผ๋‹ˆ๊นŒ ์ž ์‹œ ํ˜ผ์ž ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ฌธ์„œ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

Keeping Components Pure

  1. Detecting impure calculations with StrictMode

    import * as React from "react";
    import * as ReactDOM from "react-dom/client";
    import { StyledEngineProvider } from "@mui/material/styles";
    import Demo from "./demo";
    
    ReactDOM.createRoot(document.querySelector("#root")).render(
      <React.StrictMode>.....</React.StrictMode>
    );
    • index ํŒŒ์ผ์— StrictMode๋กœ ๊ฐ์‹ธ์ ธ์žˆ์œผ๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‘ ๋ฒˆ ๋ Œ๋”๋ง ๋œ๋‹ค๋Š” ๊ฑด ์•Œ์•˜๋Š”๋ฐ ์™œ ๊ทธ๋Ÿฌ๋Š”์ง€๋Š” ๋ชฐ๋ž์Œ. ์ด๋ฒˆ์— ์•Œ์•˜๋„ค์š”.
    • StrictMode์—์„œ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ๊ฑด ์•Œ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๊ทธ๊ฒŒ ์ปดํฌ๋„ŒํŠธ์˜ ์ˆœ์ˆ˜์„ฑ์„ ํ…Œ์ŠคํŠธํ•œ๋‹ค๋Š” ๊ฑด ๋ชฐ๋ž๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ˆœ์ˆ˜์„ฑ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋ ค์šด ๊ฒ€์ฆ์„ ๊ฑฐ์น˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋‹จ์ˆœํžˆ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•ด๋ณธ๋‹ค๋Š” ์ ์ด ์žฌ๋ฏธ์žˆ์Œ.

  2. It minds its own business. It does not change any objects or variables that existed before it was called. Same inputs, same output. Given the same inputs, a pure function should always return the same result.

    ์ž์‹ ์˜ ์ผ์—๋งŒ ์‹ ๊ฒฝ์”๋‹ˆ๋‹ค. ํ˜ธ์ถœ๋˜๊ธฐ ์ „์— ์กด์žฌํ–ˆ๋˜ ๊ฐ์ฒด๋‚˜ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋™์ผ ์ž…๋ ฅ, ๋™์ผ ์ถœ๋ ฅ. ๋™์ผํ•œ ์ž…๋ ฅ์ด ์ฃผ์–ด์ง€๋ฉด ํ•ญ์ƒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ์ˆœ์ˆ˜ ํ•จ์ˆ˜์˜ ํŠน์ง•

  3. ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ ˆ์‹œํ”ผ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ์‹œํ”ผ๋ฅผ ๋”ฐ๋ฅด๊ณ  ์š”๋ฆฌ ๊ณผ์ •์—์„œ ์ƒˆ๋กœ์šด ์žฌ๋ฃŒ๋ฅผ ๋„ฃ์ง€ ์•Š์œผ๋ฉด ๋งค๋ฒˆ ๊ฐ™์€ ์š”๋ฆฌ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋ฆฌ์•กํŠธ ๊ฐœ๋…์— ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์ž์ฃผ ์–ธ๊ธ‰๋˜์–ด์„œ ํฅ๋ฏธ๋กœ์›€! ์ด ๋ฌธ์žฅ๋„ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž ๊น ์ฐ๋จนํ•  ๋•Œ ๋ดค๋˜ ๋ฌธ์žฅ์ธ๋ฐ ๊ทธ๋Œ€๋กœ ๋“ค์–ด๊ฐ€์žˆ์–ด์„œ ์žฌ๋ฐŒ๋‹ค.

  4. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ˆœ์ˆ˜์„ฑ์— ํฌ๊ฒŒ ์˜์กดํ•˜์ง€๋งŒ, ์–ธ์  ๊ฐ€๋Š”, ์–ด๋”˜๊ฐ€์—์„œ, ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋ฐ”๋€Œ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์š”์ ์ž…๋‹ˆ๋‹ค!

    • [ํ•œํƒ„] ํ”„๋ก ํŠธ์—”๋“œ์—์„œ๋Š” ํŠนํžˆ ์ด ์ˆœ์ˆ˜์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์ง€ ์•Š๋‚˜์š”..ใ… ใ… 
    • ๊ณต๊ฐ..

  5. However, itโ€™s fine because youโ€™ve created them during the same render, inside TeaGathering. No code outside of TeaGathering will ever know that this happened. This is called โ€œlocal mutationโ€โ€”itโ€™s like your componentโ€™s little secret.

    ํ•˜์ง€๋งŒ TeaGathering ๋‚ด๋ถ€์—์„œ ๋™์ผํ•œ ๋ Œ๋”๋ง ์ค‘์— ์ƒ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. TeaGathering ์™ธ๋ถ€์˜ ์–ด๋–ค ์ฝ”๋“œ๋„ ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚ฌ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ โ€œ์ง€์—ญ ๋ณ€์ดโ€๋ผ๊ณ  ํ•˜๋ฉฐ, ์ปดํฌ๋„ŒํŠธ์˜ ์ž‘์€ ๋น„๋ฐ€๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • ์ง€์—ญ ๋ณ€์ด๋ผ๋Š” ๊ฐœ๋… ์ž์ฒด๋Š” ์ฒ˜์Œ ๋ดค๋Š”๋ฐ ์ง€๊ธˆ๊นŒ์ง€ ๋ฌด์˜์‹์ ์œผ๋กœ ์‚ฌ์šฉํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ๋ฐฐ์—ด์ด ๋‹ด๊ธด ์ƒํƒœ๊ฐ€ ์žˆ์„ ๋•Œ ๊ทธ ๋ฐฐ์—ด์„ ํ•„ํ„ฐ๋งํ•œ ๊ฐ’์„ ๋ณ€์ˆ˜์— ๋‹ด์•„์„œ ๋ Œ๋”๋งํ•œ๋‹ค๋˜๊ฐ€.

  6. In React, side effects usually belong inside event handlers. Event handlers are functions that React runs when you perform some actionโ€”for example, when you click a button. Even though event handlers are defined inside your component, they donโ€™t run during rendering! So event handlers donโ€™t need to be pure.

    React์—์„œ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋Š” ๋ณดํ†ต ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์— ์†ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ๋•Œ(์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ) React๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ์ •์˜๋˜์–ด ์žˆ๊ธด ํ•˜์ง€๋งŒ ๋ Œ๋”๋ง ์ค‘์—๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ๋”ฐ๋ผ์„œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ์ˆœ์ˆ˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

    • ์ข€ ์–ด๋ ค์›Œ์„œ ๊ณฑ์”น๋Š” ์ค‘์ธ๋ฐ ๋ Œ๋”๋ง ์ค‘์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฉด ์ˆœ์ˆ˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์ ์„ ๊ณ„์† ์ƒ๊ฐํ•˜๊ฒŒ ๋œ๋‹ค.

  7. If youโ€™ve exhausted all other options and canโ€™t find the right event handler for your side effect, you can still attach it to your returned JSX with a useEffect call in your component. This tells React to execute it later, after rendering, when side effects are allowed. However, this approach should be your last resort.

    • useEffect๊ฐ€ ํ•˜๋Š” ์ผ์„ ์ž˜ ํ’€์–ด์„œ ์„ค๋ช…ํ•ด์ฃผ์—ˆ๋‹ค. ํ•ญ์ƒ ๊ทธ๋ƒฅ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ›…์ด๋ผ๊ณ ๋งŒ ์ƒ๊ฐํ–ˆ์Œ.
    • ๋ฆฌ์•กํŠธ clean code์˜ ํฌ์ธํŠธ ์ค‘ ํ•˜๋‚˜๊ฐ€ useEffect ๋‚จ์šฉ์œผ๋กœ ์ธํ•œ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ตœ์†Œํ™”ํ•˜๋Š๋ƒ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๐Ÿ’ก ์ •๋ณด

  • ํ•œ๊ตญ์—์„œ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ™œ๋™์„ ํ™œ๋ฐœํžˆ ํ•˜๋Š” FE ์‹œ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ์ค‘ ํ…Œ์˜ค๋ผ๋Š” ๋ถ„์ด ํ•จ์ˆ˜ํ˜• ์ฝ”๋”ฉ์— ๋Œ€ํ•œ ๋ธ”๋กœ๊ทธ ๊ธ€์„ ์ข…์ข… ์ž‘์„ฑํ•ด์ฃผ์‹ฌ. ํ”„๋ก ํŠธ์—”๋“œ ์˜์—ญ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ํ…Œ์˜ค๋‹˜ ๋ธ”๋กœ๊ทธ ์ฐธ๊ณ  ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.
  • https://velog.io/@teo
  • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ฐฐ์›Œ๋ณด์ž!