예를 들면 서버에서 데이터를 받아오거나 수동으로 DOM을 변경하는 작업들을 말한다.
이러한 작업이 effect라 불리는 이유는 다른 컴포넌트에 영향을 미칠 수 있으며, 렌더링 중에는 작업이 완료될 수 없기 때문이다.
즉 렌더링이 끝난 이후에 실행되어야 하는 작업들이다.
이러한 작업이 side로 실행된다는 의미에서 side effect라 불린다.
// import logo from './logo.svg';
import './App.css';
import { useEffect, useState } from 'react';
function App() {
const [count, setCount] = useState(1)
const [name, setName] = useState('')
const handleCountUpdate = () => {
setCount(count + 1)
}
// 인자로 이벤트 받아옴
const handleInputChange = (e) => {
setName(e.target.value)
}
// useEffect는 인자로 콜백함수를 전달받는다.
// 렌더링 될때마다 매번 실행된다.
useEffect(() => {
console.log('count 렌더링')
}, [count])
useEffect(() => {
console.log('name 렌더링')
}, [name])
return (
<div className="App">
<button onClick={handleCountUpdate}>update</button>
<span> count: {count}</span>
<input type="text" value={name} onChange={handleInputChange} />
<span>name: {name}</span>
</div>
);
}
export default App;
//1. useEffect실행 count값이 변화될 때만 렌더링이 실행된다.
useEffect(() => {
console.log('count 렌더링')
}, [count])
// 2. useEffect실행 name값이 변화됐을 때 실행된다.
useEffect(() => {
console.log('name 렌더링')
}, [name])
useEffect(이펙트 함수, 의존성 배열)
useEffect() 함수만으로 생명주기함수와 동일한 기능을 수행할 수 있다.
의존성 배열은 말 그대로 Effect 의존하고 있는 배열이다.
배열안에 있는 변수중에 하나라도 값이 변경되면 이펙트 함수가 실행된다.
기본적으로 이펙트 함수는 처음 컴포넌트가 렌더링된 이후와 업데이트 된 re-render 이후에 실행된다.
//맨 처음 렌더링 될때만 실행
useEffect(() => {
console.log('렌더링')
}, [])
useEffect(이펙트 함수, [])
useEffect(이펙트 함수)
//App.js
import './App.css';
import { useState } from 'react';
import Timer from './Component/Timer';
function App() {
const [showTimer, setShowTimer] = useState(false)
return (
<div>
// showTimer가 true일때만 timer실행
{showTimer && <Timer />}
<button onClick={() => setShowTimer(!showTimer)}>Toggle Timer</button>
</div>
);
}
export default App;
<Timer /> -> {showTimer && <Timer />}
//Timer.jsimport React, { useEffect } from 'react'
export default function Timer(props) {
// 타이머가 맨처음 렌더링 됐을 때
//useEffect안에있는 콜백함수가 실행된다.
//setInterval의 인자로 들어가있는 것을 1초마다 계속해서 실행해줌
useEffect(() => {
const timer = setInterval(() => {
console.log('timer 돌아가는중')
}, 1000)
return () => {
clearInterval(timer)
console.log('타이머가 종료되었습니다.')
}
}, []) //화면 첫렌더링에만 실행이기에 빈배열
return (
<div>
<span>타이머를 시작합니다.
콘솔을 보세요
</span>
</div>
)
}
1) Timer컴포넌트 실행
2) Timer컴포넌트 종료