본문 바로가기
Front-end/React

[React-spinner] loading spinner 적용하기 axios interseptor

by 꼬바리 2022. 9. 27.

참고 git

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
반응형

댓글