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

sky님의 프로필 이미지
sky

작성한 질문수

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

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

작성

·

188

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는 스크롤 상태에 따라서 계속 이벤트가 실행되는데 빈 배열을 넣어도 잘 작동이 되고 있습니다.
빈 배열을 넣어도 잘 작동되는 이유가 궁금합니다.

 

답변부탁드리겠습니다.

감사합니다.

답변 1

1

John Ahn님의 프로필 이미지
John Ahn
지식공유자

안녕하세요!! 

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

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

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

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

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

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

감사합니다.

sky님의 프로필 이미지
sky

작성한 질문수

질문하기