DocsSection 3
3Section 3 of 10
Data Flow
Data Flow: How Requests Work
3.1 Client-Side Data Fetching
Pattern used in: Sales dashboard, client portal (interactive pages)
User clicks button
↓
React component calls fetch('/api/sales/leads')
↓
Browser sends HTTP request
↓
Next.js API route receives request
↓
Middleware checks auth (session cookie)
↓
API handler queries database
↓
Returns JSON response
↓
React updates UI with new data
Example: app/sales/leads/page.tsx
'use client'; // This runs in browser
export default function LeadsPage() {
const [leads, setLeads] = useState([]);
useEffect(() => {
// Client-side fetch
fetch('/api/sales/leads')
.then(r => r.json())
.then(data => setLeads(data.leads));
}, []);
return <LeadTable leads={leads} />;
}
3.2 Server-Side Data Fetching
Pattern used in: Admin dashboard, marketing pages (SEO important)
User requests /admin/dashboard
↓
Next.js renders page.tsx on SERVER
↓
Server component queries database directly
↓
HTML generated with data embedded
↓
HTML sent to browser (fast, SEO-friendly)
↓
React hydrates interactive parts
Example: app/(admin)/admin/dashboard/page.tsx
// NO 'use client' - this runs on SERVER
export default async function AdminDashboard() {
// Database query happens on server
const stats = await getDashboardStats();
const activities = await getRecentActivity();
return (
<div>
<StatsCards stats={stats} />
<ActivityFeed activities={activities} />
</div>
);
}
3.3 When to Use Which
| Use Client-Side When... | Use Server-Side When... |
|---|---|
| Real-time updates needed | SEO matters |
| User interactions (forms) | First load performance |
| Data changes frequently | Data is static/slow-changing |
| Complex state management | Authentication required |
Hybrid approach: Most pages use both
- Server: Load initial data
- Client: Update interactively