함수 컴포넌트에서 Lifecycle
- useEffect는 함수 컴포넌트에서 라이프사이클로 사용합니다.
- useEffect에 첫번째 인자로 콜백 함수를 넣고 두번째 인자로 배열을 넣는데, 빈 배열을 넣으면 컴포넌트가 최초 렌더링 됐을때 1번만 실행됩니다.
- 배열에 변수명을 넣으면, 변수명에 넣은 값이 업데이트 될 때마다 실행됩니다. 단, 처음 렌더링될때는 자동실행되기 때문에, 처음 렌더링될때 자동실행되지 않기를 원하면 따로 if로 처리 해줘야 합니다.
- 콜백 함수에 return값으로 또 다른 콜백 함수를 넣으면, 컴포넌트가 제거될 때 호출하는 용도로 사용됩니다. (새로 렌더링하기전에 정리하는 용도)
기본 설명
import { useEffect } from 'react'
useEffect(콜백함수, []);
useEffect(콜백함수, [변수명]);
const mounted = useRef(false);
useEffect(() => {
if (!mounted.current) {
mounted.current = true
} else {
}
}, [변수명]);
기본 예시
import React, { useState, useEffect } from 'react';
function FunctionClock(props) {
const [ date, setDate ] = useState(new Date());
function tick() {
setDate(new Date());
};
useEffect(() => {
console.log("componentDidMount");
const timerID = setInterval(tick, 1000);
return () => { console.log("componentWillUnmount"); clearInterval(timerID); };
}, []);
useEffect(() => {
console.log("componentDidUpdate");
console.log(date);
}, [date]);
return (
<div>
<h1>{ date.toLocaleTimeString() }</h1>
</div>
);
}
export default FunctionClock;
나쁜 예시 vs 좋은 예시
useEffect(() => {
fetchIssues();
}, [fetchIssues])
useEffect(fetchIssues, [fetchIssues])
useEffect 의존성 배열
- useEffect는 배열에 useRef를 넣을 경우, 변화를 감지하지 못한다
import { useEffect, useRef, useState } from "react";
function App() {
const count = useRef(0);
const countBtn = () => count.current = count.current + 1;
const [value, setValue] = useState(0);
const valueBtn = () => setValue((prev) => prev + 1);
useEffect(() => {
console.log(count);
}, [count.current]);
useEffect(() => {
console.log(count);
console.log(value);
}, [value === 5]);
return (
<div>
<div>{ count.current }</div>
<button type="button" onClick={countBtn}>Count 버튼</button>
<div>{ value }</div>
<button type="button" onClick={valueBtn}>Value 버튼</button>
</div>
);
}
export default App;