[TIL] 220120

Lee SyongΒ·2022λ…„ 1μ›” 20일
0

TIL

λͺ©λ‘ 보기
155/204
post-thumbnail

πŸ“ 였늘 ν•œ 것

  1. React μš”μ†Œ 생성 및 배치, 이벀트 등둝

  2. JSX


πŸ“– ν•™μŠ΅ 자료

  1. λ…Έλ§ˆλ“œ 코더 κ°•μ˜ 'ReactJS둜 μ˜ν™” μ›Ή μ„œλΉ„μŠ€ λ§Œλ“€κΈ°'

πŸ“š 배운 것

1. THE BASICS OF REACT

React JSλŠ” UIλ₯Ό interactive ν•˜κ²Œ λ§Œλ“€μ–΄μ€€λ‹€.

μš°μ„ , React JSκ°€ μ–΄λ–€ 문제λ₯Ό ν•΄κ²°ν•΄μ£ΌλŠ”μ§€, μ™œ μœ μš©ν•œμ§€λ₯Ό μ•Œκ³  μ‚¬μš©ν•  ν•„μš”κ°€ μžˆλ‹€.
이λ₯Ό μ•Œμ•„λ³΄κΈ° μœ„ν•΄ 바닐라 JS μ½”λ“œμ™€ React JSλ₯Ό μ‚¬μš©ν•΄ μž‘μ„±ν•œ μ½”λ“œλ₯Ό 비ꡐ해볼 것이닀.

1) React JS μ„€μΉ˜

React JSλ₯Ό μ„€μΉ˜ν•˜κΈ° μœ„ν•΄μ„œλŠ” 2개의 JavaScript μ½”λ“œλ₯Ό import ν•΄μ•Ό ν•œλ‹€.
ν•˜λ‚˜λŠ” react이고, λ‹€λ₯Έ ν•˜λ‚˜λŠ” react-dom이닀.
reactλŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ interactive ν•˜κ²Œ λ§Œλ“€μ–΄μ£ΌλŠ” λΌμ΄λΈŒλŸ¬λ¦¬μ΄λ‹€.
react-dom은 React둜 μƒμ„±ν•œ React elementλ₯Ό HTML body에 λ‘˜ 수 μžˆλ„λ‘ ν•œλ‹€.

( μ—¬κΈ°μ„  node.js μ‚¬μš© x )

<!DOCTYPE html>
<html>
  <body></body>
  <script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
  <script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
</html>

μ½˜μ†”μ— React라고 μž‘μ„±ν•˜λ©΄ React Objectκ°€ 좜λ ₯λœλ‹€.
이제 μ½”λ“œμ— Reactκ°€ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— 이λ₯Ό λΆˆλŸ¬μ™€ React.~~~ 라고 μ“Έ 수 μžˆλ‹€.

2) React JS κ·œμΉ™

β€» React JS둜 κ΅¬ν˜„ν•΄λ³Ό HTML & 바닐라 JS μ½”λ“œ

<!DOCTYPE html>
<html>
  <body>
    <h3 id="total-click">Total Click: 0</h3>
    <button id="btn">Click</button>
  </body>
  <script>
    const button = document.querySelector("#btn");
    const h3 = document.querySelector("#total-click");
    let counter = 0;
    const handleBtnClick = () => {
      counter++;
      h3.innerText = `Total Click: ${counter}`;
    };
    button.addEventListener("click", handleBtnClick);
  </script>
</html>

(1) React JS element 생성

React JSλŠ” HTML μ½”λ“œλ₯Ό html νŒŒμΌμ— μž‘μ„±ν•˜λŠ” λŒ€μ‹  JavaScript μ½”λ“œλ₯Ό μ‚¬μš©ν•΄ μž‘μ„±ν•œλ‹€.
react-dom이 λͺ¨λ“  React elementλ₯Ό HTML body에 λ‘˜ 수 μžˆλ„λ‘ ν•œλ‹€.

