๊ฐœ๋ฐœ ๊ณต๋ถ€/๋ฐ๋ธŒ์ฝ”์Šค TIL

[ํด๋ผ์šฐ๋”ฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”์ง€๋‹ˆ์–ด๋ง TIL] 240202 - React.js ๊ธฐ์ดˆ

๊ฐ€์šค์ด 2024. 2. 2. 23:40

Intro


์˜ค๋Š˜์€ React์˜ ์ฃผ์š” ํŠน์„ฑ์ธ State์™€ Props์— ๋Œ€ํ•ด ํ•™์Šตํ•˜์˜€๋‹ค.

 

 

์˜ค๋Š˜ ํ•™์Šตํ•œ ๋‚ด์šฉ

: React.js ๊ธฐ์ดˆ


Why Reactโ“

  1. ๋ฆฌ์•กํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์˜ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  2. ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.
  3. Virtual DOM์„ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, 5๋ฒˆ์˜ ๋” ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Virtual DOM์— 5๋ฒˆ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋™์•ˆ ์‹ค์ œ ๋”์—๋Š” ์•„๋ฌด๋Ÿฐ ๋ณ€ํ™”๊ฐ€ ์—†๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ชจ๋‘ ์ข…๋ฃŒ๋˜๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ชจ์•˜๋‹ค๊ฐ€ ํ•œ๋ฒˆ์— ์‹ค์ œ ๋”์„ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
โš ๏ธ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
โ–ซ๏ธ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ์ ˆ์ฐจ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค ๋‚˜์—ดํ•ด์•ผ ํ•œ๋‹ค. (ex. ์š”์†Œ๋ฅผ ์„ ํƒํ•œ ๋‹ค์Œ ์š”์†Œ์˜ ์•„์ดํ…œ์„ ์–ด์ฉŒ๊ตฌ~~) โžก๏ธ jQuery
โ–ซ๏ธ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ๋ชฉ์ ์„ ๋ฐ”๋กœ ๋งํ•œ๋‹ค. (ex. ์•„์ดํ…œ์„ ์ฆ๊ฐ€/๊ฐ์†Œ ์‹œํ‚จ๋‹ค.) โžก๏ธ React

 

 

Create React App

: ๋ณต์žกํ•œ ์„ค์ • ์—†์ด ์‰ฝ๊ฒŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ๋•๋Š” ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ

 

 

๋ฆฌ์•กํŠธ ์•ฑ ์ƒ์„ฑํ•˜๊ธฐ

  • npx: ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•ญ์ƒ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. (node.js๋ฅผ ์„ค์น˜ํ•  ๋•Œ ํ•จ๊ป˜ ์„ค์น˜๋œ๋‹ค.)
npx create-react-app project-name

 

 

๋ฆฌ์•กํŠธ ์•ฑ ์‹คํ–‰ (package.json์˜ scripts ์ฐธ๊ณ )

npm start

 

 

Create React App ์ฝ”๋“œ ๋ถ„์„

  • public ํด๋”
    • fivicon.ico: ๋ธŒ๋ผ์šฐ์ € ํƒญ ์ œ๋ชฉ ์˜† ์•„์ด์ฝ˜
    • logo192.png, logo512.png, manifest.json: ๋ชจ๋ฐ”์ผ์—์„œ ํ™ˆํ™”๋ฉด์— ์ถ”๊ฐ€ ๋ฒ„ํŠผ ๋“ฑ์„ ๋ˆŒ๋ €์„ ๋•Œ ์„ค์น˜๋˜๋Š” ์•„์ด์ฝ˜
    • roboots.txt: ๊ฒ€์ƒ‰์—”์ง„ ์ˆ˜์ง‘/์ˆ˜์ง‘ํ•˜์ง€ ์•Š์Œ ๋“ฑ์„ ์„ค์ •ํ•˜๋Š” ํŒŒ์ผ
  • src ํด๋”
    • App.test.js: ์ฝ”๋“œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ
  • import/export
function App() {
  ...
}

export default App
import App from './App'

 

react๋Š” ESModules๋ฅผ ์‚ฌ์šฉํ•ด import/export๋กœ ๋ชจ๋“ˆ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ํ•œ๋‹ค.

 

 

JSX (์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ XML)

