-
TIL_200906(React Hook 공식문서)Today I Learned 2020. 9. 6. 23:57
자신만의 Hook 만들기
여러 컴포넌트에 특정한 로직을 공유하길 원할때가 있습니다. 이때 두가지의 공유하는 방법이 있습니다.
1. render props
2. higher-order components
커스텀 Hook을 추출하기
커스텀 Hook은 "use"로 시작하는 Javascript 함수이고, 다른 Hook을 부를 수 있습니다.
import { useState, useEffect } from 'react'; 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으로 만들었습니다. 상태를 확인하는 Custom Hook을 상태를 보여주는 FriendStatus와 온라인 친구를 녹색으로 표시하는 FriendListItem에 사용해봅니다.
const isOnline = useFriendStatus(props.friend.id);
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> ); }
- Custom Hook은 무조건 "use"로 시작해야합니다. 그래야만 Hook 규칙에서 벗어났는지 자동으로 확인이 가능합니다.
- Custom Hook을 이용한 두 컴포넌트가 같은 state를 공유하지 않습니다. 사용할 때마다 격리된 상태의 Hook을 사용합니다.
- Custom Hook은 완전히 격리된 상태이기 때문에 useState, useEffect를 사용할 수 있습니다.
Hook간의 정보전달
이전에 만들어 놓은 Custom Hook을 이용하여 정보전달하는 예입니다.
const [recipientID, setRecipientID] = useState(1); const isRecipientOnline = useFriendStatus(recipientID);
- isRecipientOnline 값을 받아서 화면에 표시됩니다.
- setRecipientID 함수로 recipientID 값을 바꾼다면 useFriendStatus에 새로운 값이 들어갑니다.
- useFriendStatus의 값을 isRecipientOnline으로 받아서 화면에 다시 표시됩니다.
'Today I Learned' 카테고리의 다른 글
TIL_200909(PixiJS-tileTexture) (0) 2020.09.10 TIL_200907(PixiJS - sprite) (0) 2020.09.07 TIL_200905(React Hook 공식문서) (0) 2020.09.05 TIL_200622 (0) 2020.06.22 TIL_200619 (0) 2020.06.20