λ¨Όμ €, React elementλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 'μ–΄λ €μš΄ 방법'을 μ‚΄νŽ΄λ³Ό 것이닀.
μ΄λŠ” κ°œλ°œμžλ“€ μ‚¬μ΄μ—μ„œ μ‹€μ œλ‘œ μ‚¬μš©λ˜λŠ” 방법은 μ•„λ‹ˆμ§€λ§Œ, React JS의 λ³Έμ§ˆμ„ μ΄ν•΄ν•˜λŠ” 데 μ€‘μš”ν•˜λ‹€.
λ”°λΌμ„œ, 이해가 λͺ©μ μΌ 뿐 μ ˆλŒ€ μ™ΈμšΈ ν•„μš”λŠ” μ—†λ‹€.

React element μƒμ„±ν•œ ν›„ 이λ₯Ό HTML body μ•ˆμ— λ°°μΉ˜ν•˜κΈ°

<!DOCTYPE html>
<html>
  <body>
    <div id="root"></div>
  </body>
  <script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
  <script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
  <script>
    const root = document.getElementById("root");
    const h3 = React.createElement("h3", { id: "cool", style: { color: "red" } }, "Hello!");
    const btn = React.createElement("button", null, "Click!");
    const container = React.createElement("div", null, [h3, btn]);
    ReactDOM.render(container, root);
  </script>
</html>

React.createElement()λŠ” React elementλ₯Ό μƒμ„±ν•œλ‹€.
첫 번째 μΈμžλ‘œλŠ” 생성할 νƒœκ·Έ 이름을 λ¬Έμžμ—΄λ‘œ λ°›λŠ”λ‹€.
두 번째 μΈμžλ‘œλŠ” ν•΄λ‹Ή νƒœκ·Έμ— μ μš©ν•˜κ³ μž ν•˜λŠ” 속성을 object둜 λ°›λŠ”λ‹€.
μ„Έ 번째 μΈμžλ‘œλŠ” ν•΄λ‹Ή νƒœκ·Έμ˜ 컨텐츠λ₯Ό λ°›λŠ”λ‹€.

ReactDOM.render()λŠ” React elementλ₯Ό HTML μš”μ†Œλ‘œ λ§Œλ“€μ–΄ λ°°μΉ˜ν•¨μœΌλ‘œμ¨ μ‚¬μš©μžκ°€ λ³Ό 수 μžˆλ„λ‘ ν•œλ‹€.

μ΄λ•Œ React elementλ₯Ό 어디에 λ°°μΉ˜ν•  것인지λ₯Ό 지정해야 ν•œλ‹€.
κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” 방법은 body μ•ˆμ— idκ°€ root인 div μš”μ†Œβ€•body μ•ˆμ— 생성할 μœ μΌν•œ HTML μ½”λ“œμ΄λ‹€β€•λ₯Ό λ§Œλ“  ν›„ JS νŒŒμΌμ—μ„œ 이λ₯Ό 가져와 여기에 μ§€μ •ν•˜λŠ” 것이닀.

μ—¬λŸ¬ 개의 React elementλ₯Ό renderν•˜κ³  μ‹Άλ‹€λ©΄, μ—¬λŸ¬ 개의 React elementλ₯Ό 포함할 containerλ₯Ό λ§Œλ“  ν›„ 이λ₯Ό render ν•΄μ•Ό ν•œλ‹€.
μ΄λ•Œ containerλ₯Ό λ§Œλ“œλŠ” React.createElement()의 μ„Έ 번째 μΈμžμ—λŠ” containerκ°€ 포함할 HTML μš”μ†Œλ“€μ„ μ•„μ΄ν…œμœΌλ‘œ κ°€μ§€λŠ” 배열을 전달해야 ν•œλ‹€.

이제 개발자 λ„κ΅¬μ˜ Elements νƒ­μ—μ„œ body μ•ˆμ— span νƒœκ·Έκ°€ μ‘΄μž¬ν•˜λŠ” 것을 확인할 수 μžˆλ‹€.

