스타워즈 API와 React-Query, infinite-scroll 패키지를 이용해서 인피니티 스크롤을 만들었다.
https://swapi.dev/여기에 들어가면 스타워즈 관련된 API를 확인할 수 있는데, 무한 스크롤을 구현하기 쉽도록 데이터구조가 잘 짜여져있다.
여기는 인피니티 스크롤을 쉽게 만들어주는 패키지인데, 쉽고 간편하고 다운로드 수도 많다.
<InfiniteScroll
pageStart={0}
loadMore={loadFunc}
hasMore={true || false}
loader={<div className="loader" key={0}>Loading ...</div>}
>
{items} // <-- This is the content you want to load
</InfiniteScroll>
import { QueryClient, QueryClientProvider } from "react-query";
import { ReactQueryDevtools } from "react-query/devtools";
import Scroll from "./Scroll";
import "./App.css";
function App() {
const queryClient = new QueryClient();
return (
<QueryClientProvider client={queryClient}>
<Scroll />
<ReactQueryDevtools />
</QueryClientProvider>
);
}
export default App;
import React from "react";
import axios from "axios";
import InfiniteScroll from "react-infinite-scroller";
import { useInfiniteQuery } from "react-query";
import Planets from "./Planets";
function Scroll() {
const initialUrl = "https://swapi.dev/api/planets/";
const getPlanetsInfo = async url => {
const response = await axios.get(url);
return response.data;
};
const {
data,
fetchNextPage,
hasNextPage,
isLoading,
isFetching,
isError,
error,
} = useInfiniteQuery(
"sw-planets",
({ pageParam = initialUrl }) => getPlanetsInfo(pageParam),
{ getNextPageParam: lastPage => lastPage.next || undefined }
);
if (isLoading) return <div>is Loading ... </div>;
if (isError)
return (
<div>
is Error ... <p>{error.toString()}</p>{" "}
</div>
);
return (
<>
{isFetching && <div>Loading ... </div>}
<InfiniteScroll loadMore={fetchNextPage} hasMore={hasNextPage}>
{data.pages.map(pageData => {
return pageData.results.map(planets => {
return (
<Planets
key={planets.name}
name={planets.name}
rotation_period={planets.rotation_period}
terrain={planets.terrain}
population={planets.population}
gravity={planets.gravity}
/>
);
});
})}
</InfiniteScroll>
</>
);
}
export default Scroll;
전체 코드는 여기서 확인할 수 있다.