오늘은 리액트 로딩 스피너 중 react-spinners 라이브러리를 리뷰하고, 사용법에 대해서 간단히 정리해 보고자 합니다.
웹사이트에서 시간이 걸리는 데이터를 조회할 때 화면의 변화없이 가만히 멈추어 있다면 사용자는 오류가 난 건지 시간이 걸리는 건지 알 수가 없습니다.
따라서 이럴 때 사용하는게 로딩 스피너인데요, 로딩 스피너를 통해서 현재 어떠한 처리가 진행 중임을 알릴 수 있습니다.
이럴 때 유용한 라이브러리가 react-spinners 인데요, Fade, Beat, Sync 등등 다양한 스피너 형태 중 원하는 것을 선택하여 사용할 수 있습니다.
react-spinners 로딩 스피너 설치
reat-spinners 는 아래와 같이 설치할 수 있습니다.
npm i react-spinners
react-spinners 사용법
아래와 같이 간단히 만들어 보았습니다. props 인자로 spinner 타입과 loading 여부를 받습니다.
import {
MoonLoader,
BarLoader,
ClipLoader,
SyncLoader,
PulseLoader,
FadeLoader,
BeatLoader,
DotLoader,
GridLoader,
} from "react-spinners";
type SpinnerProps = {
type?: string;
loading?: boolean;
};
const override = {
display: "block",
margin: "0 auto",
};
const Spinner = ({ type = "FadeLoader", loading = true }: SpinnerProps) => {
return (
<>
{type === "GridLoader" (
<GridLoader
cssOverride={override}
loading={loading}
color="#36d7b7"
/>
)}
{type === "MoonLoader" (
<MoonLoader
cssOverride={override}
loading={loading}
color="#36d7b7"
/>
)}
{type === "BarLoader" (
<BarLoader
cssOverride={override}
loading={loading}
color="#36d7b7"
/>
)}
{type === "ClipLoader" (
<ClipLoader
cssOverride={override}
loading={loading}
color="#0854A0"
/>
)}
{type === "SyncLoader" (
<SyncLoader
cssOverride={override}
loading={loading}
color="#0854A0"
/>
)}
{type === "PulseLoader" (
<PulseLoader
cssOverride={override}
loading={loading}
color="#0854A0"
/>
)}
{type === "FadeLoader" (
<FadeLoader
cssOverride={override}
loading={loading}
color="#0854A0"
/>
)}
{type === "BeatLoader" (
<BeatLoader
cssOverride={override}
loading={loading}
color="#0854A0"
speedMultiplier={1.5}
/>
)}
{type === "DotLoader" (
<DotLoader
cssOverride={override}
loading={loading}
color="#0854A0"
speedMultiplier={1.5}
/>
)}
</>
);
};
export default Spinner;
react-spinners 사용 예시
대략 아래와 같이 테스트해 볼 수 있으며, loading 여부는 isLoading state 등을 추가하여 제어하면 될 거 같습니다.
(아래의 예시는 mui 라이브러리가 사용되었습니다. Box는 div 등으로 교체하면 됩니다.)
<Box>
<Box
display={"flex"}
gap={"30px"}
>
<Spinner />
<Spinner type="GridLoader" />
<Spinner type="MoonLoader" />
<Spinner type="BarLoader" />
<Spinner type="ClipLoader" />
</Box>
<Box
display={"flex"}
gap={"30px"}
>
<Spinner type="SyncLoader" />
<Spinner type="PulseLoader" />
<Spinner type="BeatLoader" />
<Spinner type="DotLoader" />
</Box>
</Box>
아래와 같이 다양한 로딩 스피너를 사용할 수 있습니다.
각 스피너마다 어울리는 형태가 있으니 각각의 상황에 적절한 스피너를 골라서 사용하면 됩니다.
예를 들어, 일반적인 api 데이터 조회에서는 ClipLoader 를 사용하면 적절할 것으로 보이며, 화면 구성 async 하게 처리되며 “점차” 만들어 지는 형태에서는 Fade spinner가 어울릴 거 같습니다.
react-spinners의 주요 Props
스피너의 loading 여부는 loading props로 조절할 수 있습니다. false인 경우 spinner는 사라집니다.
<FadeLoader
...
loading={true}
...
/>
스피너의 색깔은 color로 조절할 수 있습니다.
<PulseLoader
...
color="#0854A0"
/>
speedMultiplier props를 통해서 로딩 스피드를 조절할 수 있습니다.
```
<PulseLoader
...
speedMultiplier="1.5"
/>
이상으로 react-spinners 사용법 및 예시를 알아보았습니다. 데이터 처리 로딩 처리시 유용하게 사용해 보시기 바랍니다.
그 밖에 도움되는 글
모던 ProgressBar NProgress 리액트 사용 예시(+RTK Query)