바닐라 JS VS React JS

바닐라 JSλ₯Ό μ‚¬μš©ν•˜λ©΄(HTMLβ†’JS) HTML μš”μ†Œλ₯Ό λ§Œλ“  ν›„ 이λ₯Ό js 파일둜 κ°€μ Έμ˜€λŠ” 반면,
React JSλ₯Ό μ‚¬μš©ν•˜λ©΄(JSβ†’HTML) HTML에 λ°°μΉ˜ν•  μš”μ†Œλ₯Ό JavaScript둜 λ§Œλ“ λ‹€λŠ” 차이점이 μžˆλ‹€.

μ΄λŠ” 곧 React JSκ°€ HTML을 μ—…λ°μ΄νŠΈ ν•¨μœΌλ‘œμ¨ μ‚¬μš©μžμ—κ²Œ λ³΄μ—¬μ§ˆ λ‚΄μš©μ„ 컨트둀 ν•  수 μžˆμŒμ„ μ˜λ―Έν•œλ‹€.

(2) event 등둝

μ•žμ„œ React elementλ₯Ό 생성할 λ•Œ React.createElement()의 두 번째 μΈμžμ— ν•΄λ‹Ή μš”μ†Œμ— μ μš©ν•  속성을 전달할 수 μžˆλ‹€κ³  ν–ˆλŠ”λ°, 이λ₯Ό μ΄μš©ν•΄ eventλ₯Ό 등둝할 μˆ˜λ„ μžˆλ‹€.

<!DOCTYPE html>
<html>
  <body>
    <div id="root"></div>
  </body>
  <script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
  <script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
  <script>
    const root = document.getElementById("root");
    const h3 = React.createElement(
      "h3",
      {
        onMouseEnter: () => console.log("mouse enter"),
        style: { color: "red" },
      },
      "Hello!"
    );
    const btn = React.createElement(
      "button",
      { onClick: () => console.log("click") },
      "클릭"
    );
    const container = React.createElement("div", null, [h3, btn]);
    ReactDOM.render(container, root);
  </script>
</html>

3) JSX

μ•žμ„œ, React elementλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μ–΄λ €μš΄ 방법을 μ‚΄νŽ΄λ΄€λ‹€.
JSXλ₯Ό μ‚¬μš©ν•˜λ©΄ '보닀 쉽고 νŽΈλ¦¬ν•˜κ²Œ' React elementλ₯Ό 생성할 수 μžˆλ‹€.

JSXλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό ν™•μž₯ν•œ λ¬Έλ²•μ΄μ§€λ§Œ HTMLμ—μ„œ μ‚¬μš©ν•œ 문법과 λΉ„μŠ·ν•˜μ—¬ React.createElement()λ₯Ό μ‚¬μš©ν•˜λŠ” 것보닀 μ’€ 더 μ‰½κ²Œ React μš”μ†Œλ₯Ό λ§Œλ“€ 수 μžˆλ„λ‘ ν•œλ‹€.

(1) React.createElement() λŒ€μ‹  JSX둜 μž‘μ„±

// React.createElement() μ‚¬μš©
const h3 = React.createElement(
  "h3",
  {
    onMouseEnter: () => console.log("mouse enter"),
    style: { color: "red" },
  },
  "Hello!"
);

const btn = React.createElement(
  "button",
  { onClick: () => console.log("click") },
  "클릭"
);
// JSX둜 μž‘μ„±ν•œ μ½”λ“œ
const Title = (
  <h3
    onMouseEnter={() => console.log("mouse enter")} // λ“±ν˜Έ(=) 뒀에 {}λ₯Ό μ“΄λ‹€, 속성 끝에 μ‰Όν‘œλŠ” 쓰지 μ•ŠλŠ”λ‹€
    style={{ color: "red" }}
  >
    Hello!
  </h3>
);

