🐳React | Custom Hook

μ›μ˜Β·2023λ…„ 8μ›” 13일
1

μƒˆλ‘œμš΄ μ§€μ‹πŸ’‘

λͺ©λ‘ 보기
11/15

πŸ”ŽReact Hook

  • React 16.8 λΆ€ν„° μΆ”κ°€λœ μš”μ†Œ
  • Hook을 μ΄μš©ν•˜λ©΄ κΈ°μ‘΄ Class μ½”λ“œ 없이 ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μƒνƒœ 관리와 μ—¬λŸ¬ React κΈ°λŠ₯을 μ‚¬μš©ν•  수 있음
  • useState , useEffect , useReducer , useCallback , useMemo λ“± μ—¬λŸ¬ λ‚΄μž₯ ν•¨μˆ˜ 쑴재

πŸ”ŽCustom Hook

  • κ°œλ°œμžκ°€ 직접 λ§Œλ“€ 수 μžˆλŠ” Hook(ν•¨μˆ˜)
  • 반볡적으둜 μ‚¬μš©λ˜λŠ” λ‘œμ§μ„ μΆ”μƒν™”ν•˜μ—¬ Hook으둜 λ§Œλ“€μ–΄ μž¬μ‚¬μš©μ„±μ„ λ†’μž„
    μ½”λ“œ 좔상화 : ν”„λ‘œκ·Έλž˜λ°μ—μ„œ νŠΉμ •ν•œ κΈ°λŠ₯, λ™μž‘ λ˜λŠ” κ°œλ…μ„ μΌλ°˜ν™”ν•˜κ±°λ‚˜ λ‹¨μˆœν™”ν•˜μ—¬ μ‚¬μš©μžκ°€ 더 μ‰½κ²Œ μ΄ν•΄ν•˜κ³  ν™œμš©ν•  수 μžˆλ„λ‘ ν•˜λŠ” κ³Όμ •
  • Custom Hook의 이름은 일반적으둜 use-둜 μ‹œμž‘
  • Hook은 κ°’μ˜ μž¬μ‚¬μš©μ΄ μ•„λ‹ˆλΌ 둜직의 μž¬μ‚¬μš©μ„ μœ„ν•œ 것
  • 일반 μ»΄ν¬λ„ŒνŠΈ return κ°’ : UIλ₯Ό λ‚˜νƒ€λ‚΄λŠ” jsx
    Custom Hook return κ°’ : 외뢀와 κ³΅μœ ν•˜κ³  싢은 κ²°κ³Όκ°’(데이터)

πŸ’‘Custom Hook μ μš©ν•΄λ³΄κΈ°

useFetchData.jsx

  • API μš”μ²­μ„ 톡해 데이터λ₯Ό λ°›μ•„μ˜€λŠ” λΆ€λΆ„ Custom Hook으둜 뢄리
import { useState, useEffect } from 'react';

function useFetchData(url) {
  // μ»€μŠ€ν…€ ν›… μ•ˆμ—μ„œ μž¬μ‚¬μš©ν•  λ‚΄λΆ€ μƒνƒœ κ°€μ Έμ˜΄
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {    
    fetch(url)
    .then((res) => res.json())
    .then((data) => {
      setData(data);
    })
    .catch((error) => {
      setError(error);
    })
    .finally(() => {
      setLoading(false);
    });
    
  }, [url]);

  // 외뢀와 κ³΅μœ ν•˜κ³  싢은 데이터 return
  return { data, loading, error };
}

export default useFetchData;

μ‚¬μš©ν•˜λŠ” 파일.jsx

import React from 'react';
// μ»€μŠ€ν…€ ν›… import
import useFetchData from './useFetchData'; 

function App() {
  // μ»€μŠ€ν…€ ν›… μ‚¬μš©
  const { data, loading, error } = useFetchData('https://example.url');

  if (loading) {
    return <p>Loading...</p>;
  }

  if (error) {
    return <p>Error: {error.message}</p>;
  }

  return (
    <div>
      <h1>Post Title: {data?.title}</h1>
      <p>Post Body: {data?.body}</p>
    </div>
  );
}

export default App;
  • API μš”μ²­μ„ 톡해 데이터λ₯Ό λ°›μ•„μ˜€λŠ” 둜직이 ν•„μš”ν•˜λ©΄ μ–΄λ–€ νŒŒμΌμ—μ„œλ‚˜ useFetchData.jsx μ»€μŠ€ν…€ 훅을 ν™œμš©ν•΄ 더 κ°„κ²°ν•˜κ²Œ λ°›μ•„μ˜¬ 수 있음
profile
ν™”μ΄νŒ…~~^ㅁ^/

1개의 λŒ“κΈ€

comment-user-thumbnail
2023λ…„ 8μ›” 13일

μœ μ΅ν•œ κΈ€μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

λ‹΅κΈ€ 달기