[React] Quick Start :: 80% of React concepts

2023. 9. 12. 13:11ใ†React

728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“„ Docs

2023๋…„ 3์›”์— ๋ฆฌ๋‰ด์–ผ๋œ ๋ฆฌ์•กํŠธ ๊ณต์‹ ๋ฌธ์„œ์˜ ์ฒซ๋ฒˆ์งธ ์žฅ, "Quick Start"์˜ ๋‚ด์šฉ์ด๋‹ค.

๐Ÿ“š You will learn

  • ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ ๋ฐ ์ค‘์ฒฉ
  • ๋งˆํฌ์—…๊ณผ ์Šคํƒ€์ผ ์ถ”๊ฐ€
  • ๋ฐ์ดํ„ฐ ํ‘œ์‹œ
  • ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง๊ณผ ๋ชฉ๋ก ๋ Œ๋”๋ง
  • ์ด๋ฒคํŠธ ์‘๋‹ต ๋ฐ ํ™”๋ฉด ์—…๋ฐ์ดํŠธ
  • ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ณต์œ 

1. Creating and nesting components

  • ๋ฆฌ์•กํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์ฒด ๋กœ์ง๊ณผ ์™ธ๊ด€์„ ๊ฐ€์ง„ UI์˜ ์ผ๋ถ€์ด๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฒ„ํŠผ๋งŒํผ ์ž‘์„ ์ˆ˜๋„ ์žˆ๊ณ , ํ•œ ํŽ˜์ด์ง€ ์ „์ฒด๋งŒํผ ํด ์ˆ˜๋„ ์žˆ๋‹ค.
  • ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ๋งˆํฌ์—…์„ ๋ฆฌํ„ดํ•˜๋Š” JS ํ•จ์ˆ˜์ด๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ์˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

1-1) ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ

function MyButton() {
  return (
    <button>I'm a button</button>
  );
}

1-2) ์ปดํฌ๋„ŒํŠธ ์ค‘์ฒฉ

export default function MyApp() {
  return (
    <div>
      <h1>Welcome to my app</h1>
      <MyButton />
    </div>
  );
}

2. Writing markup with JSX

  • ๋Œ€๋ถ€๋ถ„์˜ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋Š” ํŽธ์˜์„ฑ์„ ์œ„ํ•ด JSX๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (์„ ํƒ์‚ฌํ•ญ์ž„!)
  • JSX๋Š” HTML๋ณด๋‹ค ๋” ์—„๊ฒฉํ•˜๋‹ค.
  • ๋ชจ๋“  ํƒœ๊ทธ๋ฅผ ๋‹ซ์•„์ค˜์•ผ ํ•œ๋‹ค. <br/>
  • ์ปดํฌ๋„ŒํŠธ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ JSX ํƒœ๊ทธ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†๊ณ  ํ•˜๋‚˜์˜ ๋ถ€๋ชจ๋กœ ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค. <div>...</div> ํ˜น์€ <>...</>
  • HTML์„ JSX๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” converter๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. HTML to JSX

3. Adding styles

  • className์œผ๋กœ CSS ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•œ๋‹ค. HTML์˜ class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค.
<img className="avatar" />
  • ๋ณ„๋„์˜ CSS ํŒŒ์ผ์— CSS ๊ทœ์น™์„ ์ž‘์„ฑํ•œ๋‹ค.
/* In your CSS */
.avatar {
  border-radius: 50%;
}
  • CSS ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ทœ์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์•Œ์•„์„œ ํ•˜๋ฉด ๋จ!

4. Displaying data

  • JSX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JS์— ๋งˆํฌ์—…์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ค‘๊ด„ํ˜ธ {} ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์‹œ JS๋กœ ๋Œ์•„๊ฐ€์„œ ์œ ์ €์—๊ฒŒ ๋ณด์—ฌ์ค˜์•ผ ํ•  ๋ณ€์ˆ˜๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.
return (
  <h1>
    {user.name}
  </h1>
);
  • JSX ์†์„ฑ์—์„œ๋„ ์ค‘๊ด„ํ˜ธ {} ๋ฅผ ์‚ฌ์šฉํ•ด JS๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
return (
  <img
    className="avatar"
    src={user.imageUrl}                // ๐Ÿ‘ˆ ์—ฌ๊ธฐ
    alt={'Photo of ' + user.name}     // ๐Ÿ‘ˆ ์ด๋Ÿฐ ๋ณต์žกํ•œ ํ‘œํ˜„์‹๋„ ๊ฐ€๋Šฅ

  />
);

5. Conditional rendering

  • JS์—์„œ ์‚ฌ์šฉํ•˜๋Š” if๋ฌธ, ์‚ผํ•ญ์—ฐ์‚ฐ์ž, logical && ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ๊ฑด๋ถ€๋กœ JSX๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

  • if๋ฌธ

