본문 바로가기
FrontEnd/React.js

[React.js] 제로초 웹게임 - 1. 구구단 (react, babel)

by Chaedie 2022. 10. 21.
728x90

강의를 통해 새로 알게 된 것들

CRA없이 html 파일 하나에다가 react, babel을 script로 세팅해서 React SPA 페이지를 만들어 보았습니다. 리액트를 처음 만났을 때 분명히 이런 방식을 접해봤었고, JSX가 아닌 이전 문법도 접해보았습니다. 하지만 그 당시엔 새로운 지식을 다량 접하다 보니 제대로 못 알아들었었습니다.

제로초 님 강의를 보면서 다시금 Babel이 JSX를 변환해준다는 것도 알게 되었고, index.html에다가 직접 React Component를 만드는 경험도 해보았습니다. 한번씩 "남이 만들어 둔 CRA 없이는 Page하나 못만드는 바보" 라는 생각을 하곤 했는데 마법의 뒷부분을 알게 되니 기분이 좋네요.

아주 간단한 구구단 만들기였지만, 기본을 다시 다지는 꽤 의미있는 강의였다고 생각합니다.

<html>
  <head>
    <meta charset="utf-8" />
    <title>구구단</title>
  </head>
  <body>
    <div id="root"></div>
    <!-- <script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script> -->
    <!-- <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script> -->
    <script src="https://unpkg.com/react@18/umd/react.production.min.js" crossorigin></script>
    <script src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js" crossorigin></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
    <script type="text/babel">
      'use strict';
      function Gugudan() {
        const [result, setResult] = React.useState('');
        const [input, setInput] = React.useState('');
        const [number, setNumber] = React.useState({
          first: ~~(Math.random() * 8 + 2),
          second: ~~(Math.random() * 8 + 2),
        });
        const numberInput = React.useRef();

        const onSubmitAnswer = e => {
          const { first, second } = number;
          e.preventDefault();
          if (+input === first * second) {
            setResult(`${first} * ${second} = ${input} : 정답입니다!`);
            setNumber({
              first: ~~(Math.random() * 8 + 2),
              second: ~~(Math.random() * 8 + 2),
            });
          } else {
            setResult('틀렸습니다 😅');
          }
          setInput('');
          numberInput.current.focus();
        };
        return (
          <>
            <header>
              <h1>구구단</h1>
            </header>
            <main>
              <h3>
                {number.first} 곱하기 {number.second} 은?
              </h3>
              <form onSubmit={onSubmitAnswer}>
                <input type="number" value={input} onChange={e => setInput(e.target.value)} ref={numberInput} />
                <input type="submit" value="submit" />
              </form>
              <h3>{result}</h3>
            </main>
          </>
        );
      }
    </script>
    <script type="text/babel">
      ReactDOM.createRoot(document.querySelector('#root')).render(<Gugudan />);
    </script>
  </body>
</html>

댓글