2019 년에 로딩 스피너를 만들면서이 문제를 해결 한 방법은 다음과 같습니다. React 기능 구성 요소를 사용하고 있습니다.
하위 Spinner 구성 요소 가있는 상위 앱 구성 요소가 있습니다 .
앱 에는 앱이로드 중인지 여부에 대한 상태가 있습니다. 앱이로드되면 Spinner 가 정상적으로 렌더링됩니다. 앱이로드되지 않을 때 ( isLoading
false) Spinner 가 소품으로 렌더링됩니다.shouldUnmount
.
App.js :
import React, {useState} from 'react';
import Spinner from './Spinner';
const App = function() {
const [isLoading, setIsLoading] = useState(false);
return (
<div className='App'>
{isLoading ? <Spinner /> : <Spinner shouldUnmount />}
</div>
);
};
export default App;
스피너 에는 숨겨진 여부에 대한 상태가 있습니다. 처음에는 기본 소품과 상태를 사용하여 Spinner 가 정상적으로 렌더링됩니다. Spinner-fadeIn
클래스 애니메이션 그것은 페이딩. 때 스피너 소품 수신 shouldUnmount
가로 렌더링을Spinner-fadeOut
이 페이드 아웃 애니메이션, 대신 클래스입니다.
그러나 나는 또한 페이드 아웃 후 컴포넌트를 마운트 해제하기를 원했습니다.
이 시점 onAnimationEnd
에서 위의 @ pranesh-ravi의 솔루션과 유사한 React 합성 이벤트를 사용해 보았지만 작동하지 않았습니다. 대신 setTimeout
에 애니메이션과 같은 길이의 지연을 사용 하여 상태를 숨김으로 설정했습니다. 로 지연된 후 스피너 가 업데이트 isHidden === true
되고 아무것도 렌더링되지 않습니다.
여기서 핵심은 부모가 자식을 언 마운트하지 않고 언 마운트 할시기를 자식에게 알려주며 자식이 언 마운트 작업을 처리 한 후 스스로 언 마운트한다는 것입니다.
Spinner.js :
import React, {useState} from 'react';
import './Spinner.css';
const Spinner = function(props) {
const [isHidden, setIsHidden] = useState(false);
if(isHidden) {
return null
} else if(props.shouldUnmount) {
setTimeout(setIsHidden, 500, true);
return (
<div className='Spinner Spinner-fadeOut' />
);
} else {
return (
<div className='Spinner Spinner-fadeIn' />
);
}
};
export default Spinner;
Spinner.css :
.Spinner {
position: fixed;
display: block;
z-index: 999;
top: 50%;
left: 50%;
margin: -40px 0 0 -20px;
height: 40px;
width: 40px;
border: 5px solid #00000080;
border-left-color: #bbbbbbbb;
border-radius: 40px;
}
.Spinner-fadeIn {
animation:
rotate 1s linear infinite,
fadeIn .5s linear forwards;
}
.Spinner-fadeOut {
animation:
rotate 1s linear infinite,
fadeOut .5s linear forwards;
}
@keyframes fadeIn {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes fadeOut {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
@keyframes rotate {
100% {
transform: rotate(360deg);
}
}