클래스 컴포넌트에서는 componentDidMount()
, componentDidUpdate()
, componentDidUnmount()
메서드를 이용해 life cycle을 조절했다.
함수 컴포넌트에서는 클래스 컴포넌트처럼 나누어 사용하지 않고 useEffect라는 하나의 hook을 이용해 조절한다.
import {useEffect} from 'react';
// useEffect 가져오기(import)
useEffect(()=>{
// 실행할 내용 입력
return ()=>{
// 위해서 실행한 내용이 끝나고 진행될 내용 입력
}
})
useEffect를 선언하고 mount 된 다음 실행할 코드를 return
위에
unmount 되고 실행할 코드를 return
아래에 작성한다(cleanup function).
다음은 useEffect를 사용했을 때 실행되는 시기를 확인해보기 위한 코드이다.
import { useState, useRef, useEffect } from "react";
import { useRouter } from "next/router";
export default function CounterPage() {
const router = useRouter();
const inputRef = useRef<HTMLInputElement>(null);
const [count, setCount] = useState(0);
// 1.DidMount, WillUnmount 합쳐서
useEffect(() => {
console.log("mounted");
inputRef.current?.focus();
return () => {
console.log("unmounted");
};
}, []);
// 2.didUpdate
useEffect(() => {
console.log("updated and rerendered");
});
// 3. WillUnmount
useEffect(() => {
return () => {
console.log("unmounted");
};
}, []);
const onClickCounter = () => {
setCount((prev) => prev + 1);
};
const onClickMove = () => {
router.push("/");
};
console.log("실행순서 확인");
// useEffect가 랜더링 된 다음 실행되는 것을 알 수 있다
return (
<div>
<input type="text" ref={inputRef} />
<div>count : {count}</div>
<button onClick={onClickCounter}>count up</button>
<button onClick={onClickMove}>exit</button>
</div>
);
}
직접 실행해보면 다음과 같은 내용을 확인할 수 있다.
input
에 잘 focus
되어 있는 것이 보인다.그런데 나올 것이라고 생각했던 mounted 말고도 updated and rerendered라는 console이 같이 찍혀있는 것이 보인다.
이는 클래스 컴포넌트의 didUpdate와 다르게 useEffect는 처음 랜더할때도 한 번 실행되기 때문이다.
count up 버튼을 눌러 update되었을 때 count 수치가 올라간 것이 보인다. 클래스의 didUpdate와 비슷한 기능이다.
같은 것이 아니라 비슷하다고 한 이유는 1에서 언급했듯이 페이지가 처음 랜더될 때도 실행되기 때문이다.
exit 버튼을 눌러 이 페이지에서 나가면서 벌어진 상황이다. 클래스의 WillUnmount와 같은 기능이다.
채팅방과 같은 페이지를 종료하거나 api요청을 할 때 사용한다.
위에 있는 코드와 스크린샷을 잘 보면 mounted는 한번만 콘솔에 찍히고 updated and rerendered는 여러번 찍히는 것이 보인다.
그 이유는 코드의 useEffect 뒤쪽에 []
의 유무 때문이다.
[]
안에는 useEffect가 다시 실행되는 조건을 입력하는데 updated and rerendered는 아예 입력을 하지 않아 update가 발생할 때 마다 실행된 것이고 mounted는 조건에 아무것도 적지 않아 처음 한 번만 실행된 것이다.(다시 실행하게 만드는 조건이 없다.)