useEffect - 훅을 활용해 Side Effect(부수효과)를 일으킬 수 있다.
대표적으로 Data Fetching(서버에서 원하는 데이터를 받아오는 행위), DOM에 직접 접근(ex. Event Listener 등록), 구독(ex. setInterval)과 같은 행위들이 있습니다. 이들은 모두 컴포넌트에서 꼭 필요한 대표적인 Side Effect 이다.
함수 컴포넌트의 리턴값이 ui 요소이고, state,props의 변화가 있을때마다 함수가 실행된다.
이 말은 매 렌더링 때마다 함수 body에 있는 로직이 실행된다는 뜻이다.
useEffect(() => {})
useEffect(() => {},[의존성배열 -> 배열안에있는 값이 바뀔때마다
내부에있는 sideEffect를 실행하겠다.])
useEffect(() => { console.log ('first effect');
},[]) -> 한번만 실행시켜야할때는 배열 내부를 빈배열로
useEffect(() => {
fetch("api 주소");
}, []);
- 데이터를 불러올때 사용하는 형식
- fetch (내장함수)
또한 렌더링과 무관한 로직이 렌더링 과정에서 실행되기 때문에 렌더링 자체에 영향을 줘 성능상 악 영향을 끼칠 수 있다.
function greetWithSideEffect({ name }) { //
// Bad!
document.title = `${name}님 안녕하세요!`; // Side Effect
return <div>{`${name}님 안녕하세요!`}</div>; // Output
}
그래서 React에서는 이런 Side Effect를 일으키기 적절한 장소로서 useEffect hook을 제공한다.
import { useEffect } from "react"
// 사용법
useEffect( 실행시킬 동작, [ 타이밍 ] )
document.addEventListener("타이밍", 실행시킬 동작) // 추상화 한 예시
// 매 렌더링마다 Side Effect가 실행되어야 하는 경우
useEffect(() => {
// Side Effect
})
// Side Effect가 첫 번째 렌더링 이후 한번 실행 되고,
// 이후 특정 값의 업데이트를 감지했을 때마다 실행되어야 하는 경우
useEffect(() => {
// Side Effect
}, [value])
// Side Effect가 첫 번째 렌더링 이후 한번 실행 되고,
// 이후 어떤 값의 업데이트도 감지하지 않도록 해야 하는 경우
useEffect(() => {
// Side Effect
}, [])