Custom Hooks

๊น€๋‚จ๊ฒฝยท2023๋…„ 1์›” 25์ผ

react

๋ชฉ๋ก ๋ณด๊ธฐ
29/37

์žฅ์ 

๐Ÿ’ก ์ƒํƒœ๊ด€๋ฆฌ ๋กœ์ง์˜ ์žฌํ™œ์šฉ ๊ฐ€๋Šฅ
๐Ÿ’ก ํ•จ์ˆ˜ํ˜•์œผ๋กœ ์ž‘์„ฑํ•˜๋ฏ€๋กœ ๋น„๊ต์  ๋ช…๋ฃŒ

์ด์ „

//FriendStatus.js
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.js
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>
  );
}

์ดํ›„

//hooks.js
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;
}

โœ… Custom Hook์„ ์ •์˜ํ•  ๋•Œ๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„ ์•ž์— use๋ฅผ ๋ถ™์ž„
โœ… ํ”„๋กœ์ ํŠธ ๋‚ด์˜ hooks ๋””๋ ‰ํ† ๋ฆฌ์— Custom Hook์„ ์œ„์น˜
โœ… return ํ•˜๋Š” ๊ฐ’์€ ์กฐ๊ฑด๋ถ€๋Š” ์•ˆ๋จ

//FriendStatus.js
function FriendStatus(props) {
  //custom hook ์ ์šฉ
  const isOnline = useFriendStatus(props.friend.id);

  if (isOnline === null) {
    return 'Loading...';
  }
  return isOnline ? 'Online' : 'Offline';
}
//FriendListItem.js
function FriendListItem(props) {
  //custom hook ์ ์šฉ
  const isOnline = useFriendStatus(props.friend.id);

  return (
    <li style={{ color: isOnline ? 'green' : 'black' }}>
      {props.friend.name}
    </li>
  );
}

์ฐธ๊ณ 

์ฝ”๋“œ์Šคํ…Œ์ด์ธ  ๊ต๊ณผ์„œ
React-์ž์‹ ๋งŒ์˜ Hook ๋งŒ๋“ค๊ธฐ

profile
๊ธฐ๋ณธ์— ์ถฉ์‹คํ•˜๋ฉฐ ์•ž์œผ๋กœ ๋ฐœ์ „ํ•˜๋Š”

0๊ฐœ์˜ ๋Œ“๊ธ€