useEffect란?
컴포넌트의 최상위 레벨에서 useEffect를 호출하여 Effect를 선언한다.
`useEffect(setup, dependencies?)`
React로 제어되지 않는 외부 시스템과 동기화를 유지할 수 있다.
- 첫번째 인자: setup함수는 선택적으로 클린업 함수를 반환할 수도 있다. React는 컴포넌트가 DOM에 추가되면 셋업 합수를 실행한다. 다시 렌더링할 때마다 (클린업 함수가 있는 경우) 먼저 이전 값으로 클린업 함수를 실행한 다음, 새 값으로 setup함수를 실행한다. 컴포넌트가 DOM에서 제거되면, React는 마지막으로 클린업 함수를 실행한다.
- 두번째 인자: 옵션, 의존성 배열이 들어간다. 의존성을 전혀 지정하지 않으면 컴포넌트를 다시 렌더링할 때마다 Effect가 다시 실행된다.
- undefined를 반환한다.
setup 코드는
`const $body = document.querySelector("body"); $body.style.overflow = "hidden";`
cleanup 코드는
`return () => ($body.style.overflow = "auto");`
css overflow 속성으로 모달이 나오면 setup코드에서 body가 안움직이도록 하고, 제거되면 cleanup 코드에서 body가 다시 나오도록 했다.
src/components/Modal/index.jsx
import { useEffect } from "react";
import { useRef } from "react";
import styled from "styled-components";
import useOutsideClick from "hooks/useOutSideClick";
import ModalContainer from "./ModalContainer";
function Modal({ onClose, children }) {
const modalRef = useRef(null);
const handleClose = () => {
onClose?.();
};
useEffect(() => {
const $body = document.querySelector("body");
$body.style.overflow = "hidden";
return () => ($body.style.overflow = "auto");
}, []);
return (
<ModalContainer>
...
</ModalContainer>
);
}
export default Modal;