intermediate
Fetching Data on Mount with Loading and Error States
Learn how to use useEffect to fetch data when a component first renders, track loading and error state, and handle cleanup properly.
import { useState, useEffect } from 'react';
interface User {
id: number;
name: string;
email: string;
}
export function UserProfile({ userId }: { userId: number }) {
const [user, setUser] = useState<User | null>(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
_________(() => {
let isMounted = true;
const fetchUser = async () => {
try {
setLoading(true);
const response = await fetch(`https://api.example.com/users/${userId}`);
const data = await response.json();
if (isMounted) {
setUser(data);
setError(null);
}
} catch (err) {
if (isMounted) {
setError('Failed to fetch user');
}
} finally {
if (isMounted) {
setLoading(false);
}
}
};
fetchUser();
return () => {
__________...;
};
}, ___);
if (loading) __________...;
if (error) return <div>Error: {error}</div>;
if (!user) return <div>No user found</div>;
return (
<div>
<h2>{user.name}</h2>
<p>{user.email}</p>
</div>
);
}0/4 filled tab moves · Ctrl+↵ submits · Ctrl+Shift+↵ runsstarter code