elice/WIL

[week_08] React ๊ธฐ์ดˆ โ… (2) JSX์™€ ์ปดํฌ๋„ŒํŠธ

1. JSX

  • ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ๊ฐ์ฒด ์ƒ์„ฑ์„ ์œ„ํ•œ ๋ฌธ๋ฒ•์  ํŽธ์˜๋ฅผ ์ œ๊ณตํ•˜๋Š” JavaScript์˜ ํ™•์žฅ
  • HTML๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ƒ๊ฒผ์œผ๋‚˜ JavaScript์ด๊ณ , HTML๊ณผ ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ์žˆ๋‹ค.
  • JSX๋Š” Babel์— ์˜ํ•ด์„œ Transcompile ๋œ๋‹ค.

1-1. JSX์˜ ์žฅ์ 

1) ๊ฐœ๋ฐœ์ž ํŽธ์˜์„ฑ ํ–ฅ์ƒ

2) ํ˜‘์—…์— ์šฉ์ด / ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ

3) ๋ฌธ๋ฒ• ์˜ค๋ฅ˜์™€ ์ฝ”๋“œ๋Ÿ‰ ๊ฐ์†Œ

1-2. JSX์˜ ํŠน์ง• (HTML๊ณผ ์ฐจ์ด์ )

1) HTML ํƒœ๊ทธ ๋‚ด์— JavaScript ์—ฐ์‚ฐ

const App = () => {
  const a = 3;
  const b = 6;
  return <div>{a} + {b} = {a+b}</div>
}

2) class โžก className

(
<div className="greeting">{name}๋‹˜ ์•ˆ๋…•ํ•˜์„ธ์š”.</div>
)

3) ์Šคํƒ€์ผ์€ object๋กœ ์ž‘์„ฑ

(
<div className="greeting" style={{ padding: 10, color: 'red' }}>{name}๋‹˜ ์•ˆ๋…•ํ•˜์„ธ์š”.</div>
)
// ๋ฐ”๊นฅ ๊ด„ํ˜ธ : JavaScript ์ฝ”๋“œ์ž„์„ ์•Œ๋ฆฌ๋Š” ๊ด„ํ˜ธ
// ์•ˆ์ชฝ ๊ด„ํ˜ธ : JavaScript Object์˜ ์‹œ์ž‘์ž„์„ ์•Œ๋ฆฌ๋Š” ๊ด„ํ˜ธ
  • ์œ„์™€ ๊ฐ™์€ Inline style์˜ property name์€ camelCase๋กœ ์ ๋Š”๋‹ค. (ex. font-size โžก fontSize)

4) ๋‹ซ๋Š” ํƒœ๊ทธ ํ•„์ˆ˜

<div>
  <input type="text" />
  <br />
</div>

5) ์ตœ์ƒ๋‹จ element๋Š” ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜

// ์ž˜๋ชป๋œ ์˜ˆ์‹œ
const App = () => {
  return (
    <div>Hello</div>
    <div>World</div>
  )
}


// ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ
const App = () => {
  return (
    <>
      <div>Hello</div>
      <div>World</div>
    </>
  )
}
  • JSX์˜ ์›์น™์ƒ ์ตœ์ƒ๋‹จ Element๋Š” ํ•œ ๊ฐœ๋งŒ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ <div> ๋˜๋Š” <React.Fragment>๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ์‹ธ์ค˜์•ผ ํ•œ๋‹ค.
  • ์‹ค์ œ ๋ Œ๋”๋ง ์‹œ์—๋Š” Fragment ์•ˆ์— ์žˆ๋Š” ๋‚ด์šฉ๋งŒ ์ถœ๋ ฅ๋œ๋‹ค.
  • <React.Fragment>๋Š” ๊ฐ„๋‹จํžˆ <>๋กœ ํ‘œ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

2. Component

  • React์—์„œ ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ตœ์†Œ ๋‹จ์œ„
  • ์‚ฌ์šฉ์ž ์ •์˜ ํƒœ๊ทธ

1) Component์˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘

const MyComponent = ({ children }) => {
	return <div style={{padding: 20, color: "blue"}}>
    	{children}
    </div>;
}

2) Class Component / Function Component๋กœ ๋‚˜๋‰จ

  • ์ดˆ๊ธฐ React์˜ Component๋Š” ๋ชจ๋‘ Class Component์˜€์œผ๋‚˜, v16 ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด Function Component์™€ Hooks ๊ฐœ๋…์ด ๋ฐœํ‘œ๋˜์–ด ํ˜„์žฌ๋Š” Function Component๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.
/* Class */
class Hello extends Component {
  render() {
    const { name } = this.props
    return <div>{name}๋‹˜ ์•ˆ๋…•ํ•˜์„ธ์š”.</div>
  }
}


/* Function */
const Hello = (props) => {
  const { name } = props
  return <div>{name}๋‹˜ ์•ˆ๋…•ํ•˜์„ธ์š”.</div>
}
  • Class Component ํŠน์ง•
    • Class ๊ฐœ๋…์ด ๋งŽ์ด ํ™œ์šฉ๋˜๋Š” Java ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์นœ์ˆ™ํ•œ ํ˜•ํƒœ์ด๋‹ค.
    • React์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฝ๋‹ค.

3) Controlled Component / Uncontrolled Component

2-1. Component์˜ ํŠน์ง•

<MyComponent user={{name: "๋ฏผ์ˆ˜"}} color="blue">
  <div>์•ˆ๋…•ํ•˜์„ธ์š”.</div>
</MyComponent>

์ปดํฌ๋„ŒํŠธ์—์„œ Attribute์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์„ Props(Properties)๋ผ๊ณ  ํ•œ๋‹ค.

์ปดํฌ๋„ŒํŠธ ์•ˆ์— ์ž‘์„ฑ๋œ ํ•˜์œ„ Element๋ฅผ children์ด๋ผ๊ณ  ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  children๋„ ๊ฒฐ๊ตญ์—” props ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

์œ„์˜ ์˜ˆ์‹œ์—์„œ ๋ณด์•˜์„ ๋•Œ, user={{name: "๋ฏผ์ˆ˜"}} color="blue" ๋ถ€๋ถ„์ด Props๊ฐ€ ๋˜๊ณ , <div>์•ˆ๋…•ํ•˜์„ธ์š”.</div> ๋ถ€๋ถ„์ด children์ด ๋œ๋‹ค.

const MyComponent = (props) => {
  const { user, color, children } = props
  
  return (
    <div style={{ color }}>
      <p>{user.name}๋‹˜์˜ ํ•˜์œ„ element๋Š”</p>
      {children}
    </div>
  )
}

์œ„ ์ฝ”๋“œ๋Š” ์ƒ์œ„ Element ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ props ๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

์ด ์ปดํฌ๋„ŒํŠธ์˜ ์ž์‹(children) ์š”์†Œ ์—ญ์‹œ props ๋กœ๋ถ€ํ„ฐ ๊ฐ’์„ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

โœจ Component์˜ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ

1. ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ๋Š” Props
2. ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ๋Š” State
3. ๋ฐ์ดํ„ฐ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ โžก ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ๋งŒ ์ „๋‹ฌ