const Button = <button onClick={() => console.log("click")}>클릭</button>;

(2) babel μ„€μΉ˜

ν•œνŽΈ, λΈŒλΌμš°μ €λŠ” JSX둜 μž‘μ„±ν•œ μ½”λ“œλ₯Ό 기본적으둜 이해할 수 μ—†λ‹€.
λΈŒλΌμš°μ €κ°€ JSX둜 μž‘μ„±ν•œ μ½”λ“œλ₯Ό 이해할 수 μžˆλ„λ‘ React μ½”λ“œλ‘œ λ°”κΎΈκΈ° μœ„ν•΄ babel을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

(μ—¬κΈ°μ„  node.js μ‚¬μš© x)

<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
  <!-- JSX둜 μž‘μ„±ν•œ μ½”λ“œ -->
</script>

(3) ν•˜λ‚˜μ˜ μ»΄ν¬λ„ŒνŠΈ μ•ˆμ— λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ„£λŠ” 방법

μ•žμ„œ, μ—¬λŸ¬ 개의 React elementλ₯Ό renderν•˜κ³  싢을 λ•ŒλŠ”, μ—¬λŸ¬ 개의 React elementλ₯Ό 포함할 containerλ₯Ό λ§Œλ“  ν›„ 이λ₯Ό render ν•΄μ•Ό ν•œλ‹€κ³  ν–ˆλ‹€.
μ΄λ•Œ containerλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ React.createElement() λŒ€μ‹  JSXλ₯Ό μ‚¬μš©ν•΄ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.

  • μš°μ„ , HTML μš”μ†Œλ₯Ό λ‹΄κ³  μžˆλŠ” λ³€μˆ˜λ“€μ„ ν•¨μˆ˜λ‘œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.
  • μ—¬λŸ¬ 개의 μ»΄ν¬λ„ŒνŠΈλ₯Ό 포함할 μ»΄ν¬λ„ŒνŠΈλ„ ν•¨μˆ˜λ‘œ λ§Œλ“ λ‹€.
  • ν•΄λ‹Ή μƒμœ„ μ»΄ν¬λ„ŒνŠΈμ— μ—¬λŸ¬ 개의 ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈλ“€μ„ μΆ”κ°€ν•œλ‹€. (JSX 문법을 λ”°λ₯Έλ‹€)
  • μƒμœ„ μ»΄ν¬λ„ŒνŠΈλ₯Ό render ν•œλ‹€.

πŸ’‘ 주의!
μ΄λ•Œ 직접 λ§Œλ“  μ»΄ν¬λ„ŒνŠΈ μ΄λ¦„μ˜ 첫 번째 κΈ€μžλŠ”, 일반 HTML μš”μ†Œμ™€ κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄, λ°˜λ“œμ‹œ 'λŒ€λ¬Έμž'μ—¬μ•Ό ν•œλ‹€.

const root = document.getElementById("root");

// h3 νƒœκ·Έλ₯Ό 감싸고 μžˆλŠ” ()λŠ” VS Codeμ—μ„œ μžλ™μœΌλ‘œ 생긴 것이닀
// κ·Έλƒ₯ h3 νƒœκ·Έλ₯Ό return ν•˜λŠ” ν™”μ‚΄ν‘œ ν•¨μˆ˜μΌ 뿐이닀
const Title = () => (
  <h3
    onMouseEnter={() => console.log("mouse enter")}
    style={{ color: "red" }}
  >
    Hello!
  </h3>
);

const Button = () => (
  <button onClick={() => console.log("click")}>클릭</button>
);

const Container = () => (
  <div>
    <Title />
    <Button />
  </div>
);

ReactDOM.render(<Container />, root);

✨ 내일 ν•  것

  1. STATE
profile
λŠ₯λ™μ μœΌλ‘œ μ‚΄μž, ν–‰λ³΅ν•˜κ²ŒπŸ˜

0개의 λŒ“κΈ€