: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ HTML ํƒœ๊ทธ๋ฅผ ์„ž์–ด ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•

  • ๋ฐ˜๋“œ์‹œ ๋‹ซํžŒ ํƒœ๊ทธ์—ฌ์•ผ ํ•œ๋‹ค.
    • <br>๋„ <br /> ์ฒ˜๋Ÿผ ์…€ํ”„ํด๋กœ์ง• ํƒœ๊ทธ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. (ํ•˜๋‚˜์˜ ์ตœ์ƒ์œ„ ํƒœ๊ทธ๋กœ ์ž์‹ ํƒœ๊ทธ๋“ค์„ ๋ฌถ์–ด์ค˜์•ผ ํ•œ๋‹ค.
    • ์ตœ์ƒ์œ„ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๋• React.Frament๋‚˜ ๋นˆ ํƒœ๊ทธ๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค.
import React from 'react'

function App() {
  return (
    <React.Fragment>
	  <h1></h1>
	  <header></header>
    </React.Fragment>
  )
}
function App() {
  return (
    <>
	  <h1></h1>
	  <header></header>
    </>
  )
}
  • ํƒœ๊ทธ์— class ์ง€์ •ํ•˜๋Š” ๋ฒ•
    • class="ํด๋ž˜์Šค๋ช…"์ด ์•„๋‹Œ className="ํด๋ž˜์Šค๋ช…"์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
  • ์Šคํƒ€์ผ๋ง
    • CSS ํŒŒ์ผ์„ importํ•ด์„œ ๊ฐ€์ ธ์˜ค๊ธฐ
    • inline style
import MyHeader from './MyHeader';
// import './App.css';

function App() {
  const style = {
    App: {
      backgroundColor: 'black',
    },
    h2: {
      color: 'red',
    },
    bold_text: {
      color: 'green',
    },
  };

  return (
    <div className="App" style={style.App}>
      <MyHeader />
      <h2 style={style.h2}>์•ˆ๋…•, ๋ฆฌ์•กํŠธ</h2>
      <b style={style.bold_text} id="bold_text">
        React.js
      </b>
    </div>
  );
}

export default App;

 

 

 

State (์ƒํƒœ)

  • Counter.js ์˜ˆ์‹œ)
// state ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด useState ์ž„ํฌํŠธ ํ•„์š”
import React, { useState } from 'react';

const Counter = () => {
  // 0์œผ๋กœ ์ดˆ๊ธฐํ™” -> useState(0)
  const [count, setCount] = useState(0);
  const [count2, setCount2] = useState(0);

  // setCount๋  ๋–„๋งˆ๋‹ค Counter๊ฐ€ ๋ฆฌ๋ Œ๋”๋จ
  console.log('counter ํ˜ธ์ถœ');

  const onIncrease = () => {
    setCount(count + 1);
  };

  const onDecrease = () => {
    setCount(count - 1);
  };

  return (
    <div>
      <h2>{count}</h2>
      <button onClick={onIncrease}>+</button>
      <button onClick={onDecrease}>-</button>
    </div>
  );
};

export default Counter;

 

 

Props (Properties)

: ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๋Š” ๊ฐ’

 

โš ๏ธ ๊ฐ’ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ปดํฌ๋„ŒํŠธ๋„ ์ „๋‹ฌ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • Container.js
const Container = ({ children }) => {
  return <div style={{ margin: 20, padding: 20, border: '1px solid gray' }}>{children}</div>;
};

export default Container;

 

  • App.js
import Container from './Container';
import Counter from './Counter';
import MyHeader from './MyHeader';

function App() {
  console.log('App ํ˜ธ์ถœ');

  const counterProps = {
    a: 1,
    b: 2,
  };

  return (
    <Container>
      <div className="App">
        <MyHeader />
        <Counter {...counterProps} />
      </div>
    </Container>
  );
}

export default App;

 

โœ… ์ปดํฌ๋„ŒํŠธ๋Š” ๋ณธ์ธ์ด ๊ฐ€์ง„ State, ๋ถ€๋ชจ์—๊ฒŒ ๋‚ด๋ ค์˜จ Props, ๋ถ€๋ชจ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ ๋ฆฌ๋ Œ๋”๋ง๋œ๋‹ค.

 

 

 

 

 

๋งˆ๋ฌด๋ฆฌ


 

์ด๋ฒˆ์ฃผ ๊ฐ•์˜๋Š” ๊ทธ๋ž˜๋„ ์—ด์‹ฌํžˆ ๋“ค์—ˆ๋‹ค. ๐Ÿ˜ƒ

ํ•˜๋ฃจ์น˜ ๋ฐ€๋ฆฌ๊ธด ํ–ˆ์ง€๋งŒ ใ…Žใ…Ž ๋‚˜๋จธ์ง€๋Š” ์ฃผ๋ง์— ๋“ค์–ด์•ผ์ง€!