inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

웹 게임을 만들며 배우는 React

6-4강 useEffect 배열 입력값에 따른 로또 중복공 발생 질문

해결된 질문

248

TaeHyeon Kim

작성한 질문수 18

0

안녕하세요 제로초님 항상 좋은 강의 감사드립니다 :)

유튜브로 강의를 수강하다가, 인프런/유튜브 댓글에 같은 질문이 없어 질문을 남깁니다. (사실 하나 있긴 했는데 이해가 잘 안되더군요 ㅜㅜ)

강의에서 아래와 같이 useEffect의 배열에 winBalls.length===0을 넣으면 첫번째 공과 두번째 공이 중복으로 나오고, timeouts.current로 넣으면 의도한대로 제대로 공이 중복되지 않게 나오는 것을 확인할 수 있었습니다.

 

  useEffect(()=>{
    for(let i=0;i<6;i++){
      timeouts.current[i]=setTimeout(()=>{
        setWinBalls((prevState)=>[...prevState, winNumbers[i]]);
      }, (i+1)*1000);
    }
    timeouts.current[6]=setTimeout(()=>{
      setBonus(winNumbers[6]);
      setRedo(true);
    }, 7000);
    return ()=>{
      timeouts.current.forEach((v)=>{
        clearTimeout(v);
      })
    }
  },[winBalls.length===0]);

class형에서는 winBalls.length===0으로 해도 문제없지만 hooks에서는 문제가 발생한 이유를 저는 componentDidMount와 componentDidUpdate 역할을 useEffect가 한번에 해주기 때문에 중복발생하는 것으로 이해했습니다.

(useEffect에서 winBalls.length===0이라는 조건문에 mount,update할 때 각각 부합해서 중복발생하는 것으로 이해하였습니다.)

 

1. 그런데, timeouts.current을 배열에 넣을 때는 처음 mount될 때나 update될 때나 똑같이 빈 배열일텐데 왜 같은 공이 중복발생하지 않고 의도대로 제대로 작동하는지 궁금합니다.

 

2. winBalls.length===0과 같이 조건문을 useEffect 배열에 넣어도 되는건가요? 만약 가능하다면, winBalls.length===0을 배열에 넣을 경우, 위 중복 공 발생버그를 해결할 수 있는 방안도 있을까요?

 

항상 감사드립니다!

 

 

react

답변 1

0

제로초(조현영)

winBalls.length === 0이나 timeouts.current 둘 다 넣으실 필요가 없습니다.

제가 설명 잘못 한 부분 중 하나인데 ref인 timeouts는 []에 넣어도 아무 영향이 없습니다. 그냥 deps를 []로 하시면 됩니다.

0

TaeHyeon Kim

답변 감사합니다. 그런데 아직 헷갈리는 점이 있습니다. deps를 빈 배열로 해주면, 결국 class형 컴포넌트에서의 componentDidMount만 해주는 것과 같으므로 componentDidUpdate가 일어나지 않아 한판더 기능이 불가능할 것 같은데 혹시 추가설명을 부탁드려도 될까요?

0

제로초(조현영)

아, 오랜만에 소스코드를 다시 보는 것이라 이제 이해했습니다.

deps에 timeout.current 넣으셔야 합니다. 일반적으로는 deps에 ref를 넣는게 의미 없지만 여기서는 좀 역할을 합니다.

한 판 더에서는 onClickRedo를 실행합니다. 여기서 timeout.current = []; 부분에서 새 배열을 할당하고 참조가 바뀌게 되어서 useEffect를 다시 실행하게 됩니다.

0

TaeHyeon Kim

감사합니다. 혹시 deps를 winBalls.length===0으로 할 때엔 맨처음에 위 사진처럼 중복 공이 두번 발생하는 이유가, componentDidMount에서 한 번, 그리고 공이 생기면서 false로 바껴 componentDidUpdate가 발생해서 componentDidMount가 진행을 멈추고 update가 발생해서 맨처음 중복공만 두 번 발생하는게 맞나요?

0

제로초(조현영)

네 처음 1초가 지난 뒤 첫 공을 그리고 deps 값이 false가 되어 기존 타이머가 취소되고 다시 나머지 공을 그리는 타이머가 돌아가는 것 같습니다.

0

TaeHyeon Kim

감사합니다 :)

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

0

235

2

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

0

95

2

렌더링 테스트 코드 (Hooks)

0

93

1

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

0

164

1

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

1

204

1

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

0

105

1

useMemo와 useCallback 사용 시기

0

217

2

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

0

233

1

action.type 불러오는 방식

0

225

2

onClickRedo 질문

0

176

1

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

0

258

1

npx webpack 실행시

0

323

1

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

0

241

1

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

0

318

1

react devtool이 enable 않됩니다.

0

544

2

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

0

421

2

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

0

337

1

npm run dev 할 때 에러발생

0

494

2

memo, PureComponenet, shouldComponentUpdate 관련 질문

0

210

1

devMiddleware의 필요성

0

357

1

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

0

946

2

path.join관련질문

0

287

2

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

0

384

1

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

1

502

4