inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

웹 게임을 만들며 배우는 React

6-4. useEffect로 업데이트 감지하기

useEffect deps부분과 코드가 이것도 맞는건지 궁금합니다.

304

대원

작성한 질문수 8

0

작성한 코드는 아래와 같습니다.

제로초님과 코드가 다른 부분은

useRef 선언 부분 [] -> null,

useEffect deps , useEffect return부분입니다.

  1. useRef를 배열이 아닌 상태로 사용하여 setTimeout을 설정시 문제되는 점이 있을까요?

  2. useEffect 함수 return 부분에 clearTimeout사용법이 저렇게 사용하는게 맞나요?

  3. onClick할 경우 새로운 번호를 winNumbers에 할당돼서 useEffect deps 를 winNumbers로 설정했습니다. 알맞게 잘 적용된걸까요?

이 코드로하면 잘 실행되고 마운트와 언마운트시 콘솔도 잘 찍힙니다.

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

function getWinNumbers() {
  console.log("getWinNumbers");
  const numbers = Array(45)
    .fill()
    .map((v, i) => i + 1);
  const shuffle = [];
  while (numbers.length > 0) {
    shuffle.push(
      numbers.splice(Math.floor(Math.random() * numbers.length), 1)[0]
    );
  }
  const bonusNumber = shuffle[shuffle.length - 1];
  const winNumbers = shuffle.slice(0, 6).sort((a, b) => a - b);
  return [...winNumbers, bonusNumber];
}

function Lotto() {
  const [winNumbers, setWinNumbers] = useState(getWinNumbers());
  const [winBalls, setWinBalls] = useState([]);
  const [bonus, setBonus] = useState();
  const [redo, setRedo] = useState(false);
  const timeout = useRef(null);

  useEffect(() => {
    console.info("useEffect start !");
    for (let i = 0; i < winNumbers.length - 1; i++) {
      timeout.current = setTimeout(() => {
        setWinBalls((prevState) => [...prevState, winNumbers[i]]);
      }, (i + 1) * 1000);
    }
    timeout.current = setTimeout(() => {
      setBonus(winNumbers[6]);
      setRedo(true);
    }, 7000);

    return () => {
      console.info("useEffect end !");
      timeout.current = clearTimeout();
    };
  }, [winNumbers]);

  const onClickRedo = () => {
    setWinNumbers(getWinNumbers());
    setWinBalls([]);
    setBonus(null);
    setRedo(false);
  };

  return (
    <>
      <div>당첨 숫자</div>
      <div>
        {winBalls.map((i) => (
          <Ball key={i} number={i} />
        ))}
      </div>
      <div>보너스</div>
      {bonus && <Ball number={bonus} />}
      {redo && <button onClick={onClickRedo}>한 번 더!</button>}
    </>
  );
}

export default Lotto;

react

답변 1

0

제로초(조현영)

지금 clearTimeout이 전혀 작동하지 않습니다. clearTimeout(아이디) 처럼 해야 하는 겁니다. 그리고 setTimeout이 배열이 아니라서 마지막 것만 취소되고 앞에 것들은 취소되지 않습니다.

redo 때문에 에러가 숨겨진 겁니다.

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

0

203

2

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

0

87

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

531

2

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

0

412

2

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

0

331

1

npm run dev 할 때 에러발생

0

479

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