useEffect deps부분과 코드가 이것도 맞는건지 궁금합니다.
304
작성한 질문수 8
작성한 코드는 아래와 같습니다.
제로초님과 코드가 다른 부분은
useRef 선언 부분 [] -> null,
useEffect deps , useEffect return부분입니다.
useRef를 배열이 아닌 상태로 사용하여 setTimeout을 설정시 문제되는 점이 있을까요?
useEffect 함수 return 부분에 clearTimeout사용법이 저렇게 사용하는게 맞나요?
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;
답변 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