let content;
if (isLoggedIn) {
  content = <AdminPanel />;
} else {
  content = <LoginForm />;
}
return (
  <div>
    {content}
  </div>
);
  • ์‚ผํ•ญ์—ฐ์‚ฐ์ž
<div>
  {isLoggedIn ? (
    <AdminPanel />
  ) : (
    <LoginForm />
  )}
</div>
  • logical && ๊ตฌ๋ฌธ
<div>
  {isLoggedIn && <AdminPanel />}
</div>

6. Rendering lists

  • JS์˜ for ๋ฐ˜๋ณต๋ฌธ, map()์„ ์ด์šฉํ•ด ๋ชฉ๋ก์„ ๋ Œ๋”๋งํ•œ๋‹ค.
  • ๋ฌธ์ž์—ด ํ˜น์€ ์ˆซ์ž๋กœ ๋œ (ํ˜•์ œ ์‚ฌ์ด์—์„œ) ๊ณ ์œ ํ•œ key ์†์„ฑ์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ID ๊ฐ™์€ data์—์„œ ๊ฐ€์ ธ์˜จ ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์‚ฝ์ž…, ์‚ญ์ œ, ์žฌ์ •๋ ฌ์„ ํ•  ๋•Œ ๋ฆฌ์•กํŠธ๊ฐ€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
const products = [
  { title: 'Cabbage', id: 1 },
  { title: 'Garlic', id: 2 },
  { title: 'Apple', id: 3 },
];

const listItems = products.map(product =>
  <li key={product.id}>
    {product.title}
  </li>
);

return (
  <ul>{listItems}</ul>
);

7. Responding to events

  • ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•ด ์ด๋ฒคํŠธ์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ „๋‹ฌ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค! (ํ•จ์ˆ˜๋ช… ๋’ค์— () ๋ถ™์ด์ง€ ๋ง๋ž€ ์†Œ๋ฆฌ)
function MyButton() {
  function handleClick() {
    alert('You clicked me!');
  }

  return (
    <button onClick={handleClick}>
      Click me
    </button>
  );
}

8. State : Updating the screen

  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ผ๋ถ€ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ํ‘œ์‹œํ•˜๊ธธ ์›ํ•  ๊ฒฝ์šฐ, state๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • useState๋ฅผ React import ๋ฐ›๊ณ , ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ state ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.
    • ํ˜„์žฌ state์™€ ์ด๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๋ฆ„์€ ๋งˆ์Œ๋Œ€๋กœ ๋ถ™์—ฌ๋„ ๋˜์ง€๋งŒ, ์ปจ๋ฒค์…˜์€ ๐Ÿ‘‰ [something, setSomething]
import { useState } from 'react';

function MyButton() {
  const [count, setCount] = useState(0);
  // ...

9. Using Hooks

  • use๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ Hooks์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • useState๋ฅผ ๋น„๋กฏํ•œ built-in Hooks์ด ์žˆ๋‹ค.
  • ๊ธฐ์กด์˜ Hooks๋ฅผ ์กฐํ•ฉํ•˜์—ฌ custom hook์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.

9-1. Hooks์˜ ์ œํ•œ์‚ฌํ•ญ

  • Hook์€ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ณด๋‹ค ๋” ์ œํ•œ์ ์ด๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ ํ˜น์€ ๋˜๋‹ค๋ฅธ ํ›…์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ๋งŒ ํ›…์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์กฐ๊ฑด๋ฌธ์ด๋‚˜ ๋ฐ˜๋ณต๋ฌธ์—์„œ useState๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์ƒˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฑฐ๊ธฐ์— ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

10. Props, lifting state up : Sharing data between components

  • ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ปดํฌ๋„ŒํŠธ๋กœ state๋ฅผ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.

  • JSX ์ค‘๊ด„ํ˜ธ๋ฅผ ์ด์šฉํ•ด ์ปดํฌ๋„ŒํŠธ์— ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ์ „๋‹ฌํ•œ ์ •๋ณด๋“ค์„ props๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • ์ด ๋ฐฉ์‹์„ lifting state up (state ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ)๋ผ๊ณ  ํ•œ๋‹ค.
// ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ
export default function MyApp() {
  const [count, setCount] = useState(0);

  function handleClick() {
    setCount(count + 1);
  }

  return (
    <div>
      <h1>Counters that update together</h1>
      <MyButton count={count} onClick={handleClick} />
      <MyButton count={count} onClick={handleClick} />
    </div>
  );
}
// ์ž์‹ ์ปดํฌ๋„ŒํŠธ
function MyButton({ count, onClick }) {
  return (
    <button onClick={onClick}>
      Clicked {count} times
    </button>
  );
}
728x90
๋ฐ˜์‘ํ˜•

'React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[React] Class Component  (0) 2023.10.02
[React] Describing the UI  (2) 2023.09.27
[React-Native] React-Navigation :: ํ™”๋ฉด ์ „ํ™˜ํ•˜๊ธฐ  (0) 2022.11.03