inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

따라하며 배우는 리액트 A-Z[19버전 반영]

Netflix nav.js useEffect에 관한 질문이 있습니다.

224

sky

작성한 질문수 3

0

안녕하세요.

useEffect에 관한 질문이 있습니다.

import React, { useState, useEffect } from "react";
import "./Nav.css";
const Nav = () => {
    const [show, setShow] = useState(false);

    useEffect(() => {
        window.addEventListener("scroll", () => {
            console.log(window.scrollY);
            if (window.scrollY > 50) {
                setShow(true);
            } else {
                setShow(false);
            }
        });

        return () => {
            window.removeEventListener("scroll", () => {});
        };
    }, []);

    return (
        <nav className={`nav ${show && "nav__black"}`}>
            <img
                alt="Neflix logo"
                src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTs-jOdZ58Y8HbxPbaUxxaUyGMqu3zvtO8frCdL_3MzPE6cOB5ZAV5TqwRIjJ6sdTl-_A&usqp=CAU"
                className="nav__logo"
                onClick={() => window.location.reload()}
            />
            <img
                alt="user logged"
                src="http://zoeice.com/assets/img/uploads/profile.png"
                className="nav__avatar"
            />
        </nav>
    );
};

export default Nav;

질문 1.

useEffect 내부의 return은 컴포넌트를 사용하지 않을때 실행되는 코드를 넣는것 같은데

이점이 조금 이해하기 어려워서 질문드립니다. useEffect안의 return의 역할이 정확히 무엇인가요?

 

질문 2.

useEffect의 두번째 인자로 빈 배열을 받을 경우, 처음 컴포넌트가 처음 렌더링 될때만

실행된다고 알고 있습니다.

그런데 nav는 스크롤 상태에 따라서 계속 이벤트가 실행되는데 빈 배열을 넣어도 잘 작동이 되고 있습니다.
빈 배열을 넣어도 잘 작동되는 이유가 궁금합니다.

 

답변부탁드리겠습니다.

감사합니다.

typescript react redux tdd Next.js

답변 1

1

John Ahn

안녕하세요!! 

현재 "스크롤"이라는 이벤트가 발생하면 어떠한 함수를 호출할 건지 리스너를 등록해준 것입니다. 

이것을 이벤트 리스너 등록이라고 하는데 이 리스너를 등록했기 때문에 마우스 스크롤을 할 때마다 함수가 호출된 것입니다. 

근데 이 해당 컴포넌트를 사용하지 않는데 이 리스너가 계속 등록되어있으면 안 되겠죠?!! 

그렇기 때문에 이 리스너를 제거해주는 부분입니다. 

결론적으로 첫번째 질문에 답변인 Return 부분은 해당 컴포넌트가 사라질때 호출되는 부분입니다.
그래서 여기서는 컴포넌트를 사용하지 않게 될 때 스크롤에 대한 이벤트가 발생할 때 호출되는 함수를 더 이상 호출되지 않게 해당 이벤트 리스너를 지워주는 부분입니다. 

두번째 질문은 컴포넌트가 생성될 때 리스너는 한번만 등록해주면 됩니다.
리스너라는 것은 listener 라는 말처럼 어떠한 이벤트가 일어나는 것을 계속 지켜보고 있는 것입니다.
컴포넌트가 생성될 때 한번만 등록을 해주면 됩니다.

감사합니다.

강의 소스 코드 압축 풀기 오류

0

90

1

런타임 에러 ㅠㅠ

0

105

1

강의대로 따라갔는데 에러보다 api키로 들어간 넷플릭스? 그런게 렌더링 되지 않습니다 ㅠ

0

114

1

안녕하세요 개발과 상관없는 질문입니다만

0

123

1

리액트 라우터 관련

0

119

1

react-beatiful-dnd에서 문제가 발생합니다.

0

108

1

react19에서는 react-beautiful-dnd가 설치되지 않습니다.

0

833

1

useEffect로 사용을 해도 되나요?

0

210

1

넷플릭스 오리지널 제외하고 슬라이드가 동작을 안합니다.

0

202

1

react 19의 useActionState가 더이상 isPending은 지원하지 않는 듯합니다

0

287

2

리액트 dockderfile 작성 시 COPY 질문

0

156

1

next.js에서부터는 react query 필요없는지

0

327

1

기능

0

204

1

오류가 안보여요

0

206

1

CSS

0

225

1

local storage

0

223

1

list컴포넌트 생성하기

0

230

1

검색어 입력 후 초기화하는 방법 궁금합니다!

0

343

1

Banner.css에 대해서

0

464

1

플러그인이 추천을 안해줍니다

0

334

1

마이너스버튼 테스트

0

285

2

리액트 서버 실행 오류

0

1169

2

오류메세지는 확인했는데 어떻게 고쳐야 할지 모르겠습니다 ㅠ

0

307

1

creactStore질문이요

1

293

2