Next.js onClick Handlers: App & Pages Router
January 20, 2024Next.js onClick Handlers: The Ultimate Guide
If you've just moved to the Next.js App Router and your buttons are throwing errors like "Event handlers cannot be passed to Client Component props," you aren't alone.
Handling
onClick[FREE DOWNLOAD] The Next.js App Router Interactivity Cheat Sheet
Stop fighting 'use client' errors. Get the 5 patterns I use to handle state and events without bloating your client bundle. Download the Cheat Sheet Here (Lead Magnet Placeholder)
The #1 Mistake: Forgetting 'use client'
In the Next.js App Router, components are Server Components by default. Server Components are rendered on the server and cannot handle browser events like
onClickTo use a button with a click handler, you must add the
"use client";Modern App Router Example
// components/InteractiveButton.tsx "use client"; export default function InteractiveButton() { const handleClick = () => { alert("Button clicked in the browser!"); }; return ( <button onClick={handleClick} className="px-4 py-2 bg-blue-600 text-white rounded-md" > Click Me </button> ); }
The "Server-to-Client" Pattern
A common business requirement is fetching data on the server but handling clicks on the client. You should keep your data fetching in a Server Component and pass only the necessary data to an Interactive Client Component.
// app/page.tsx (Server Component) import InteractiveButton from './components/InteractiveButton'; export default function Page() { return ( <main> <h1>Product Dashboard</h1> {/* The button handles interactivity, the page stays a Server Component */} <InteractiveButton /> </main> ); }
Navigating on Click (The Right Way)
Don't use
window.location.hrefuseRouternext/navigation"use client"; import { useRouter } from 'next/navigation'; export default function NavButton() { const router = useRouter(); return ( <button onClick={() => router.push('/dashboard')}> Go to Dashboard </button> ); }
Building a Complex Next.js App?
Handling interactivity at scale is hard. I help teams migrate legacy React apps to the Next.js App Router while improving Core Web Vitals. Book a 15-minute consulting discovery call
Common Errors & FAQs (SEO)
Error: "Event handlers cannot be passed to Client Component props"
This happens when you try to pass a function (like
onClickCan I use onClick in a Server Component?
No. All interactivity requires the browser's JavaScript engine. You must use a Client Component for
onClickonScrolluseStateuseEffectHow do I track button clicks in Next.js?
You can trigger analytics (like Google Analytics or PostHog) inside the
onClickConclusion
Mastering
onClickHappy coding!
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "How do I fix 'Event handlers cannot be passed to Client Component props' in Next.js?", "acceptedAnswer": { "@type": "Answer", "text": "This error occurs when you try to pass a function like onClick from a Server Component to a Client Component. To fix it, either define the function directly inside a 'use client' component or use Server Actions for logic that doesn't require immediate UI feedback." } }, { "@type": "Question", "name": "Can I use onClick in a Next.js Server Component?", "acceptedAnswer": { "@type": "Answer", "text": "No, Server Components do not support browser events like onClick. You must add the 'use client' directive to the top of your component file to enable interactivity." } }, { "@type": "Question", "name": "What is the best way to navigate on click in Next.js?", "acceptedAnswer": { "@type": "Answer", "text": "The best way to navigate on a button click is using the useRouter hook from 'next/navigation'. This ensures a fast, client-side transition without a full page reload." } } ] } </script>