06_Oct_2021 ๐Ÿฐ์—˜๋ฆฌ์Šค AI ํŠธ๋ž™ TIL: JSX์™€ Component

์œ ํ™˜์ตยท2021๋…„ 10์›” 7์ผ
0

JSX

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

JSX๋Š” Babel์— ์˜ํ•ด์„œ Transcompile ๋œ๋‹ค. (์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ)

JSX

<div className='App'>
	<header className='App'>
    	<img src={logo} className='App-logo' alt='logo' />
        	<h1 className='App-title'>Welcome to React</h1>
    </header>
    <p className='App-intro'>
    	Hello World
    </p>
</div>

JS (Babel์œผ๋กœ ๋ณ€ํ™˜๋œ JS ์ฝ”๋“œ)

react.createElement('div', {
	className: 'App'
}, React.createElement('header', {
	className: 'App-header'
}, React.createElement('img', {
	src: logo,
    className: 'App-logo',
    alt: 'logo'
}), React.createElement('h1', {
	className: 'App-title'
}, 'Welcome to React')), React.createElement('p', {
	className: 'App-intro'
}, 'Hello world'));

JSX์˜ ์žฅ์ 

  1. ๊ฐœ๋ฐœ์ž์˜ ํŽธ์˜์„ฑ์„ ํ–ฅ์ƒ์‹œ์ผœ์ค€๋‹ค.
  2. ํ˜‘์—…์— ์šฉ์ด(๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ๋™๋ฃŒ์˜ ์ดํ•ด๋„)ํ•˜๋ฉฐ, ์ƒ์‚ฐ์„ฑ์„ ์ฆ์ง„์‹œ์ผœ์ค€๋‹ค.
  3. ๋ฌธ๋ฒ• ์˜ค๋ฅ˜์™€ ์ฝ”๋“œ๋Ÿ‰์ด ๊ฐ์†Œ๋œ๋‹ค.

JSX์˜ ํŠน์ง•

HTML ํƒœ๊ทธ ๋‚ด์— JavaScript ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

HTML+JS์˜ ๊ฒฝ์šฐ

<div>
    <span id='a'></span> +
    <span id='b'></span> =
    <span id='sum'></span>
</div>
<script>
    const a = 3;
    const b = 6;
    document.getElementById('a').innerHTML = a;
    document.getElementById('b').innerHTML = b;
    document.getElementById('sum').innerHTML = a+b;
</script>

JSX

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

์ฐจ์ด์ 

1. class => className์œผ๋กœ ์ž…๋ ฅ

(
<div className='greeting' style={{padding:10, color: 'red'}}>
    {name}๋‹˜ ์–ด์„œ์˜ค์„ธ์š”. <br/>
    ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.
</div>
)

์ฃผ์˜์ : ์œ„์™€ ๊ฐ™์ด Inline style์˜ Propery name์€ camelCase๋กœ ์ž‘์„ฑํ•œ๋‹ค.
(e.g. font-size -> fontSize, padding-left -> paadingLeft)
2. ์Šคํƒ€์ผ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ object๋กœ ์ž‘์„ฑํ•œ๋‹ค.

style={{padding:10, color: 'red'}}

style์˜ ์ฒซ๋ฒˆ์งธ ์ค‘๊ด„ํ˜ธ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์ž„์„ ์•Œ๋ฆฌ๊ณ , ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์˜ค๋ธŒ์ ํŠธ ํ˜•ํƒœ๋กœ ์ž‘์„ฑ.
3. ๋‹ซ๋Š” ํƒœ๊ทธ๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค.

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

4. ์ตœ์ƒ๋‹จ element๋Š” ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค.

const App = () => {
    return (
    	<> {/* React.Fragment */}
       	    <div>Hello</div>
            <div>World</div>
        </>
    )
}

JSX์˜ ์›์น™์ƒ ์ตœ์ƒ๋‹จ Element๋Š” ํ•œ ๊ฐœ๋งŒ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ div ๋˜๋Š” React.Fragment๋ฅผ ์ด์šฉํ•ด ๊ฐ์‹ผ๋‹ค. ์‹ค์ œ ๋ Œ๋”๋ง ์‹œ์—๋Š” Fragment ์•ˆ์— ์žˆ๋Š” ๋‚ด์šฉ๋งŒ ์ถœ๋ ฅ๋œ๋‹ค.

