๐Ÿฐย [221128 TIL] ์ปค์Šคํ…€.. ๋„ค?

apeach.jpeg

โœ๏ธย ์˜ค๋Š˜ ๋ฐฐ์šด ๊ฒƒ

Custom Hooks

๊ฐœ๋ฐœ์ž๊ฐ€ ์Šค์Šค๋กœ ์ปค์Šคํ…€ํ•œ Hook์„ ์˜๋ฏธํ•˜๋ฉฐ ์ด๊ฒƒ์„ ์ด์šฉํ•ด ๋ฐ˜๋ณต๋˜๋Š” ๋กœ์ง์„ ํ•จ์ˆ˜๋กœ ๋ฝ‘์•„๋‚ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ์ƒํƒœ๊ด€๋ฆฌ ๋กœ์ง์˜ ์žฌํ™œ์šฉ
  2. ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ณด๋‹ค ์ ์€ ์–‘์˜ ์ฝ”๋“œ๋กœ ๋™์ผํ•œ ๋กœ์ง ๊ตฌํ˜„
  3. ํ•จ์ˆ˜ํ˜•์œผ๋กœ ์ž‘์„ฑํ•˜๋ฏ€๋กœ ๋ช…๋ฃŒํ•จ (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์„ ๋งŒ๋“ค ๋•Œ ๊ทœ์น™์ด ํ•„์š”ํ•˜๋‹ค.

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>
  );
}