이 부분은 커스텀 훅(Custom Hook)을 만드는 방법을 설명한다.
커스텀 훅은 React에서 자주 사용되는 반복적인 로직을 재사용하기 위해 만들어지는 사용자 정의 함수이다.
예제로는 사용자 온라인/오프라인 상태를 확인하는 컴포넌트를 만들고 있다.
UserStatus라는 컴포넌트와 UserListItem이라는 컴포넌트가 같은 로직을 공유하고 있어서 이를 중복 제거하기 위해 커스텀 훅을 추출한다.
function UserStatus(props) {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ServerAPI.subscribeUserStatus(props.user.id, handleStatusChange);
return () => {
ServerAPI.unsubscribeUserStatus(props.user.id, handleStatusChange);
};
});
return isOnline ? "온라인" : "오프라인";
이 코드는 사용자의 온라인 상태를 구독(subscribe)하고, 변경될 때마다 상태를 업데이트한다. 만약 비슷한 로직을 가진 또 다른 컴포넌트(UserListItem)를 만든다면 중복 코드가 많아진다.
function useUserStatus(userId) {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ServerAPI.subscribeUserStatus(userId, handleStatusChange);
return () => {
ServerAPI.unsubscribeUserStatus(userId, handleStatusChange);
};
}, [userId]);
return isOnline;
설명:
하나씩 쪼개서 설명
코드 쪼개보기
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ServerAPI.subscribeUserStatus(userId, handleStatusChange);
return () => {
ServerAPI.unsubscribeUserStatus(userId, handleStatusChange);
};
}, [userId]);
return isOnline;
이 커스텀 훅은 "현재 사용자(userId)의 온라인 상태"를 반환한다.
이제 useUserStatus 훅을 사용하면 로직을 재사용할 수 있다.
function UserStatus(props) {
const isOnline = useUserStatus(props.user.id);
return <div>{isOnline ? "온라인" : "오프라인"}</div>;
}
function UserListItem(props) {
const isOnline = useUserStatus(props.user.id);
return (
<li style={{ color: isOnline ? "green" : "black" }}>
{props.user.name}
</li>
);
}
변화된 점:
1. useUserStatus 훅을 추출해서 isOnline 값을 가져온다.
2. 두 컴포넌트 모두 중복 코드 없이 useUserStatus를 호출하기만 하면 된다.
3. 스타일이나 상태를 다르게 렌더링하는 로직은 각각의 컴포넌트에서 따로 처리할 수 있다.
하나씩 쪼개서 설명
function UserStatus(props) {
const isOnline = useUserStatus(props.user.id);
return <div>{isOnline ? "온라인" : "오프라인"}</div>;
}