let's get IT with DAVINA ๐Ÿ’ป

JSX ๋ณธ๋ฌธ

DEV_IN/React

JSX

๋‹ค๋นˆ์น˜์ฝ”๋“œ๐Ÿ’Ž 2023. 2. 21. 23:58

About JSX

  • React์—์„œ UI๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•์œผ๋กœ, JavaScript๋ฅผ ํ™•์žฅํ•œ ๋ฌธ๋ฒ• (JavaScript XML) ⇒ ์ด ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด์„œ React ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋™์•ˆ HTML์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ณ , JS๋ฅผ ์„ค์ •ํ•œ ๋’ค, ๋‹ค์‹œ HTML์— ํ•ด๋‹น ์„ค์ • ๋‚ด์šฉ์„ ๋ฐ˜์˜ํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด, React JSX๋Š” JS๋กœ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  ๋งˆ์ง€๋ง‰์— HTML์— ์—…๋ฐ์ดํŠธ/๋ฐ˜์˜ํ•ด์ค๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” JS์ฝ”๋“œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. “Bable”์„ ํ†ตํ•ด JSX๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” JS๋กœ ์ปดํŒŒ์ผ ํ›„, JS๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฝ๊ณ  ํ™”๋ฉด์— ๋ Œ๋”๋ง ํ•ฉ๋‹ˆ๋‹ค.

DOM ๊ทธ๋ฆฌ๊ณ  React JSX

  • CSS&JSX ๋ฌธ๋ฒ•๋งŒ์„ ๊ฐ€์ง€๊ณ  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฆ‰, ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํŒŒ์ผ์ด ์ค„๊ณ , ํ•œ ๋ˆˆ์— ์ปดํฌ๋„ŒํŠธ ํ™•์ธ ๊ฐ€๋Šฅ!
  • JSX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JS๋งŒ์œผ๋กœ ๋งˆํฌ์—… ํ˜•ํƒœ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ DOM์— ๋ฐฐ์น˜
  • HTML๊ณผ ๋น„์Šทํ•œ ๋ฌธ๋ฒ•์„ ํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋””์ž์ด๋„ˆ์™€์˜ ํ˜‘์—…์— ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


Why JSX?

  • ํ•œ ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๊ณผ ๋””์ž์ธ
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋งŒ ๋ณด๋Š”๊ฒŒ ์•„๋‹Œ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ๋•์Šต๋‹ˆ๋‹ค.
  • ๊ตฌ์กฐ์™€ ๋™์ž‘์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ํ•œ ๋ญ‰์น˜๋กœ ์ ์€ ์ฝ”๋“œ์…‹ → ์ปดํฌ๋„ŒํŠธ
//React without JSX

return React.createElement(
	"h1", null, `Hello, ${formatName(user)}!`
//React with JSX -> ๋ณต์žก์„ฑ ์ค„๊ณ , ๊ฐ€๋…์„ฑ ๋†’์ด๊ธฐ

return <h1>Hello, {formatName(user)}!</h1>;

JSX ํ™œ์šฉ ๊ทœ์น™

  • ํ•˜๋‚˜์˜ element ์•ˆ์— ๋ชจ๋“  elements๊ฐ€ ํฌํ•จ (์ตœ์ƒ์œ„์—์„œ opening tag & closing tag๋กœ ๊ฐ์‹ธ๊ธฐ)

  • element class ์‚ฌ์šฉ ์‹œ, className์œผ๋กœ ํ‘œ๊ธฐ (class๋กœ ์ž‘์„ฑ ํ•˜๋ฉด html ํด๋ž˜์Šค ์†์„ฑ ๋Œ€์‹ , js ํด๋ž˜์Šค๋กœ ๋ฐ›์•„๋“ค์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜)

  • JS ๊ธฐ๋ณธ ๋ฌธ๋ฒ• ์‚ฌ์šฉ ๊ฐ€๋Šฅ → JavaScript ํ‘œํ˜„์‹ ์‚ฌ์šฉ ์‹œ, ์ค‘๊ด„ํ˜ธ{} ์ด์šฉ (๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์ธ์‹) 
    • ex. {๋ณ€์ˆ˜๋ช…, ํ•จ์ˆ˜ ๋“ฑ}
โญ๏ธ ํ•จ์ˆ˜ : ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ์„ ์–ธ๋˜์—ˆ์„ ๋•Œ, {function}์ด ์•„๋‹Œ {function()}์œผ๋กœ ํ˜ธ์ถœํ˜•์œผ๋กœ ์จ์ฃผ์ž
    • JSX์—์„œ style์†์„ฑ ์ง‘์–ด ๋„ฃ์„ ๋•Œ : style = {object ์ž๋ฃŒํ˜•์œผ๋กœ ๋งŒ๋“  ์Šคํƒ€์ผ}
      • {{color: "blue}}

  • ์‚ฌ์šฉ์ž ์ •์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ (PascalCase) (์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘์‹œ, ์ผ๋ฐ˜์ ์ธ HTML ์—˜๋ฆฌ๋จผํŠธ๋กœ ์ธ์‹)

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ HTML ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ํ‘œ์‹œํ•  ๋•Œ, map()ํ•จ์ˆ˜๋ฅผ ์ด์šฉ
    • ์ด๋•Œ, ๋ฐ˜๋“œ์‹œ "key" JSX ์†์„ฑ์„ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค!!
    • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ํ•ญ๋ชฉ์— key๋ฅผ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋จ!
- ์ด๋•Œ, key ์†์„ฑ์˜ ์œ„์น˜๋Š” map method ๋‚ด๋ถ€์— ์žˆ๋Š” ์ฒซ ์—˜๋ฆฌ๋จผํŠธ์— ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.
- key ์†์„ฑ๊ฐ’์€ ๊ฐ€๋Šฅํ•˜๋ฉด ๋ฐ์ดํ„ฐ์—์„œ ์ œ๊ณตํ•˜๋Š” id๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ์ƒ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์œ ์ผํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ)
- ๊ณ ์œ  id๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋‚˜ ๋ฐฐ์—ด index๋ฅผ ๋„ฃ์–ด์„œ ํ•ด๊ฒฐ (BUT, this is as a last resort! ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ๋งŒ..)

          โ—๏ธ -> ๊ณ ์œ ํ•œ id๊ฐ€ ์•„๋‹Œ index๋ฅผ key๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ์•„์ดํ…œ์ด ๋งจ ์•ž์— ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ index๊ฐ€ ํ•˜๋‚˜์”ฉ ๋ฐ€๋ ค์„œ key๊ฐ€ ๋“ค์–ด๊ฐ„ ํ˜•์ œ๋…ธ๋“œ๋“ค์„ ์ „๋ถ€ updateํ•ด์•ผํ•œ๋‹ค.

 

Comments