Learn how to implement spinners, skeletons, and loading states in Next.js App Router with Tailwind CSS.
Server Component with streaming SSR - fetches data on server and progressively renders
View Demo →Client Component using React use() hook - modern pattern for client-side fetching
View Demo →Products catalog with traditional useState loading state and full-page spinner
View Demo →This demo compares three different approaches to loading states in Next.js App Router:
Data fetches on the server. Static content renders instantly (~50ms) while dynamic parts stream in when ready. Best performance and SEO.
Modern React 19 pattern. Fetches from browser using the use() hook. Cleaner syntax than useState but same client-side behavior.
Traditional React pattern. Full manual control over loading, error, and success states. Great for complex state management.