Запись компонента загрузчика, как показано ниже:
import React from 'react'
import {ClipLoader} from "react-spinners";
const Loader = ({ loading, message, css, size }) => {
if (size === undefined)
size = 40;
return loading ? (
<div className='overlay-content'>
<div className='wrapper'>
<ClipLoader
css={css}
size={size}
color={"#123abc"}
loading={loading}
/>
<span className='message'>
{message}
</span>
</div>
</div>
) : null
};
export default Loader;
Запись компонента PostPage, как показано ниже:
import React, {useEffect, useState} from "react";
import Loader from "./Loader";
import axios from 'axios';
function PostPage() {
const [posts, setPost] = useState([]);
const [isLoading, setIsLoading] = useState(false);
let signal = axios.CancelToken.source();
useEffect(() => {
setIsLoading(true);
let isSubscribed = true;
axios.get(`https://jsonplaceholder.typicode.com/posts`, {
cancelToken: signal.token,
})
.then(res => {
const posts = res.data;
setPost(posts);
setIsLoading(false);
}).catch(err => {
setIsLoading(false);
console.log(err);
});
return function cleanup() {
isSubscribed = false;
signal.cancel('Api is being canceled');
}
}, []);
return (
<React.Fragment>
<ul>
{
isLoading ?
<Loader css='margin-left: 48%; margin-top: 10%' loading={isLoading}/> :
posts.map(post => <li key={post.id}>{post.title}</li>)
}
</ul>
</React.Fragment>
);
}
export default PostPage;
Затем используйте этот компонент в приложении. js как показано ниже:
import React from "react";
import ReactDOM from 'react-dom';
import PostPage from "./PostPage";
class App extends React.Component {
render() {
return (
<PostPage/>
);
}
}
ReactDOM.render(<App />, document.getElementById("root"));
export default App;