이론 (Front-end)/React

[React] React 사용해보기

이우열 2023. 4. 25. 23:21
728x90
React를 사용하기 전에 Vanilla JS(바닐라 자바스크립트)와 비교를 해봅시다.

 

✅ Vanilla JS

<!DOCTYPE html>
<html>
  <body>
    <span>Total clicks: 0</span>
    <button id="btn">Click me</button>
  </body>

  <script>
    let counter = 0;
    const button = document.getElementById("btn");
    const span = document.querySelector("span");
    function handleClick() {
      counter = counter + 1;
      span.innerText = `Total clicks: ${counter}`;
    }
    button.addEventListener("click", handleClick);
  </script>
</html>

실행 화면

위의 HTML 코드는 "Click me"라는 버튼을 클릭하면 "Total clicks"의 숫자가 올라가는 코드입니다.

 

이러한 프로그램을 만들기 위해서 Javascript를 활용하여

  1. counter라는 변수를 만들고
  2. buttonspan을 선택한 뒤
  3. 함수를 만들어 버튼을 클릭할 때 발생하는 이벤트리스너를 설정하여
  4. counter의 숫자를 하나 늘리고
  5. span 안의 텍스트counter를 다시 넣어줍니다.

 


 

✅ React CDN

 

https://ko.legacy.reactjs.org/docs/cdn-links.html

 

CDN 링크 – React

A JavaScript library for building user interfaces

ko.legacy.reactjs.org

리액트를 사용하기 위해 npm에 등록된 패키지를 CDN으로 바로 활용 가능한 unpkg를 이용하여

script 태그 안에 넣어줍니다.


✏️ development vs. production

development는 개발용으로 배포용 버전에 적합하지 않고

React의 용량 및 성능 최적화된 배포용 버전은 production 버전입니다.


✅ React

<!DOCTYPE html>
<html>
  <body>
    <div id="root"></div>
  </body>
  <script src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
  <script src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
  <script>
    const root = document.getElementById("root");
    const h3 = React.createElement(
      "h3",
      {
        id: "title",
        onMouseEnter: () => console.log("mouse enter"),
      },
      "Hello I'm a span"
    );
    const btn = React.createElement(
      "button",
      {
        onClick: () => console.log("im clicked"),
        style: {
          backgroundColor: "tomato",
        },
      },
      "Click me"
    );
    const container = React.createElement("div", null, [h3, btn]);
    ReactDOM.render(container, root);
  </script>
</html>

 

✏️ import한 react와 react-dom

import한 react는 interactivity의 원동력이자 react를 사용할 수 있도록 하는 것입니다.

react-domReact element를 HTML에 둘 수 있도록 해주는 것입니다.

 

 

✏️ React.createElement

element를 만드는 것이며 3개의 인자(argument)가 올 수 있습니다.

ex) React.createElement("html 태그 명", {propertys}, "content")

 

property id, class, style 그리고 event listener까지 지정할 수 있습니다.

content로 선언된 컴포넌트를 불러오기 위해서는 대괄호를 사용하여 불러올 수 있습니다.

 

 

✏️ ReactDOM.render

React element를 가지고 HTML로 만들어 배치한다는 것을 의미합니다.

React 18 버전부터는 ReactDOM.createRoot(root).render(container)와 같이 사용합니다.

 


✅ 바닐라 JS와 React 비교

바닐라 JS에서는 HTML을 먼저 만들고, JavaScript로 가져와서 HTML을 수정하는 방식입니다.

React JS에서는 모든 것이 JavaScript로써 시작해서 그 다음이 HTML이 되는 방식입니다.

 


 

✅ JSX

https://ko.legacy.reactjs.org/docs/introducing-jsx.html

 

JSX 소개 – React

A JavaScript library for building user interfaces

ko.legacy.reactjs.org

React에서는 JSX라는 문법을 사용합니다.

JSX란, JavaScript를 확장한 문법이며 HTML에서 사용한 문법과 흡사한 문법을 통해 React 요소를 만들 수 있게 해줍니다.

 


✅ Babel

https://babeljs.io/

 

Babel · Babel

The compiler for next generation JavaScript

babeljs.io

Babel이란 JavaScript 컴파일러입니다.

다시 말하자면 JavaScript로 결과물을 만들어주는 컴파일러이며 소스 대 소스 컴파일러(transpiler)라고 불립니다.

 

🚨 Babel을 사용하는 이유는 JSX로 적은 코드를 브라우저가 JSX라고 이해할 수 있는 형태로 바꿔주어야 하기 때문입니다.

 


 

✅ JSX, Babel을 사용해 리팩토링

<!DOCTYPE html>
<html>
  <body>
    <div id="root"></div>
  </body>
  <script src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
  <script src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
  <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
  <script type="text/babel">
    const root = document.getElementById("root");
    function Title() {
      return (
        <h3 id="title" onMouseEnter={() => console.log("mouse enter")}>
          Hello I'm a title
        </h3>
      );
    }
    const Button = () => (
      <button
        style={{ backgroundColor: "tomato" }}
        onClick={() => console.log("im clicked")}
      >
        Click me
      </button>
    );
    const Container = () => (
      <div>
        <Title />
        <Button />
      </div>
    );
    ReactDOM.render(<Container />, root);
  </script>
</html>

JSX에서는 컴포넌트를 함수로 만들어서 리턴해주어야 합니다.

이 때, 컴포넌트의 첫 글자는 반드시 대문자로 해야 하는데 그 이유는 HTML 태그와 혼동이 될 수 있기 때문입니다.

728x90