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

โœ๏ธ/React

React ๊ณต๋ถ€ํ•˜๊ธฐ(1) - ๊ธฐ๋ณธํŽธ

๐ŸŒˆ ๋ฒจ๋กœํผํŠธ์™€ ํ•จ๊ป˜ํ•˜๋Š” ๋ชจ๋˜ ๋ฆฌ์•กํŠธ

 

01. ๋ฆฌ์•กํŠธ๋Š” ์–ด์ฉŒ๋‹ค ๋งŒ๋“ค์–ด์กŒ์„๊นŒ?

 

Javascript๋Š” ์–ด๋–ค ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋ฉด, ๊ทธ ์ƒํƒœ์™€ ์—ฐ๊ฒฐ๋œ(getElementById) DOM์„ ๋ณ€๊ฒฝ!

React๋Š” ์–ด๋–ค ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋ฉด, ์•„์˜ˆ ์ „๋ถ€ ๋‹ค ๋‚ ๋ ค๋ฒ„๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด DOM์„ ๋ณด์—ฌ์คŒ!

=> ์–ด๋–ป๊ฒŒ ์—…๋ฐ์ดํŠธ ํ•ด์•ผ๋˜์ง€.. ๊ณ ๋ฏผํ•  ํ•„์š” ์—†์–ด์ง ๊ฐœ๋ฐœ์ด ์‰ฌ์–ด์กŒ๋‹ค

=> ๊ทผ๋ฐ ๋Š๋ฆฌ์ง€ ์•Š์•„?

=> virtual DOM์„ ์‚ฌ์šฉํ•ด์„œ ๋ณ€๊ฒฝ์ด ๋œ ๋ถ€๋ถ„๊ณผ ์•ˆ ๋œ ๋ถ€๋ถ„์„ ๋น„๊ตํ•ด์„œ ๋ณ€๊ฒฝ๋œ ๊ฒƒ๋งŒ ์‹ค์ œ DOM์— ์ ์šฉ

=> ๊ทธ๋ž˜์„œ ๊ฒฐ๋ก ์€ ๋น ๋ฅด๋‹ค!

 

02. ์ž‘์—…ํ™˜๊ฒฝ ์ค€๋น„

 

Node.js : for Webpack, Babel

Yarn : npm(node.js package manager) ์ƒ์œ„๋ฒ„์ „

์ฝ”๋“œ ์—๋””ํ„ฐ : VSC

Git bash

 

Webpack : ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํŒŒ์ผ(์ปดํฌ๋„ŒํŠธ)์„ ํ•œ๊ฐœ๋กœ ๊ฒฐํ•ฉ

Babel : JSX๋ฅผ ๋น„๋กฏํ•œ ์ƒˆ๋กœ์šด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”

 

03. ๋‚˜์˜ ์ฒซ๋ฒˆ์งธ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ

 

<Hello.js>

import React from 'react'; // ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๋ถˆ๋Ÿฌ์˜จ๋‹ค

function Hello() {
  return <div>์•ˆ๋…•ํ•˜์„ธ์š”</div>
}

export default Hello; // Hello ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ณด๋‚ธ๋‹ค

<App.js>

import React from 'react';
import Hello from './Hello';

function App() {
  return (
    <div>
      <Hello />
    </div>
  );
}

export default App;

<index.js>

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';

ReactDOM.render(<App />, document.getElementById('root')); // Id๊ฐ€ root์ธ DOM ๋ Œ๋”๋ง

<public/index.html>

<div id="root"></div>

 

04. JSX์˜ ๊ธฐ๋ณธ ๊ทœ์น™ ์•Œ์•„๋ณด๊ธฐ

 

JSX : JS + XML(HTML)

=> Babel์ด JSX๋ฅผ Javascript๋กœ ๋ณ€ํ™˜์‹œ์ผœ ์คŒ

 

[JSX ์•ˆ์— {์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’} ์‚ฌ์šฉํ•˜๊ธฐ]

<App.js>

import React from 'react';
import Hello from './Hello';

function App() {
  const name = 'react';
  return (
    <>
      <Hello />
      <div>{name}</div>
    </>
  );
}

export default App;

[style๊ณผ className]

<App.js>

import React from 'react';
import Hello from './Hello';
import './App.css';

function App() {
  const name = 'react';
  const style = {
    backgroundColor: 'black',
    color: 'aqua',
    fontSize: 24, // ๊ธฐ๋ณธ ๋‹จ์œ„ px
    padding: '1rem' // ๋‹ค๋ฅธ ๋‹จ์œ„ ์‚ฌ์šฉ ์‹œ ๋ฌธ์ž์—ด๋กœ ์„ค์ •
  }

  return (
    <>
      <Hello />
      <div style={style}>{name}</div>
      <div className="gray-box"></div>
    </>
  );
}

export default App;

<App.css>

.gray-box {
  background: gray;
  width: 64px;
  height: 64px;
}

 

05. props๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๊ฐ’ ์ „๋‹ฌํ•˜๊ธฐ

 

[๋น„๊ตฌ์กฐํ™” ํ• ๋‹น + defaultProps๋กœ ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •]

<App.js>

import React from 'react';
import Hello from './Hello';

function App() {
  return (
    <>
      <Hello name="react" color="red"/>
      <Hello color="pink"/>
    </>
  );
}

export default App;

<Hello.js>

import React from 'react';

function Hello({ color, name }) {
  return <div style={{ color }}>์•ˆ๋…•ํ•˜์„ธ์š” {name}</div>
}

Hello.defaultProps = {
  name: '์ด๋ฆ„์—†์Œ'
}

export default Hello;

[props.children]

<App.js>

import React from 'react';
import Hello from './Hello';
import Wrapper from './Wrapper';

function App() {
  return (
    <Wrapper>
      <Hello name="react" color="red"/>
      <Hello color="pink"/>
    </Wrapper>
  );
}

export default App;

<Wrapper.js>

import React from 'react';

function Wrapper({ children }) {
  const style = {
    border: '2px solid black',
    padding: '16px',
  };
  return (
    <div style={style}>
      {children}
    </div>
  )
}

export default Wrapper;

 

06. ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง

<App.js>

import React from 'react';
import Hello from './Hello';
import Wrapper from './Wrapper';


function App() {
  return (
    <Wrapper>
      <Hello name="react" color="red" isSpecial={true}/>
      <Hello color="pink" />
    </Wrapper>
  )
}

export default App;

<Hello.js>

import React from 'react';

function Hello({ color, name, isSpecial }) {
  return (
    <div style={{ color }}>
      {isSpecial ? <b>*</b> : null}
      {isSpecial && <b>*</b>}
      ์•ˆ๋…•ํ•˜์„ธ์š” {name}
    </div>
  );
}

Hello.defaultProps = {
  name: '์ด๋ฆ„์—†์Œ'
}

export default Hello;

A(true) && B : B

A(false) && B : false