← Каталог
Fetch / axios — типовые запросы — 9. React — загрузка в useEffect
Фрагмент из «Fetch / axios — типовые запросы»: 9. React — загрузка в useEffect.
import { useEffect, useState } from 'react';
function PostPage({ id }) {
const [post, setPost] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const controller = new AbortController();
async function load() {
setLoading(true);
setError(null);
try {
const res = await fetch(
`https://jsonplaceholder.typicode.com/posts/${id}`,
{ signal: controller.signal },
);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
setPost(await res.json());
} catch (e) {
if (e.name !== 'AbortError') setError(e.message);
} finally {
setLoading(false);
}
}
load();
return () => controller.abort();
}, [id]);
if (loading) return <p>Загрузка…</p>;
if (error) return <p>Ошибка: {error}</p>;
return <h1>{post.title}</h1>;
} import { useEffect, useState } from 'react';
function PostPage({ id }) {
const [post, setPost] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const controller = new AbortController();
async function load() {
setLoading(true);
setError(null);
try {
const res = await fetch(
`https://jsonplaceholder.typicode.com/posts/${id}`,
{ signal: controller.signal },
);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
setPost(await res.json());
} catch (e) {
if (e.name !== 'AbortError') setError(e.message);
} finally {
setLoading(false);
}
}
load();
return () => controller.abort();
}, [id]);
if (loading) return <p>Загрузка…</p>;
if (error) return <p>Ошибка: {error}</p>;
return <h1>{post.title}</h1>;
}