no-client-side-data-fetching
Disallow direct data fetching inside useEffect or useLayoutEffect.
Why
Effect-driven reads begin after rendering and can create request waterfalls, duplicate fetches, and loading-state layout shifts.
Fix
Fetch in a React Server Component or Server Action, or use a client cache such as SWR or React Query.
Examples
"use client";import { useEffect } from "react";export function Users() { useEffect(() => { fetch("/api/users"); }, []); return null;}import { loadUsers } from "./users-client";export default async function Users() { const users = await loadUsers(); return <pre>{JSON.stringify(users)}</pre>;}export async function loadUsers(): Promise<unknown> { const response = await fetch("https://api.example.com/users"); return response.json();}