goal
- react hook useEffect 에 대해서 알아보자.
class FriendStatus extends React.Component {
constructor(props) {
super(props);
this.state = { isOnline: null };
this.handleStatusChange = this.handleStatusChange.bind(this);
}
componentDidMount() {
ChatAPI.subscribeToFriendStatus(
this.props.friend.id,
this.handleStatusChange
);
}
componentWillUnmount() {
ChatAPI.unsubscribeFromFriendStatus(
this.props.friend.id,
this.handleStatusChange
);
}
handleStatusChange(status) {
this.setState({
isOnline: status.isOnline
});
}
render() {
if (this.state.isOnline === null) {
return 'Loading...';
}
return this.state.isOnline ? 'Online' : 'Offline';
}
}
import React, { useState, useEffect } from 'react';
function FriendStatus(props) {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
// effect 이후에 어떻게 정리(clean-up)할 것인지 표시합니다.
return function cleanup() {
// 지속적으로 작동하는 함수가 있다면,
// useEffect() 내부에서,
// cleanup() 함수로 정지시킬 수가 있다.
// componentWillUnmount() 와 비슷한 동작을 기능을 수행한다.
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});
if (isOnline === null) {
return 'Loading...';
}
return isOnline ? 'Online' : 'Offline';
}
effect에서 함수를 반환하는 이유는?
리액트가 effect를 clean-up 하는 시점은 정확히 언제일까?
function Foo () {
const [count, setCount] = useState(0)
useEffect( () => {
document.title = `${count} times`
}, [count] )
// count가 변경될 때에만 필요하면 매번 갱신할 때마다 새로 생성할 필요는 없다.
// 이러한 기능을 수행하기 위해, useEffect에 "두번째 인자"를 전달한다.
// 이 두번째 인자는 effect가 종속되어 있는 값의 "배열" 이다.
// 위의 코드는 "count가 변경될 때"만 title을 바꾸는 작업을 한다.
// 만일, 두번째 인자로 빈 배열을 넣으면, (componentDidMount처럼) mount되는 시점에 1회만 작동한다.
}
useEffect
는 컴포넌트의 렌더링 이후에 다양한 Side effect를 표현할 수 있다.
react clean-up에 대해 궁금함이 있었는데 마침 딱 찾던 정보입니다! 잘 읽고 갑니다.!
적어주신 내용 참고해서 저도 포스팅에 사용해도 될까요?