๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/React

[ํ•œ์ž… ํฌ๊ธฐ๋กœ ์ž˜๋ผ ๋จน๋Š” ๋ฆฌ์•กํŠธ] - React.js ์ž…๋ฌธ 2

by YeonBu 2024. 11. 22.
728x90

 


๊ฐ•์˜ - Section 5 : React.js ์ž…๋ฌธ

์œ ๋ฐ๋ฏธ : https://www.udemy.com/course/winterlood-react-basic/

์ธํ”„๋Ÿฐ : 

 

[2024] ํ•œ์ž… ํฌ๊ธฐ๋กœ ์ž˜๋ผ ๋จน๋Š” ๋ฆฌ์•กํŠธ(React.js) : ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‹ค์ „๊นŒ์ง€ ๊ฐ•์˜ | ์ด์ •ํ™˜ Winterlood - ์ธํ”„๋Ÿฐ

์ด์ •ํ™˜ Winterlood | ๊ฐœ๋…๋ถ€ํ„ฐ ๋…ํŠนํ•œ ํ”„๋กœ์ ํŠธ๊นŒ์ง€ ํ•จ๊ป˜ ๋‹ค๋ค„๋ณด๋ฉฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ์ด ๊ฐ•์˜๋กœ ํ•œ ๋ฒˆ์— ๋๋‚ด์š”. ํ•™์Šต์€ ์งง๊ฒŒ, ์‘์šฉ์€ ๊ธธ๊ฒŒ 17์‹œ๊ฐ„ ๋ถ„๋Ÿ‰์˜ All-in-one ๊ฐ•์˜!, ๋ฆฌ์•กํŠธ, ํ•œ ๊ฐ•์˜๋กœ

www.inflearn.com


 

 

 

React.js ์ž…๋ฌธ

Props - ์ปดํฌ๋„ŒํŠธ์— ๊ฐ’ ์ „๋‹ฌํ•˜๊ธฐ

 

 

* Props๋ž€? React ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐ์ดํ„ฐ์ด๋‹ค. ์ฝ๊ธฐ ์ „์šฉ์ด๋ฉฐ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค.

 

 

* Props ์‚ฌ์šฉ ์˜ˆ์ œ

1. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ Props ์ „๋‹ฌ(JSX๋ฅผ ์‚ฌ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ์— ์†์„ฑ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ)

function App() {
  return (
    <>
      <Button text = {"๋ฉ”์ผ"}/>
      <Button text = {"์นดํŽ˜"}/>
      <Button text = {"๋ธ”๋กœ๊ทธ"}/>
    </>
  )
}

 

2. ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ Props ๋ฐ›๊ธฐ(์ „๋‹ฌ๋œ Props๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ ‘๊ทผ)

const Button = (props) => {
    return (
        <button>{props.text}</button>
    )
};

 

 

* Props์˜ ํ™œ์šฉ ์˜ˆ์ œ

1. ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •(defaultProps - Props๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •)

// ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ
function App() {
  return (
    <>
      <Button text = {"๋ฉ”์ผ"} color = {"red"} />
      <Button text = {"์นดํŽ˜"}/>
      <Button text = {"๋ธ”๋กœ๊ทธ"}/>
    </>
  )
}

// ์ž์‹ ์ปดํฌ๋„ŒํŠธ
const Button = (props) => {
    return (
        <button style = { {color : props.color }}>
            {props.text}
        </button>
    )
};

Button.defaultProps = {
    color : "black"
}

export default Button;

 

 

2. ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ(์ˆซ์ž, ๋ฌธ์ž์—ด, ๋ฐฐ์—ด, ๊ฐ์ฒด ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ „๋‹ฌ)

function Profile({ name, age, hobbies }) {
  return (
    <div>
      <h1>{name}</h1>
      <p>Age: {age}</p>
      <ul>
        {hobbies.map((hobby, index) => (
          <li key={index}>{hobby}</li>
        ))}
      </ul>
    </div>
  );
}

function App() {
  return <Profile name="Alice" age={25} hobbies={['Reading', 'Traveling']} />;
}

 

 

3. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ children ์ „๋‹ฌ(<์ปดํฌ๋„ŒํŠธ>๋‚ด์šฉ</์ปดํฌ๋„ŒํŠธ> ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๊ทธ ๋‚ด์šฉ์ด props.children์œผ๋กœ ์ „๋‹ฌ๋จ)

function Wrapper(props) {
  return <div className="wrapper">{props.children}</div>;
}

function App() {
  return (
    <Wrapper>
      <h1>Hello, World!</h1>
      <p>This is a child element.</p>
    </Wrapper>
  );
}



 

 

React.js ์ž…๋ฌธ

์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง

 

 

* ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง ์ด๋ž€? ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜, ์ž…๋ ฅ์„ ํ•˜๊ฑฐ๋‚˜, ๋งˆ์šฐ์Šค ์›€์ง์ž„ ๋“ฑ๊ณผ ๊ฐ™์€ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ–ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ฆฌ์•กํŠธ๋Š” HTML์˜ ๊ธฐ๋ณธ DOM ์ด๋ฒคํŠธ์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋ช‡๊ฐ€์ง€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

(์—ฌ๊ธฐ์„œ ์ด๋ฒคํŠธ๋ž€, ์›น ๋‚ด๋ถ€์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ํ–‰๋™์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค)

 

 

* ๋ฆฌ์•กํŠธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง ํŠน์ง•

