Custom hook이란?
use로 시작한다 (ex: useInput, useSearch ~)🤔 일반 컴포넌트에 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;