Frontend & Publishing/React.js

React 구구단 게임 만들기 [함수형 컴포넌트]

heeju 2022. 8. 17. 10:35

 

const Gugudan = () => {
  const [first, setFirst] = React.useState(Math.ceil(Math.random() * 9));
  const [second, setSecond] = React.useState(Math.ceil(Math.random() * 9));
  const [value, setValue] = React.useState('');
  const [result, setResult] = React.useState('');
  const inputRef = React.useRef(null);

  const onSubmitForm = (e) => {
    e.preventDefault();
    if(parseInt(value) === first * second) {
      setResult(`정답: ${value}`);
      setFirst(Math.ceil(Math.random() * 9));
      setSecond(Math.ceil(Math.random() * 9));
      setValue('');
      inputRef.current.focus();
    } else {
      setResult('땡');
      setValue('');
      inputRef.current.focus();
    }
  }

  const onChangeInput = (e) => {
    setValue(e.target.value)
  }

  return (
    <React.Fragment>
      <p>{first} 곱하기 {second} 는?</p>
      <form onSubmit={onSubmitForm}>
        <input type="number" ref={inputRef} value={value} onChange={onChangeInput} />
        <button type="submit">입력</button>
      </form>
      <p>{result}</p>
    </React.Fragment>
  );
 }
 
 ReactDOM.createRoot(document.querySelector('#root')).render(<Gugudan />);

 

state 선언

first = 곱할 첫번째 랜덤 숫자

second = 곱할 두번째 랜덤 숫자

value = input value

result = 정답을 알려주는 텍스트

inputRef = input의 DOM에 접근 (ref = DOM에 직접 접근할때 사용하는 속성)

 

onSubmit 함수 - 정답일 경우

e.preventDefault(); = 기본이벤트인 submit 막기

if(parseInt(value) === first * second) = 사용자가 입력한 value와 정답이 같을 경우

setResult(`정답: ${value}`); = 정답 텍스트, 정답 숫자

setFirst(Math.ceil(Math.random() * 9)); = 첫번째 랜덤 숫자 재생성
setSecond(Math.ceil(Math.random() * 9)); = 두번째 랜덤 숫자 재생성

setValue(''); = 사용자가 입력한 value 값 초기화

inputRef.current.focus(); = input에 focus

 

onSubmit 함수 - 틀렸을 경우

setResult('땡'); = 땡 텍스트
setValue(''); = 사용자가 입력한 value 값 초기화

inputRef.current.focus(); = input에 focus

 

onChangeInput 함수 - 사용자가 입력한 value 값을 state value에 넣기

const onChangeInput = (e) => {
  setValue(e.target.value)
}

 

가상의 묶어주는 태그 = <React.Fragment>

 

최상위 #root에 Gugudan 컴포넌트 추가
 ReactDOM.createRoot(document.querySelector('#root')).render(<Gugudan />);

 

 

반응형