Custom hook이란?

🤔 일반 컴포넌트에 query를 사용할경우

import { useQuery } from 'react-query';

const fetchData = async () => {
  const response = await fetch('/api/data');
  return response.json();
};

const App = () => {
  const { data, error, isLoading } = useQuery('test', fetchData);

  if (isLoading) {
    return <div>Loading...</div>;
  }

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

  return (
    <div>
      {data.map(item => (
        <div key={item.id}>{item.name}</div>
      ))}
    </div>
  );
};

✅ 커스텀 훅으로 분리

// hooks/query/useGetChatListQuery.tsx

import axios from 'axios';
import { useInfiniteQuery } from '@tanstack/react-query';
import { ChatListDataType } from '@/types/chatting/chatDataType';

const fetchAPI = async (page: number): Promise<ChatListDataType[]> => {
  try {
    const list = await axios.get(`/chats?size=10&page=${page}`);
    return list.data;
  } catch (error) {
    console.log(error);
    throw error;
  }
};

const useGetChatListQuery = () => {
  const {
    data: chatList,
    isLoading: chatListIsLoading,
    fetchNextPage: chatListFetchNextPage,
    hasNextPage: chatListhasNextPage
  } = useInfiniteQuery({
    queryKey: ['chatList'],
    initialPageParam: 1,
    queryFn: ({ pageParam = 1 }) => fetchAPI(pageParam),
    getNextPageParam: (lastPage, allPage) => {
      const nextpage = allPage.length + 1;
      return lastPage.length === 0 ? null : nextpage;
    }
  });

  return {
    chatList,
    chatListIsLoading,
    chatListFetchNextPage,
    chatListhasNextPage
  };
};

export default useGetChatListQuery;
// components/chatList.tsx
import useGetChatListQuery from '@/hooks/query/chat/useGetChatListQuery';

const ChatList = () => {
  const { chatList, chatListFetchNextPage } = useGetChatListQuery();
  
	return (
    <ul className="px-5 [&>*:last-child]:border-0">
      {chatList?.pages.map(page =>
        page.map(list => (
          <ChatItem
            key={list.chatRoomId}
            chatRoomId={list.chatRoomId}
            friendsName={list.friendsName}
            scheduleTitle={list.scheduleTitle}
          />
        ))
      )}
    </ul>
  );
};

export default ChatList;