-
Notifications
You must be signed in to change notification settings - Fork 1
/
30-react-comp-fetch-posts.jsx
59 lines (53 loc) · 1.98 KB
/
30-react-comp-fetch-posts.jsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import { useState, useEffect } from "react";
export const PostsComponent = () => {
// Состояние для хранения данных
const [posts, setPosts] = useState([]);
// Состояние для отслеживания загрузки
const [loading, setLoading] = useState(true);
// Состояние для отслеживания ошибки
const [error, setError] = useState(false);
useEffect(() => {
// Выполняем запрос на сервер
fetch("https://jsonplaceholder.typicode.com/posts")
.then((response) => {
// Проверка, что запрос прошел успешно
if (!response.ok) {
throw new Error("Server error");
}
return response.json();
})
.then((data) => {
// Обновляем состояние с данными
setPosts(data);
// Снимаем состояние загрузки
setLoading(false);
})
.catch((err) => {
// Обрабатываем ошибку
console.error(err);
setError(true);
// Снимаем состояние загрузки
setLoading(false);
});
}, []); // Пустой массив зависимостей, чтобы useEffect сработал только один раз при загрузке компонента
// Если идет загрузка, отображаем текст "загрузка..."
if (loading) {
return <p>загрузка...</p>;
}
// Если произошла ошибка, отображаем текст "ошибка сервера"
if (error) {
return <p>ошибка сервера</p>;
}
// Если данные загружены успешно, отображаем их
return (
<div>
<h1>Posts</h1>
<ul>
{posts.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
</div>
);
};
export default PostsComponent;