【React】ローディング(スピナー)を表示する方法
Reactでローディング(スピナー)を表示する方法を紹介します。
Reactでローディング(スピナー)を表示する方法
ファイル構成
src
∟App.css
∟App.js
∟index.js
index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
上でAppを読み込みます。
index.jsは特にいじるところはありません。
App.css
/* ローディング */
.loader,
.loader:before,
.loader:after {
background: #ffffff;
-webkit-animation: load1 1s infinite ease-in-out;
animation: load1 1s infinite ease-in-out;
width: 1em;
height: 4em;
}
.loader {
color: #ffffff;
text-indent: -9999em;
margin: 88px auto;
position: relative;
font-size: 11px;
-webkit-transform: translateZ(0);
-ms-transform: translateZ(0);
transform: translateZ(0);
-webkit-animation-delay: -0.16s;
animation-delay: -0.16s;
}
.loader:before,
.loader:after {
position: absolute;
top: 0;
content: '';
}
.loader:before {
left: -1.5em;
-webkit-animation-delay: -0.32s;
animation-delay: -0.32s;
}
.loader:after {
left: 1.5em;
}
@-webkit-keyframes load1 {
0%,
80%,
100% {
box-shadow: 0 0;
height: 4em;
}
40% {
box-shadow: 0 -2em;
height: 5em;
}
}
@keyframes load1 {
0%,
80%,
100% {
box-shadow: 0 0;
height: 4em;
}
40% {
box-shadow: 0 -2em;
height: 5em;
}
}
ローディングのcssは自分で実装してもいいですし、
下のようなまとめサイトもあるので、そこから拝借するものいいと思います
参考サイト: CSSで実装されたローディング・スピナーのアニメーションのまとめ
App.js
import { useEffect, useState } from "react";
import "./App.css";
function App() {
const [loading, setLoading] = useState(true); //最初にloading出したいのでtrue
useEffect(() => {
const fetchData = () => {
<!-- この辺りに非同期の処理 -->
setLoading(false);
};
fetchData();
}, []);
return (
<>
<div className="App">
{loading ? (
<p className="loader">ロード中。。。</p>
) : (
<>
<div className="">
ここに表示したい内容
</div>
</>
)}
</div>
</>
);
}
export default App;
ローディングの状態を保持したいので、useStateを使います。
初期値は、最初にローディングを出したいのでtrueにします。
そして、JSX部分で、三項演算子を使って、loadingがtrueのときとfalseのときで、表示を切り替えます。
あとは、関数内で、setLoadingにtrueまたはfalseをセットすることで、ローディングの状態を切り替えることが可能です。