인프런 커뮤니티 질문&답변

i1004gy님의 프로필 이미지
i1004gy

작성한 질문수

웹 게임을 만들며 배우는 React

5-5. Hooks와 useEffect

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

해결된 질문

작성

·

368

1

import React, { useState, useEffect } from "react";

const CountdownTimer = () => {
  const [countdown, setCountdown] = useState(10); // 초기 카운트다운 값

  useEffect(() => {
    let intervalId;
    console.log("다시 실행");
    // 카운트다운이 실행 중일 때만 setInterval을 설정

    intervalId = setInterval(() => {
      setCountdown((prevCountdown) => prevCountdown - 1);
    }, 1000);

    // 컴포넌트가 언마운트될 때 clearInterval 호출
    return () => {
      console.log("종료");
      clearInterval(intervalId);
    };
  }, []); // isRunning 상태가 변경될 때마다 useEffect가 호출됨



  return (
    <div>
      <p>Countdown: {countdown}</p>

    </div>
  );
};

export default CountdownTimer;

이런 예제를 돌리고 있는데 useEffect에 인자를 설정하지 않아도 제대로 돌아가고 있습니다 제가 next.js를 이용해서 실습중인데 이게 nextjs여서 돌아가는건가요 아니면 react가 업데이트를 한 것인가요?

답변 4

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

지금 코드에서 셋인터벌은 당연히 잘 작동하죠. setState도 함수형 setState이고요. 제 강의랑 전혀 다른 예제입니다.

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

useEffect 안에 countdown을 안 쓰니까 제대로 돌아가는 겁니다.

i1004gy님의 프로필 이미지
i1004gy
질문자

잘 이해가 안돼서 그러는데 궁금한점이 3가지 입니다

  1. "useEffect안에 countdown을 안 쓰니까 제대로 돌아간다"에 대해서 조금더 자세히 설명해 주실수 있나요?

  2. setState이 함수형 이라는 것이 제가

    setCountdown((prevCountdown) => prevCountdown - 1); 

    이렇게 쓴것을 말하는 건가요?

  3. 그렇다면

setInterval(setCountdown((prevCountdown) => prevCountdown - 1), 1000);
setInterval(() => { setCountdown((prevCountdown) => prevCountdown - 1); }, 1000);

이 두 코드의 차이점이 어떻게 되나요?

 

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

  1. useEffect에 deps가 없으므로 한 번만 실행되고 setInterval도 한 번만 실행됩니다.

  2. 네 맞습니다.

  3. 음... 이건 자바스크립트 완전 기초인데요. 함수의 선언과 함수의 호출은 다르다는 제 인간js엔진되기 유튜브 영상 보시길 바랍니다. 첫 번째 코드는 말도 안 되는 코드입니다. onClick={func} 대신 onClick={func()} 같은 코드입니다.

i1004gy님의 프로필 이미지
i1004gy
질문자

음 제가 마운트와 언마운트를 잘 이해를 못한거 같네요 제로초님 예제에서

setImgCoord(rspCoords.가위)

이렇게 되어있으면 ImgCoord의 사진을 변경을 하면서 원래 있었던 사진 언마운트 되고 다시 새로운 사진으로 마운트가 되는데

setInterval(setCountdown((prevCountdown) => prevCountdown - 1), 1000);

이렇게 함수형으로 작성을 하면 원래있던 컴포넌트가 함수형으로 숫자만 줄게 되면서 마운트되었다 언마운트가 되었다가 안되는건가요?

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

지금 setInterval(함수()) 자체가 말이 안 된다니깐요? setInterval(함수)여야 합니다.

그... 혹시 setInterval(함수()) 이런 코드를 보신 적이 있으신가요?

 함수형으로 작성하면 언마운트/마운트는 됩니다. 다만 useEffect 빈 deps 자체가 실행되지 않습니다.

i1004gy님의 프로필 이미지
i1004gy
질문자

잘 이해가 안가는데

 intervalId = setInterval(() => { setCountdown((prevCountdown) => prevCountdown - 1); }, 1000);

이런식으로 setInterval를 쓰는게 완전 잘못된 코드라는 건가요?

https://velog.io/@yhko1992/react%EC%97%90%EC%84%9C-%EC%B9%B4%EC%9A%B4%ED%8A%B8%EB%8B%A4%EC%9A%B4%EC%9D%84-%ED%95%B4%EB%B3%BC%EA%B9%8C%EB%82%98

여기 블로그를 참고해서 만들었는데

왜 잘못된코드인가요?

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

갑자기 코드를 바꾸셨는데요. 위에서는 이렇게 하셨잖아요. 이 코드가 말이 안 된다는 겁니다.

setInterval(setCountdown((prevCountdown) => prevCountdown - 1), 1000);

다음 코드는 말이 되는 코드이고요.

setInterval(() => { setCountdown((prevCountdown) => prevCountdown - 1); }, 1000);
제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

https://youtu.be/NS1cIsWlFGI?si=hPrb2Qsv_cYiSBHg

function func() {} 가 있을 때

setTimeout(func)는 말이 되지만

setTimeout(func())는 말이 안 되는 코드인 겁니다.

setInterval도 마찬가지이고요.

0

빈배열을 넣을 경우 컴포넌트가 마운트, 언마운트될 때 한 번씩 실행됩니다.

i1004gy님의 프로필 이미지
i1004gy
질문자

그렇게 한번만 일어나야 하는데 setInterval로 계속 숫자가 카운트 됩니다

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

isRunning 상태가 뭔가요?

i1004gy님의 프로필 이미지
i1004gy
질문자

아 isRunning은 원래 있었던 코드인데 지웠습니다 chatgpt를 이용해서 코드를 작성했는데 제가 주석까지는 지우지 않았네요

0

useEffect 에 인자를 설정하지 않았다는게 useEffec(() => {}, [deps]) 에서의 deps를 말하시는 건가요?

원래 [] 는 컴포넌트가 마운트되면 1번 실행됩니다.

next와는 관련없습니다.

i1004gy님의 프로필 이미지
i1004gy
질문자

강의 영상에서는 [deps]에서 deps를 설정하지 않으면 업데이트가 한번만 일어난다고 되어있는데 저렇게 deps를 설정하지 않아도 setInterval이 정상적으로 작동합니다

i1004gy님의 프로필 이미지
i1004gy

작성한 질문수

질문하기