Przejdź do głównej zawartości

07. Fetch API i dane asynchroniczne

Fetch API i dane asynchroniczne

Fetch API to wbudowany w przeglądarkę interfejs do wykonywania zapytań HTTP. W React łączymy go z useEffect i async/await do pobierania danych z serwera. Kluczowe: obsługa stanów loading, error i data.

  1. Jak działa Fetch API? — Zwraca Promise, dwuetapowe: response.ok + response.json()
  2. Dlaczego fetch wewnątrz useEffect? — Efekty uboczne po renderze, unikanie race conditions
  3. Jak obsłużyć loading/error/data? — Trzy stany komponentu
  4. Co to jest race condition? — Starszy fetch przychodzi po nowszym — AbortController jako rozwiązanie
  1. Fetch API — podstawy — URL, metody HTTP, headers, body
  2. async/await z fetch — składnia, dwuetapowe odczytywanie odpowiedzi
  3. Trzy stanyloading, error, data — wzorzec obsługi
  4. AbortController — anulowanie fetch przy odmontowaniu lub zmianie zależności
  5. HTTP metody — GET, POST, PUT, DELETE z przykładami

Schemat

Diagram sekwencji: Komponent renderuje → useEffect → fetch request → serwer → response → setState(data) → re-render z danymi. Pokaż oddzielnie ścieżkę błędu.

Przykład kodu JSX

Komponent listy użytkowników z pełną obsługą loading/error/data i przyciskiem “Odśwież”.

  • Fetch API — podstawy, Promise vs async/await
  • GET request w useEffect
  • Trzy stany: loading, error, data

Forma: 10 slajdów, 10 minut

Ocena: 3.0
function UserList() {
const [users, setUsers] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const controller = new AbortController();
async function loadUsers() {
try {
const response = await fetch('https://jsonplaceholder.typicode.com/users', {
signal: controller.signal,
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
setUsers(data);
} catch (err) {
if (err.name !== 'AbortError') {
setError(err.message);
}
} finally {
setLoading(false);
}
}
loadUsers();
return () => controller.abort();
}, []);
if (loading) return <p>Ładowanie użytkowników...</p>;
if (error) return <p>Błąd: {error}</p>;
return (
<ul>
{users.map(user => (
<li key={user.id}>{user.name}{user.email}</li>
))}
</ul>
);
}
async function createUser(userData) {
const response = await fetch('/api/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(userData),
});
if (!response.ok) {
throw new Error('Nie udało się utworzyć użytkownika');
}
return response.json();
}

Użyj JSONPlaceholder

Demonstrując fetch, użyjcie https://jsonplaceholder.typicode.com/users — publiczne API, zawsze dostępne, zwraca sensowne dane.

Pokaż DevTools Network

Otwórzcie DevTools → Network podczas demonstracji. Klasa zobaczy request i response “na żywo” — to świetny efekt wizualny.

Fetch to łącznik z serwerem!

Bez pobierania danych aplikacja React żyje w izolacji. Ten temat jest niezbędny w każdym projekcie z backendem!