Notice
Recent Posts
Recent Comments
Link
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

죽이죽이

React : Custom Hook 본문

React

React : Custom Hook

죽이죽이 2024. 2. 23. 12:52

Custom Hook

※ 사용하는 이유
- 재사용이 가능한 로직을 별도의 함수로 만들어 다른 컴포넌트에서도 사용 가능하게 할 수 있다.

- React에서 제공하는 built-in-hook과 동일하게 use로 시작하는 네이밍 컨벤션을 따른다.

※ 예시

- App.js

  const [tasks, setTasks] = useState([]);

  const transformTasks = (tasksObj) => {
    const loadedTasks = [];

    for (const taskKey in tasksObj) {
      loadedTasks.push({ id: taskKey, text: tasksObj[taskKey].text });
    }

    setTasks(loadedTasks);
  };

  const { isLoading, error, sendRequest: fetchTasks } = useHttp();

  useEffect(() => {
    fetchTasks(
      {
        url: "https://test-9ba2f-default-rtdb.firebaseio.com/tasks.json",
      },
      transformTasks
    );
  }, []);​


- useHttp.jsx (Custom Hook)

import { useState } from "react";

export default function useHttp() {
  const [isLoading, setIsLoading] = useState(false);
  const [error, setError] = useState(null);

  const sendRequest = async (requestConfig, applyData) => {
    setIsLoading(true);
    setError(null);
    try {
      const response = await fetch(requestConfig.url, {
        method: requestConfig?.method ? requestConfig.method : "GET",
        headers: requestConfig?.headers ? requestConfig.headers : {},
        body: requestConfig?.body ? requestConfig.body : null,
      });

      if (!response.ok) {
        throw new Error("Request failed!");
      }

      const data = await response.json();
      applyData(data);
    } catch (err) {
      setError(err.message || "Something went wrong!");
    }
    setIsLoading(false);
  };

  return {
    isLoading,
    error,
    sendRequest,
  };
}

 

 

'React' 카테고리의 다른 글

React : Redux란?  (0) 2024.02.26
React : Form 유효성 검사 3가지 방식  (1) 2024.02.26
React : debounce  (0) 2024.02.20
React : Portal  (0) 2024.02.19
React : key props가 필요한 이유  (0) 2024.02.13