๐Ÿ“–[React]Custom Hook

ํ˜ฑยท2022๋…„ 7์›” 9์ผ

React

๋ชฉ๋ก ๋ณด๊ธฐ
10/28

๐Ÿ’— Custom Hook์ด๋ž€?

๋ฆฌ์•กํŠธ์—์„œ ์ œ๊ณต๋˜๋Š” Hook ์™ธ์— ๋” ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์„ ๋•Œ ์ง์ ‘ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” Hook
์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” logic์„ customํ•˜์—ฌ hook์œผ๋กœ ๋งŒ๋“ฆ
์ด๋ฆ„์ด use๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ Hook์„ ํ˜ธ์ถœํ•˜๋Š” ํ•˜๋‚˜์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜

๊ฐ Custom hook ์€ ํ˜ธ์ถœ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ state๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜์„œ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ž„

๐Ÿ’— Custom Hook ์˜ˆ์‹œ

๐Ÿ”ธ ์ค‘๋ณต๋˜๋Š” logic์ด ๊ทธ๋Œ€๋กœ ์žˆ๋Š” ๊ฒฝ์šฐ(์‚ฌ์šฉ ์•ˆํ•จ)

import React, {useState, useEffect} from 'react';

function UseState(props) {
  const [isOnline, setIsOnline ] = useState(null);
  
  function handleStatusChange(status) {
    setIsOnline(status, isOnline);
  }
  
  useEffect(()=> {
    ServerAPI.subscribeUserStatus(props.user.id handleStatusChange};
            return() => {
    ServerAPI.unsubscribeUserStatus(props.user.id handleStatusChange);
    //์ปดํฌ๋„ŒํŠธ๊ฐ€ unmount๋  ๋•Œ ํ˜ธ์ถœ๋จ! 
	};
});

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

๐Ÿ”ธ ์ค‘๋ณต๋˜๋Š” logic์„ customํ•œ ๊ฒฝ์šฐ

import React, {useState, useEffect} from 'react';

function useUserStatus(userId) {
  const [isOnline, setIsOnline ] = useState(null);
  
  useEffect(()=> {
  	function handleStatusChange(Status){
  setIsOnline(status, isOnline);
  }
  
  
    ServerAPI.subscribeUserStatus(user.id handleStatusChange};
	return() => {
    	ServerAPI.unsubscribeUserStatus(user.id handleStatusChange);
    //์ปดํฌ๋„ŒํŠธ๊ฐ€ unmount๋  ๋•Œ ํ˜ธ์ถœ๋จ! 
	};
});

return isOnline;

๐Ÿ”ธ custom hook ์‚ฌ์šฉํ•˜๊ธฐ

  function UserStatus(props){
    const isOnline = useUserStatus(props.user.id);

    if(isOnline === null ){
      return '๋Œ€๊ธฐ์ค‘..';
     }
      return isOnline ? '์˜จ๋ผ์ธ' : '์˜คํ”„๋ผ์ธ';
   }
  
  function UserListItem(props){
    const isOnline = useUserStatus(props.user.id);
  //custom hook ์‚ฌ์šฉ 
  
  return (
    <li style = {{color: isOnline ? 'green' : 'black' }}>
      {props.user.name}
    </li>
  	);
  }
profile
new blog: https://hae0-02ni.tistory.com/

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