- 컴포넌트의 LifeCycle (함수형 컴포넌트)
- useEffect
- useEffect -> mount (1)
- useEffect -> mount (2)
- useEffect -> update
- useEffect -> unmount
React에서 컴포넌트의 LifeCycle은 크게 3가지로 구분
Mount -> Unmount 중 특정 주기에 해당될 경우 실행되는 함수
import { useEffect } from 'React'
useEffect(() => {
console.log("안녕");
});
app.tsx
import { useEffect, useState } from "react";
function App() {
const [count, setCount] = useState(0);
useEffect(() => {
console.log("안녕");
})
const handleTriggerAction = () => {
setCount(count + 1)
};
return (
<>
{count}
<button onClick={handleTriggerAction}>click</button>
</>
);
}
export default App;
dependency Array를 넣지 않았기 때문
에 브라우저에 컴포넌트가 mount시 "안녕"이 console에 출력
컴포넌트를 재 렌더링
시키기 때문에 렌더링 마다 useEffect가 실행되어 console에 출력
될 것클릭 이벤트마다 컴포넌트가 재 렌더링이 발생
하여 useEffect 함수가 실행되었고 콘솔에 2번 출력
된 것 useEffect(() => {
console.log("안녕");
},[])
마운트 된 후 최초 1번만 실행
최초 마운트시에 useEffect에 의해 "안녕"이 출력
되었다.useEffect 함수가 실행되지 않은 것을 확인
dependency array에 특정 state를 추가
할 경우 state value가 변할 때 마다 useEffect 함수가 실행
import React, { useEffect, useState } from "react";
function App() {
const [count, setCount] = useState(0);
const [inputValue, setInputValue] = useState('');
useEffect(() => {
console.log("카운트 update 되는 중");
},[count]);
useEffect(() => {
console.log("input에 update 되는 중");
},[inputValue]);
const handleTriggerAction = () => {
setCount(count + 1);
};
const handleInputAction = (e:React.ChangeEvent<HTMLInputElement>) => {
setInputValue(e.currentTarget.value);
}
return (
<>
<span>count : {count}</span>
<button onClick={handleTriggerAction}>click</button>
<span>inputValue : {inputValue}</span>
<input type="text" value={inputValue} onChange={handleInputAction}/>
</>
);
}
export default App;
mount
될 경우 두 useEffect 함수가 실행되어 console에 출력
console에 "카운트 update 되는 중" 만 출력
console에 "input에 update 되는 중" 이 출력
첫 번째 useEffect 함수만 실행
되어 console에 "카운트 update 되는 중"이 출력
console에 두 번째 useEffect 함수만 실행
되어 console에 출력 useEffect(() => {
return () => {
console.log("unMount 됬어용")
}
});
return + 콜백함수
를 추가하면 브라우저에 해당 컴포넌트가 unMount될 경우 clean up function 실행
useEffect가 먼저 실행 되기 전에 실행되는 함수
이기도 함Timer.tsx
import { useEffect } from "react"
const Timer = () => {
useEffect(() => {
const timer = setInterval(() => {
console.log("타이머 돌아가는 중..");
}, 1000);
return () => {
clearInterval(timer);
}
},[]);
return (
<div>타이머 돌아가는 중</div>
)
}
export default Timer;
app.tsx
import { useState } from "react";
import Timer from "./component/Timer";
function App() {
const [timerState, setTimerState] = useState(false);
const handleTimerAction = () => {
setTimerState(!timerState);
}
return (
<>
{timerState && <Timer/>}
<button onClick={handleTimerAction}>timer trigger</button>
</>
);
}
export default App;
별코딩님 - React Hooks에 취한다 - useEffect 깔끔하게 마스터하기