npm i react-spinners
spiner적용 component를 하나 만들엉줍니다.
- loading.js
import React, { useEffect} from 'react'
import { css } from "@emotion/react";
import BeatLoader from "react-spinners/BeatLoader";
const override = css`
display: block;
margin: 0 auto;
border-color: rgba(255,255,255,0.7);
border-width: 10px;
`;
const Loading = (props) => {
const check = props.loading == null ? false : props.loading
return (
check &&
<div className='axios-loading' style={{display:props.loading===true?'block':'none'}}>
<div className='axios-loading-indicator'>
<BeatLoader color={"white"} loading={props.loading} css={override} size={40} />
</div>
</div>
)
}
export default Loading
저는 BeatLoader를 사용했습니다.
demoPage 에서 다양한 spinner 확인 가능 합니다.
- css.js
/* axios spiner */
.axios-loading {
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: 999;
overflow: auto;
display: block;
position: fixed !important;
background-color: rgba(0, 0, 0, 0.3);
}
.axios-loading-indicator {
top: 45%;
left: calc(50% - 75px);
position: fixed;
}
axios를 전역적으로 가로채야함으로
- app.js
import Loading from "./views/components/Loading";
loading component를 가져오고
function App() {
//loading spiner
const [loading, setLoading] = useState(false)
useEffect(()=>{
//axios 호출시 인터셉트
axios.interceptors.request.use(function (config) {
if(config.url.includes('detection')){
setLoading(true)
}
return config
}, function (error) {
return Promise.reject(error);
});
//axios 호출 종료시 인터셉트
axios.interceptors.response.use(function (response) {
setLoading(false)
return response;
}, function (error) {
setLoading(false)
return Promise.reject(error);
});
},[]);
return (
<>
<BrowserRouter>
<React.Suspense fallback={<Loading loading={loading}/>}>
<Switch>
{
<Route path="/" name="Home" render={(props) =>{
return <DefaultLayout {...props}/>
}}
/>
}
</Switch>
</React.Suspense>
</BrowserRouter>
<Loading loading={loading}/>
</>
)
}
export default App
<Loading loading={loading}/>
넣어주어 spinner 를 띄워줍니다.
전 api 중 detection이 포함 될때만 로딩 스피너를 띄우게 설정했습니다.
config.url.includes('detection')
728x90
반응형
'Front-end > React' 카테고리의 다른 글
[React] client IP / userAgent 정보 받기 (2) | 2022.10.06 |
---|---|
[React] 다국어 기능 적용하기 react-i18next (1) | 2022.10.05 |
[React] Canvas 사이즈에 맞춰 이미지의 원본 비율로 출력하기 (1) | 2022.09.23 |
[React] Canvas 레이아웃 2개 겹치기 (0) | 2022.09.23 |
React 리액트 초기 설정 네비 페이지화 기초 세팅 / 리액트 앱 생성 (0) | 2022.09.22 |
댓글