- 인자나 외부의 변수를 변경하지 않는 함수를 pure function이라고 한다.
- 이 pure function, 순수 함수는 만약 같은 인자를 전달 받는다면, 항상 똑같은 결과 값을 return한다.
- 따라서 pure function은 예측 가능한 함수이다.
- 하지만, 어떤 함수는 실행시 함수 외부의 환경에 영향을 줄 수 있다.
// 예시 // let counter = 0; function count(){ counter += Math.floor(Math.random() * 100); } count(); console.log(counter);
- 위와 같은 함수는 외부의 counter 함수를 변경하며, 그 값을 예측 불가능하게 한다.
- 위와 같이 함수가 외부에 영향을 미치면 이를 side effect 라고 한다.
보통 React에서 side effect는 Ajax 요청이나 LocalStorage API를 사용하는 등 외부에서 데이터를 가져올 때와, react와 관계없는 API (setTimeout과 같은 타이머, LocalStorage 등) 을 사용할 때 이들이 react 컴포넌트에게는 side effect이다.
- React는 side effect를 다루기 위해서 effect Hook을 제공하고 이것이 useEffect이다.
- 클래스형 컴포넌트에서는 side effect를 처리하기 위해서 life cycle 매서드인 componentDidMount나 componentDidUpdate, componentWillUnmount와 같은 매서드를 사용했었다.
(함수형 컴포넌트에서는 useEffect를 통해서 같은 기능을 구현할 수 있다.)
useEffect는 첫 번째 인자로 함수를 받고, 두 번째 인자로 배열을 받는다.
useEffect는 컴포넌트가 생성되었을 때, 새로운 props를 받았을 때, state가 변경되었을 때 실행되며, 첫번째 인자인 콜백함수를 실행한다.
(즉, 새롭게 컴포넌트가 렌더링 되었을 때 실행된다.)
만약 조건부로 useEffect를 실행하고자 한다면, 두번에 인자로 배열을 넣는다.
이 배열의 이름은 dependency array라고 부르며, 이 배열 내부의 담긴 변수의 값이 변경될 때 useEffect가 실행되어 첫 번째 인자인 함수가 실행된다.
😺 두 번째 인자로 빈 배열을 넣는다면, 처음 컴포넌트가 생성되었을 때 단 한번만 useEffect가 실행된다.
let [name, setName] = useState("");
// ~ setName을 활용해 name을 변경 ~
useEffect(() => {
document.title = name;
}, [name]);
// name 변수가 수정될 때 마다 실행되어 html의 title을 변경한다.