작성
·
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
안녕하세요!!
현재 "스크롤"이라는 이벤트가 발생하면 어떠한 함수를 호출할 건지 리스너를 등록해준 것입니다.
이것을 이벤트 리스너 등록이라고 하는데 이 리스너를 등록했기 때문에 마우스 스크롤을 할 때마다 함수가 호출된 것입니다.
근데 이 해당 컴포넌트를 사용하지 않는데 이 리스너가 계속 등록되어있으면 안 되겠죠?!!
그렇기 때문에 이 리스너를 제거해주는 부분입니다.
결론적으로 첫번째 질문에 답변인 Return 부분은 해당 컴포넌트가 사라질때 호출되는 부분입니다.
그래서 여기서는 컴포넌트를 사용하지 않게 될 때 스크롤에 대한 이벤트가 발생할 때 호출되는 함수를 더 이상 호출되지 않게 해당 이벤트 리스너를 지워주는 부분입니다.
두번째 질문은 컴포넌트가 생성될 때 리스너는 한번만 등록해주면 됩니다.
리스너라는 것은 listener 라는 말처럼 어떠한 이벤트가 일어나는 것을 계속 지켜보고 있는 것입니다.
컴포넌트가 생성될 때 한번만 등록을 해주면 됩니다.
감사합니다.