리액트 스터디

[리액트] 구구단 만들기

front-hyun 2023. 10. 5. 13:49

리액트는 spa이다. 

data가 변경되면 화면이 변경되는 거!

함수 컴포넌트는 this 쓸 일이 없고, 코드가 짧아서 클래스 컴포넌트보다 많이 사용된다. 

 

하나의 사이트에 여러 state가 존재한다. 

객체를 함부로 바꾸지 말아라. (불변성)

배열도 객체인데, 복사한 배열을 바꿔라. 

 

바뀌는 것은 state 

안 바뀌는 것은 그냥 태그로 놔두기. 

 

구구단 컴포넌트 만들기

import "./App.css";
import GuGuDan from "./like-button";
function App() {
  return (
    <div className="App">
      <GuGuDan />
    </div>
  );
}

export default App;

 

import React, { useState } from "react";

function GuGuDan() {
  //랜덤한 숫자
  const [first, setfirst] = useState(Math.ceil(Math.random() * 9));
  const [second, setSecond] = useState(Math.ceil(Math.random() * 9));
  const [value, setValue] = useState("");
  const [result, setResult] = useState("");
  //   const checkAnswer = () => {
  //     first * second === value ? setResult("정답") : setResult("땡");
  //   };

  const checkAnswer = () => {
    const answer = first * second;
    if (parseInt(value, 10) === answer) {
      //10진수로 변환
      setResult("정답");
    } else {
      setResult("땡");
    }
  };
  return (
    <>
      {first} 곱하기 {second}는? <br />
      <input
        onChange={(e) => {
          setValue(e.target.value);
        }}
      />
      <button onClick={checkAnswer}>입력!</button> <br />
        {value}{result}
    </>
  );
}
export default GuGuDan;

결과만 보고 코드를 짰었는데 10진수 변환을 하지 않고 삼항연산자로만 했었다. 

result가 제대로 나오지 않았다. 10진수로 변환을 반드시 해야 함!!!

강의에서는 class 문법으로 코드를 짰는데 저는 함수 문법이 더 편해서 함수로 짰습니다. 

여러 개의 구구단 만들기

app.js에 컴포넌트 여러 개 쓰면 된다. 

import "./App.css";
import GuGuDan from "./like-button";
function App() {
  return (
    <div className="App">
      <GuGuDan />
      <GuGuDan />
      <GuGuDan />
    </div>
  );
}

export default App;

 

return 안에 감싸는태그는 <Fragment> <div> <> 세개 중 하나 쓰기

form이 들어가면 onSubmit 쓰기

form이 없으면 onClick

 

직접 만든 함수는 화살표 함수 쓰기

return 안에는 화살표 함수 안 써도 된다. 

 

입력 버튼 클릭시 정답알려주는 구구단

 

import React, { useState } from "react";

function GuGuDan() {
  //랜덤한 숫자
  const [first, setfirst] = useState(Math.ceil(Math.random() * 9));
  const [second, setSecond] = useState(Math.ceil(Math.random() * 9));
  const [value, setValue] = useState("");
  const [result, setResult] = useState("");
  //   const checkAnswer = () => {
  //     first * second === value ? setResult("정답") : setResult("땡");
  //   };

  const checkAnswer = () => {
    setResult(`정답: ${first * second}`);
  };
  return (
    <>
      {first} 곱하기 {second}는? <br />
      <input
        onChange={(e) => {
          setValue(e.target.value);
        }}
      />
      <button onClick={checkAnswer}>입력!</button> <br />
      {result}
      <br />
    </>
  );
}
export default GuGuDan;