Component

React์—์„œ ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ตœ์†Œ๋‹จ์œ„

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

const App = () => {
    return (
    	<div>
            <p>์•ˆ๋…•</p>
            <MyComponent>์—ฌ๊ธฐ</MyComponent>
            <div>๋ฐ”์ด๋ฐ”์ด</div>
        </div>
    );
}

Component์˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•œ๋‹ค. (htmlํƒœ๊ทธ์™€ ๊ตฌ๋ถ„ํ•œ๋‹ค)

Class Component/ Function Component๋กœ ๋‚˜๋‰œ๋‹ค.

Class Component

class Hello extends Component {
  render() {
    const { name } = this.props;
    return <div>{name}๋‹˜ ์–ด์„œ์˜ค์„ธ์š”.</div>
  }
}

Function Component

const Hello = (props) => {
    const { name } = props;
    return <div>{name}๋‹˜ ์–ด์„œ์˜ค์„ธ์š”.</div>
}

์ดˆ๊ธฐ React์˜ Component๋Š” ๋ชจ๋‘ Class Component์˜€์œผ๋‚˜, v16๋ฒ„์ „ ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด Function Component์™€ Hooks ๊ฐœ๋…์ด ๋ฐœํ‘œ๋˜๊ณ  ๋‚œ ํ›„, ํ˜„์žฌ๋Š” Function Component๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

Class Component ํŠน์ง•

  1. Class ๊ฐœ๋…์ด ๋งŽ์ด ํ™œ์šฉ๋˜๋Š” Java ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์นœ์ˆ™ํ•œ ํ˜•ํƒœ
  2. React์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฝ๋‹ค.

Component์˜ ํŠน์ง•

<MyComponent user={{name: '๋ฏผ์ˆ˜' }} color='blue'>
  <div>์•ˆ๋…•</div>
</MyComponent>

์ปดํฌ๋„ŒํŠธ์— Attribute์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์„ Props(Properties)๋ผ๊ณ  ํ•œ๋‹ค.
์ปดํฌ๋„ŒํŠธ ์•ˆ์— ์ž‘์„ฑ๋œ ํ•˜์œ„ Element๋ฅผ children์ด๋ผ๊ณ  ํ•˜๋ฉฐ, children๋„ props ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

const MyComponent = (props) => {
  const { user, color, children } = props;

  return (
    <div style={{ color }}>
      <p>{user.name}์˜ ํ•˜์œ„ ์š”์†Œ๋Š”</p>
      { children }
    </div>
  )
}

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

  • ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋• props ์‚ฌ์šฉ
  • ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ๋• state ์‚ฌ์šฉ
  • ๋ฐ์ดํ„ฐ๋Š” ๋ถ€๋ชจ -> ์ž์‹์œผ๋กœ๋งŒ ์ „๋‹ฌ๋œ๋‹ค.

Controlled Component/ Uncontrolled Component

  • Controlled Component: ๊ฐ Input๋“ค์˜ ๋ฐ์ดํ„ฐ๋ฅผ state๋ฅผ ์ด์šฉํ•ด ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ
  • Uncontrolled Component: ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌ์•กํŠธ๋กœ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ , ํ•„์š”ํ•  ๋•Œ Element๋กœ ๋ถ€ํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ปดํฌ๋„ŒํŠธ

ํ•œ์ค„ ํ‰: React๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ ค๋ฉด, JSX์™€ Component์˜ ๊ฐœ๋…์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์งš๊ณ  ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์› ๋‹ค.

profile
์‚ฌ์šฉ์ž์˜ ํŽธ์˜๋ฅผ ๋” ์ƒ๊ฐํ•˜๊ณ  ํŽธ์•ˆํ•œ UI/UX ๊ฐœ๋ฐœ์„ ๊ฟˆ๊พธ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ง€๋ง์ƒ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€