Fetching Data

View saved

Fetch inside useEffect

Start the request after mount (or when a dependency changes). Store the result in state.

function Users() {
  const [users, setUsers] = useState([]);
  const [error, setError] = useState(null);

  useEffect(() => {
    let cancelled = false;

    async function load() {
      try {
        const response = await fetch("https://jsonplaceholder.typicode.com/users");
        if (!response.ok) throw new Error("Request failed");
        const data = await response.json();
        if (!cancelled) setUsers(data);
      } catch (err) {
        if (!cancelled) setError(err.message);
      }
    }

    load();
    return () => {
      cancelled = true;
    };
  }, []);

  if (error) return <p>Error: {error}</p>;
  return (
    <ul>
      {users.map((user) => (
        <li key={user.id}>{user.name}</li>
      ))}
    </ul>
  );
}

Show loading UI

Add a loading boolean so users know work is in progress.

const [loading, setLoading] = useState(true);
// set false in finally after the request

Handle HTTP errors

fetch only rejects on network failure. Check response.ok yourself.

Practice safely

Use public demo APIs while learning. Never put secret API keys in frontend code.

Comments

One comment per signed-in account. Comments are saved with this page’s URL.