1. ์นด๋ฉœ ์ผ€์ด์Šค ์‚ฌ์šฉ

 : ๋ฆฌ์•กํŠธ์˜ ์ด๋ฒคํŠธ ์†์„ฑ์˜ ์ด๋ฆ„์€ ์†Œ๋ฌธ์ž ๋Œ€์‹  onClick, onChange์ฒ˜๋Ÿผ ์นด๋ฉœ ์ผ€์ด์Šค๋ฅผ ์‚ฌ์šฉํ•จ

 

2. SyntheticEvent(ํ•ฉ์„ฑ ์ด๋ฒคํŠธ) ์‚ฌ์šฉ

 : ๋ฆฌ์•กํŠธ๋Š” ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ SyntheticEvent๋ผ๋Š” ๋ž˜ํผ ๊ฐ์ฒด๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์ด๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ฐ„์˜ ํ˜ธํ™˜์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค

  (ํ•ฉ์„ฑ ์ด๋ฒคํŠธ๋ž€ ๋ชจ๋“  ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜๋กœ ํ†ต์ผํ•œ ํ˜•ํƒœ์ด๋‹ค)

 

 



React.js ์ž…๋ฌธ

State๋กœ ์ƒํƒœ ๊ด€๋ฆฌํ•˜๊ธฐ

 

 

* state๋ž€? ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๋™์  ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค.

 

 

* state ํŠน์ง•

1. ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌ

 : state๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋˜๊ณ  ๊ด€๋ฆฌ ๋จ. ์™ธ๋ถ€์—์„œ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋‚ด๋ถ€์—์„œ๋งŒ ์ˆ˜์ • ๊ฐ€๋Šฅ.

 

2. ๋ณ€๊ฒฝ ์‹œ ์ž๋™ UI ์—…๋ฐ์ดํŠธ

 : state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฆฌ์•กํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ™”ํ•˜์—ฌ ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธ ํ•จ

 

3. ๋ถˆ๋ณ€์„ฑ ์œ ์ง€

 : state๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , setState(ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ)๋‚˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜(ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ)๋ฅผ ์‚ฌ์šฉํ•ด ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

 

 

* state ์‚ฌ์šฉ๋ฒ•

import { useState } from 'react';


function App() {

  const [count, setCount] = useState(0);

  return (
    <>
      <h1>{count}</h1>
      <button onClick={() => {
        setCount(count + 1);
      }}>+</button>
    </>
  )
}

export default App

 

- useState(์ดˆ๊ธฐ๊ฐ’) : useState๋Š” ์ƒํƒœ๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ํ•จ์ˆ˜์ด๋ฉฐ, ๋ฐ˜ํ™˜๊ฐ’์€ [์ƒํƒœ๊ฐ’, ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜]์˜ ๋ฐฐ์—ด์ด๋‹ค.

- ์ƒํƒœ๊ฐ’ : ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” count

- ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜ : ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜. ์—ฌ๊ธฐ์„œ๋Š” setCount

 

 

 

React.js ์ž…๋ฌธ

State์™€ Props

 

State์™€ Props๋กœ ๋ณด๋Š” ๋ฆฌ๋ Œ๋”๋ง

const Bulb = ({light}) => {
  return (
    <div>
      {light === "ON" ? 
      <h1 style={{backgroundColor : "orange"}}>ON</h1> : <h1 style={{backgroundColor : "gray"}}>OFF</h1>}
    </div>
  )
}

function App() {

  const [count, setCount] = useState(0);
  const [light, setLight] = useState("OFF");

  return (
    <>
    <div>
      <Bulb light={light} />
      <button onClick={() => {
        setLight(light === "ON" ? "OFF" : "ON")
      }}>{light === "ON" ? "๋„๊ธฐ" : "์ผœ๊ธฐ"}</button>
    </div>

    <div>
      <h1>{count}</h1>
      <button onClick={() => {
        setCount(count + 1);
      }}>+</button>
    </div>
    </>
  )
}

 

* App ์ปดํฌ๋„ŒํŠธ : ๋‘ ๊ฐœ์˜ state(count์™€ light)๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ์ด ์ค‘ light๋Š” Bulb ์ปดํฌ๋„ŒํŠธ์— props๋กœ ์ „๋‹ฌ๋œ๋‹ค.

* Bulb ์ปดํฌ๋„ŒํŠธ : light๋ผ๋Š” props๋ฅผ ๋ฐ›์•„ ํ™”๋ฉด์— ON ๋˜๋Š” OFF ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.

* ๊ทธ๋ ‡๋‹ค๋ฉด count ๋ณ€๊ฒฝ ์‹œ Blub๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š”๊ฐ€?

  : count๋งŒ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ, Bulb ์ปดํฌ๋„ŒํŠธ๋Š” ๋ถ€๋ชจ๋กœ ๋ฐ›์€ props๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, props๋Š” ๋™์ผํ•œ ๊ฐ’(light)์„ ์œ ์ง€ํ•˜๋ฏ€๋กœ Bulb๋Š” ๋‹ค์‹œ ๋ Œ๋”๋ง ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

* ๊ฒฐ๋ก ! ๋ฆฌ๋ Œ๋”๋ง ์กฐ๊ฑด

 - state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค

 - ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌ๋œ props๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž์‹์€ ๋ฆฌ๋ Œ๋”๋ง ๋˜์ง€ ์•Š๋Š”๋‹ค

 - props๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค

 

 

 

๋ฐ˜์‘ํ˜•