inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

웹 게임을 만들며 배우는 React

커스텀 훅으로 우아하게 interval하기

제로초님 안녕하세요!! setInterval clearInterval 실행위치 부탁드립니다.

해결된 질문

702

gxpk0721

작성한 질문수 21

1

제로초님 안녕하세요!! setInterval clearInterval 실행위치 부탁드립니다.

import { useRef, useEffect } from 'react';

function useInterval(callback, delay) {

const savedCallback = useRef();

useEffect(() => {

savedCallback.current = callback;

});

useEffect(() => {

function tick() {

savedCallback.current();

}

if (delay !== null) {

let id = setInterval(tick, delay);

return () => clearInterval(id); 요부분!!

}

}, [delay]);

return savedCallback.current;

}

export default useInterval;



질문1. if문에서 return에 단지 익명함수를 작성하고 그 익명함수의 return으로 clearInterval 을 적어준건데 왜 익명함수가 실행되어 clearInterval이 등록이되는건가요?? if의 함수의 리턴값이 익명함수의 주소아닌가요?

질문2. if에서 reutnrn에 익명함수가 실행되었고 clearinterval이 등록되었다고 치면 왜 delay가 빠꼈을때 실행되는거에요?? ㅠㅠ부탁드립니다. 이해하고싶어요 4시간째 구글링하고 찾아봐도 이해가안되네요..


다른분답변에서 setInterval 500으로 실행되면서 return쪽 clearInterval 코드도 등록됩니다. 이 부분도 왜 등록이 되는건가요?ㅠ

react

답변 1

1

제로초(조현영)

  1. 질문이 이해가 안 되는데요. clearInterval이 등록되었다는 표현이 무슨 뜻인가요?? clearInterval은 실행되는 겁니다. 기존 인터벌을 지우는 것이고요. useEffect의 return 부분이 cleanup 함수입니다.

  2. useEffect의 cleanup 함수가 어떤 때 돌아가는지를 생각해보세요. 애초에 useEffect의 원리가 delay가 바뀌면 cleanup 함수가 돌아가는건데 왜 돌아가냐고 물으시면 뭐라 설명해야할지...

    https://reactjs.org/docs/hooks-effect.html#effects-with-cleanup

0

gxpk0721


제가 지금까지 봐온 useEffect의 clean up 코드는 이런식으로 useEffect 의 return 으로 클린업함수를 가지고 있었는데.

if (delay !== null) {

let id = setInterval(tick, delay);

return () => clearInterval(id); 요부분!!

}

이런식으로 if로 감싸져서 있으니 이건 그냥 if의 리턴값아닌가해서요..ㅠ

근데 또 다른분 답변 보니 이렇다고 하셨는데 setinterval500일때 return뒤의 익명함수가 왜 실행되는거죠...ㅠㅠㅠ그냥 익명함수를 만든거 아닌가요...호출하지는않았잖아요...ㅠ

useEffect가 if안에있어도 return 을 클린함수로 인식하는건가요..? 비슷한상황을 만들어봐서 했는데

동작은 잘 합니다. 의존성배열의 a가 바뀌니까 if안에 있어도 cleanup함수가 실행되더라구요 ㅠ image

1

제로초(조현영)

if의 리턴이라는 건 없습니다. 그것도 useEffect 함수의 return입니다. if문 밖에서는 그냥 return;이 생략된 것이고요.

image 이 이미지를 올려주셨는데 여기 return에 있는 함수도 imgCoord가 변경될 때 실행됩니다. 누가 호출하지 않았는데 실행되잖아요? 이건 받아들이는데 왜 if문의 return에 있는 함수가 실행되는 건 못 받아들이시는 건가요??

리액트도 자바스크립트입니다. 뭐 특별한 게 아니에요. useEffect 함수의 return에 존재하는 모든 함수는 클린업(또는 디스트럭터) 함수입니다. deps 배열이 변경될 때 실행되고요. 다시 말씀드리지만 if의 return이라는 건 없습니다. if문 배울 때 return 배우신 적 있나요? return은 함수 배울 때 배운 겁니다.

 

2

gxpk0721

헉....감사합니다.. 렛츠기릿js배울때 강의해주신거 다시 생각해보니if의return은 없었습니다...

그리고 제로초님께 배워서 프로젝트할때도 이런코드도 자주 사용했었거든요...imageimage그냥 useEffect에 꽂쳐서 편협한 생각을했습니다. 망치로 쎄게 한 대 맞은거같네요.. 이제서야 이해가 됩니다. 정말 거듭 감사합니다.

두번 세번 정리하고 메모해두겠습니다. if의 return은 없다. 정말 감사합니다. 좋은하루보내세요!!ㅠ

1

제로초(조현영)

return () => clearInterval(id); 이 부분을 if문 바깥으로 빼면 id때문에 에러가 나는 것도 보실 수 있습니다.

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

0

237

2

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

0

98

2

렌더링 테스트 코드 (Hooks)

0

93

1

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

0

165

1

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

1

207

1

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

0

106

1

useMemo와 useCallback 사용 시기

0

220

2

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

0

237

1

action.type 불러오는 방식

0

226

2

onClickRedo 질문

0

176

1

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

0

261

1

npx webpack 실행시

0

324

1

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

0

243

1

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

0

319

1

react devtool이 enable 않됩니다.

0

546

2

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

0

422

2

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

0

338

1

npm run dev 할 때 에러발생

0

496

2

memo, PureComponenet, shouldComponentUpdate 관련 질문

0

211

1

devMiddleware의 필요성

0

358

1

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

0

946

2

path.join관련질문

0

287

2

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

0

384

1

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

1

503

4