
๊ฐ๋ฐ์๊ฐ ์ค์ค๋ก ์ปค์คํ ํ Hook์ ์๋ฏธํ๋ฉฐ ์ด๊ฒ์ ์ด์ฉํด ๋ฐ๋ณต๋๋ ๋ก์ง์ ํจ์๋ก ๋ฝ์๋ด ์ฌ์ฌ์ฉํ ์ ์๋ค.
useSomething)//FriendStatus : ์น๊ตฌ๊ฐ online์ธ์ง offline์ธ์ง returnํ๋ ์ปดํฌ๋ํธ
function FriendStatus(props) {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});
if (isOnline === null) {
return 'Loading...';
}
return isOnline ? 'Online' : 'Offline';
}
//FriendListItem : ์น๊ตฌ๊ฐ online์ผ ๋ ์ด๋ก์์ผ๋ก ํ์ํ๋ ์ปดํฌ๋ํธ
function FriendListItem(props) {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});
return (
<li style={{ color: isOnline ? 'green' : 'black' }}>
{props.friend.name}
</li>
);
}
FriendStatus ์ปดํฌ๋ํธ๋ ์ฌ์ฉ๋ค์ ์จ/์คํ๋ผ์ธ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ , FriendListItem ์ปดํฌ๋ํธ๋ ์ฌ์ฉ์๋ค์ ์ํ์ ๋ฐ๋ผ ์จ๋ผ์ธ์ด๋ผ๋ฉด ์ด๋ก์, ์คํ๋ผ์ธ์ด๋ผ๋ฉด ๊ฒ์์์ผ๋ก ํ์ํ๋ ์ปดํฌ๋ํธ์ด๋ค. ๋ ์ปดํฌ๋ํธ๋ ์ ํํ๊ฒ ๋์ผํ๊ฒ ์ฌ์ฉ๋ ๋ก์ง์ด ์๋๋ฐ, Custom Hook์ ์ฌ์ฉํ๋ฉด ์ด ๋ก์ง์ ๋นผ์ ๋ ์ปดํฌ๋ํธ์ ๊ณต์ ํ ์ ์๋ค.
function useFriendStatus(friendID) {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(friendID, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(friendID, handleStatusChange);
};
});
return isOnline;
}
๋ ์ปดํฌ๋ํธ์์ ๋์ผํ๊ฒ ์ฌ์ฉ๋๋ ๋ก์ง์ ๋ถ๋ฆฌํด ํจ์ useFriendStatus๋ก ๋ง๋ ๋ค.
Custom Hook์ ๋ง๋ค ๋ ๊ท์น์ด ํ์ํ๋ค.
use๋ฅผ ์ฌ์ฉreturn ๊ฐ์ด ์กฐ๊ฑด๋ถ๊ฐ ์๋์ด์ผ ํจ)function FriendStatus(props) {
const isOnline = useFriendStatus(props.friend.id);
if (isOnline === null) {
return 'Loading...';
}
return isOnline ? 'Online' : 'Offline';
}
function FriendListItem(props) {
const isOnline = useFriendStatus(props.friend.id);
return (
<li style={{ color: isOnline ? 'green' : 'black' }}>
{props.friend.name}
</li>
);
}