inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

웹 게임을 만들며 배우는 React

숫자야구 Hooks로 전환하기(+useState lazy init)

hooks로 변환하니 다음과 같은 에러가 납니다.

454

동우

작성한 질문수 6

0

제 생각에는 초기 배열이 빈배열이어서 length를 쓸 수 없어서 나는 에러 같은데 어떻게 해결해야 할지 모르겠습니다.

react

답변 4

0

동우

현영님 해결됬습니다. 너무 감사드립니당^^

0

제로초(조현영)

setTries((prevTries) => {
          [
            ...prevTries,
            { try: value, result: `${strike}스트라이크 ${ball}볼입니다.` },
          ];
        });

여기서 return을 안 하셨습니다.

setTries((prevTries) => {
          return [
            ...prevTries,
            { try: value, result: `${strike}스트라이크 ${ball}볼입니다.` },
          ];
});

0

동우

import React, { useState, useRef } from "react";
import Try_hooks from "./Try_hooks";

function getNumbers() {
  // 숫자 4개를 겹치지 않고 랜덤하게 뽑는 함수
  const candidate = [1, 2, 3, 4, 5, 6, 7, 8, 9];
  const array = [];

  for (let i = 0; i < 4; i += 1) {
    const chosen = candidate.splice(Math.floor(Math.random() * (9 - i)), 1)[0];
    array.push(chosen);
  }
  return array;
}

const NumberBaseball = () => {
  const [result, setResult] = useState("");
  const [value, setValue] = useState("");
  const [answer, setAnswer] = useState(getNumbers());
  const [tries, setTries] = useState([]);
  const onRefInput = useRef(null);

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

  const onSubmitForm = (e) => {
    e.preventDefault();
    if (value === answer.join("")) {
      setResult("홈런!");
      setTries((prevTries) => {
        return [...prevTries, { try: value, result: "홈런!" }];
      });
      alert(`정답입니다! 정답은 ${answer.join("")} 입니다.`);
      alert("게임을 다시 시작합니다.");
      setValue("");
      setAnswer(getNumbers());
      setTries([]);
    } else {
      console.log(answer.join(""));
      const answerArray = value.split("").map((v) => parseInt(v));
      let strike = 0;
      let ball = 0;
      if (tries.length >= 9) {
        // 10번 이상 틀렸을 때
        setResult(`10번 이상 틀려서 실패! 정답은 ${answer.join("")} 입니다.`);
        alert(`10번 이상 틀려서 실패! 정답은 ${answer.join("")} 입니다.`);
        alert("게임을 다시 시작합니다.");
        setValue("");
        setAnswer(getNumbers());
        setTries([]);
      } else {
        // 답 틀렸으면
        for (let i = 0; i < 4; i += 1) {
          if (answerArray[i] === answer[i]) {
            strike += 1;
          } else if (answer.includes(answerArray[i])) {
            ball += 1;
          }
        }
        setTries((prevTries) => {
          [
            ...prevTries,
            { try: value, result: `${strike}스트라이크 ${ball}볼입니다.` },
          ];
        });
        setResult(`틀렸습니다. ${9-tries.length}번 남았습니다.`);
      }
    }
    onRefInput.current.focus();
  };

  return (
    <>
      <h3>{result}</h3>
      <form onSubmit={onSubmitForm}>
        <input
          type="number"
          value={value}
          onChange={onChangeInput}
          maxLength={4}
          ref={onRefInput}
        />
      </form>
      <div>시도: {tries.length}</div>
      <ul>
        {/* 반복되는 내용은 배열로 만들어서 map 함수로 반복한다. */}
        {tries.map((item, index) => {
          return (
            // key로 index를 쓰면 나중에 성능 최적화 시 문제가 되므로 쓰지 않는다.
            // 컴포넌트로 분리(큰 컴포넌트로 부터 작은 컴포넌트를 분리하는 탑다운 방식), props로 값 전달
            <Try_hooks key={item + index} value={item} index={index} />
          );
        })}
      </ul>
    </>
  );
};

export default NumberBaseball;

0

제로초(조현영)

초기 배열이 빈 배열([])이더라도 length를 쓸 수 있습니다. 코드를 보여주세요.

npm run dev 실행 시 포트가 안뜨는 문제

0

203

2

timeouts.current를 useEffect 의 input값으로 넣었을때

0

86

2

렌더링 테스트 코드 (Hooks)

0

80

1

Cannot find package 'react-refesh' 이런 에러 뜨시는 분들 보세요.

0

149

1

해당 에러 뜨는 분들 보세요. "Uncaught TypeError: ReactDom.createRoot is not a function"

1

191

1

강사님 레포지토리에서 코드 복사 시 master 브랜치 말고 react18 브랜치꺼 복붙하세요ㅠㅠ

0

95

1

useMemo와 useCallback 사용 시기

0

207

2

onRightClickTd가 작동을 하지 않습니다.

0

226

1

action.type 불러오는 방식

0

222

2

onClickRedo 질문

0

172

1

const Try = require(./Try) 빨간줄

0

248

1

npx webpack 실행시

0

313

1

지뢰찾기 강좌에서 빈칸들 한번에 열기 파트에서 여쭤보고싶은부분이 있어서 글 올립니다.

0

235

1

강좌에서 다루지 않은 기능들은 어떻게 학습하면 좋을까요?

0

311

1

react devtool이 enable 않됩니다.

0

530

2

React 랜더링이 되지 않습니다.

0

411

2

비동기로 동작하는 setState에 대해서

0

331

1

npm run dev 할 때 에러발생

0

478

2

memo, PureComponenet, shouldComponentUpdate 관련 질문

0

206

1

devMiddleware의 필요성

0

352

1

리액트에서 화살표 함수를 사용해야하는 이유

0

935

2

path.join관련질문

0

282

2

2-9. 웹팩 데브 서버와 핫 리로딩 설치과정 시 에러

0

374

1

next.js 에서 이와 비슷한 예제를 돌리고있는데 react랑 달라서 질문 드립니

1

491

4