Custom Hooks

1. Custom Hooksμ΄λž€?

  • κ°œλ°œμžκ°€ 슀슀둜 μ»€μŠ€ν…€ν•œ 훅을 의미

  • 이λ₯Ό μ΄μš©ν•΄ λ°˜λ³΅λ˜λŠ” λ‘œμ§μ„ ν•¨μˆ˜λ‘œ 뽑아내어 μž¬μ‚¬μš© κ°€λŠ₯

(1) Custom Hooks을 μ‚¬μš©ν•˜λŠ” 경우

  • μ—¬λŸ¬ url을 fetchν•  λ•Œ,

  • μ—¬λŸ¬ input에 μ˜ν•œ μƒνƒœ λ³€κ²½ λ“± λ°˜λ³΅λ˜λŠ” λ‘œμ§μ„ λ™μΌν•œ ν•¨μˆ˜μ—μ„œ μž‘λ™ν•˜κ²Œ ν•˜κ³  싢을 λ•Œ.

(2) Custom Hooks의 μž₯점

  • μƒνƒœκ΄€λ¦¬ 둜직의 μž¬ν™œμš©μ΄ κ°€λŠ₯

  • 클래슀 μ»΄ν¬λ„ŒνŠΈλ³΄λ‹€ 적은 μ–‘μ˜ μ½”λ“œλ‘œ λ™μΌν•œ λ‘œμ§μ„ κ΅¬ν˜„ν•  수 있으며

  • ν•¨μˆ˜ν˜•μœΌλ‘œ μž‘μ„±ν•˜κΈ° λ•Œλ¬Έμ— 보닀 λͺ…λ£Œν•˜λ‹€λŠ” μž₯점이 있음 (e.g. useSomething)

2. Custom Hooks μ‚¬μš© μ˜ˆμ‹œ

  • 예λ₯Ό λ“€μ–΄, μ•„λž˜μ™€ 같은 μ»΄ν¬λ„ŒνŠΈκ°€ μžˆλ‹€λ©΄,

      // 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>
      );
      }
  • 두 μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ λ™μΌν•˜κ²Œ μ‚¬μš©λ˜κ³  μžˆλŠ” λ‘œμ§μ„ λΆ„λ¦¬ν•˜μ—¬ ν•¨μˆ˜ useFriendStatus μ‚¬μš© β†’ Custom Hook을 μ •μ˜ν•  λ•ŒλŠ” μ•„λž˜μ™€ 같은 κ·œμΉ™μ΄ ν•„μš”

    • (1) Custom Hook을 μ •μ˜ν•  λ•ŒλŠ” ν•¨μˆ˜ 이름 μ•žμ— useλ₯Ό 뢙이기

    • (2) λŒ€κ°œμ˜ 경우 ν”„λ‘œμ νŠΈ λ‚΄μ˜ hooks 디렉토리에 Custom Hook을 μœ„μΉ˜μ‹œν‚€κΈ°

    • (3) Custom Hook으둜 λ§Œλ“€ λ•Œ ν•¨μˆ˜λŠ” 쑰건뢀 ν•¨μˆ˜κ°€ μ•„λ‹ˆμ–΄μ•Ό 함. 즉 return ν•˜λŠ” 값은 μ‘°κ±΄λΆ€μ—¬μ„œλŠ” μ•ˆ 됨. λ•Œλ¬Έμ— μœ„μ˜ 이 useFriendStatus Hook은 온라인 μƒνƒœμ˜ μ—¬λΆ€λ₯Ό boolean νƒ€μž…μœΌλ‘œ λ°˜ν™˜ν•˜κ³  있음.

  • μ΄λ ‡κ²Œ λ§Œλ“€μ–΄μ§„ Custom Hook은 Hook 내뢀에 useState와 같은 React λ‚΄μž₯ Hook을 μ‚¬μš©ν•˜μ—¬ μž‘μ„± κ°€λŠ₯

  • 일반 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλŠ” React λ‚΄μž₯ Hook을 뢈러 μ‚¬μš©ν•  수 μ—†μ§€λ§Œ Custom Hookμ—μ„œλŠ” κ°€λŠ₯함.

  • useFriendStatus Hook을 두 μ»΄ν¬λ„ŒνŠΈμ— μ μš©ν•œ μ½”λ“œ

    function FriendStatus(props) {
        const isOnline = useFriendStatus(props.friend.id); // useFriendStatus Hook 적용
    
        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>
        );
    }
  • λ‘œμ§μ„ 뢄리해 Custom Hook으둜 λ§Œλ“€μ—ˆκΈ° λ•Œλ¬Έμ— 두 μ»΄ν¬λ„ŒνŠΈλŠ” 더 μ§κ΄€μ μœΌλ‘œ 확인이 κ°€λŠ₯해짐.

  • κ·ΈλŸ¬λ‚˜ 같은 Custom Hook을 μ‚¬μš©ν–ˆλ‹€κ³  ν•΄μ„œ 두 개의 μ»΄ν¬λ„ŒνŠΈκ°€ 같은 stateλ₯Ό κ³΅μœ ν•˜λŠ” 것은 μ•„λ‹˜. κ·Έμ € 둜직만 κ³΅μœ ν•  뿐, stateλŠ” μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ λ…λ¦½μ μœΌλ‘œ μ •μ˜λ˜μ–΄ 있음.

Last updated