리액트 컴포넌트는 생명 주기가 있다. 컴포넌트가 실행되거나 업데이트되거나 제거될 때, 특정한 이벤트들이 발생한다.
컴포넌트
가 생성, 업데이트, 소멸되는 사이클.
import React from 'react';
class LifecycleEx extends React.Component {
// 생성자 함수
constructor(props) {
super(props);
this.state = {
cat_name: '나비'
};
console.log('in constructor!');
}
changeCatName = () => {
this.setState({ cat_name: '바둑이' });
console.log('고양이 이름을 바꾼다!');
};
componentDidMount() {
console.log('in componentDidMount!');
}
componentDidUpdate(prevProps, prevState) {
console.log(prevProps, prevState);
console.log('in componentDidUpdate!');
}
componentWillUnmount() {
console.log('in componentWillUnmount!');
}
render() {
console.log('in render!');
return (
<div>
<h1>제 고양이 이름은 {this.state.cat_name}입니다.</h1>
<button onClick={this.changeCatName}>고양이 이름 바꾸기</button>
</div>
);
}
}
export default LifecycleEx;
처음 컴포넌트의 인스턴스가 생성되어 DOM 상에 삽입될 때에 아래 순서대로 호출된다
unmount는 컴포넌트가 화면에서 사라지는 것을 의미한다.
useEffect
가 라이크사이클을 대체한다.데이터에 대해서 라이프사이클
이 진행된다. compoenentDidUpdate
를 제대로 다루지 않는 것이다. useEffect
는 기본적으로 업데이트를 다루기 때문에 업데이트를 위한 특별한 코드가 필요없다.리액트의 class 생명주기 메서드에 친숙하다면,
useEffect
Hook을componentDidMount
와componentDidUpdate
,componentWillUnmount
가 합쳐진 것으로 생각해도 좋습니다
렌더링 이후 수행해야 할 일. 리액트는 우리가 넘긴 함수를 기억했다가(=effect) DOM 업데이트를 수행한 이후에 불러낸다.
함수범위 안에 존재하기 때문에 effect를 통해 state,props에 접근할 수 있다.
기본적으로 첫번재 렌더링과 이후의 모든 업데이트에서 수행된다. 마운팅과 업데이트라는 방식으로 생각하는 대신 effect를 렌더링 이후에 발생하는 것으로 생각하는 것이 더 쉬울 것이다. 리액트는 effect가 수행되는 시점에 이미 DOM이 업데이트되었음을 보장한다.
effect를 위한 clean up 메커니즘이다. 모든 effect는 정리를 위한 함수를 반환할 수 있다. effect가 함수를 반환하면 리액트는 그 함수를 정리가 필요한 때에 실행시킨다.
// 클래스형
componentDidMount() {
ChatAPI.subscribeToFriendStatus(
this.props.friend.id,
this.handleStatusChange
);
}
componentWillUnmount() {
ChatAPI.unsubscribeFromFriendStatus(
this.props.friend.id,
this.handleStatusChange
);
}
// 함수형
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
// effect 이후에 어떻게 정리(clean-up)할 것인지 표시합니다.
return function cleanup() {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});
useEffect(() => {
document.title = `You clicked ${count} times`;
}, [count]); // count가 바뀔 때만 effect를 재실행합니다.
📑 reference