Next.js Client Components — Adding Interactivity with "use client"

▲ Next.js 15+ (App Router) 🟢 Chapter 11 of 43 📂 Phase 5: Server & Client Components 📅 2026 Edition
📌 Covered in this chapter: "use client" Directive · useState & Event Handlers · Browser APIs · Client Component Boundaries · Passing Props
Interactivity (buttons, forms, toggles) కావాలంటే Client Components అవసరం. Ee chapter lో 'use client' directive ela pని చేస్తుందో, boundaries ఎక్కడ pెట్టాలో నేర్చుకుందాం.
1The "use client" Directive

Component top లో "use client"; అని ఒక్క line rాస్తే chాలు — Next.js aa component (mariyu దాని imports) ni Client Component గా treat చేస్తుంది, browser లో hydrate అయ్యి, interactive గా అవుతుంది:

💻 Example 1: An Interactive Counter
app/_components/Counter.tsx ▶ Run in Compiler
"use client";

import { useState } from "react";

export default function Counter() {
  const [count, setCount] = useState(0);

  return (
    <button onClick={() => setCount(count + 1)}>
      Count: {count}
    </button>
  );
}
🔍 Breakdown:

"use client" లేకపోతే, ఈ component useState లేదా onClick వాడలేదు — build error వస్తుంది. Directive ఫైల్ top లో, imports కి mundu ఉండాలి.

2Browser APIs in Client Components

Client Components లోనే, browser-only APIs (localStorage, window, navigator) వాడొచ్చు — ఇవి Server Components లో అస్సలు అందుబాటులో ఉండవు:

💻 Example 2: Reading window Width
app/_components/WindowSize.tsx ▶ Run in Compiler
"use client";

import { useState, useEffect } from "react";

export default function WindowSize() {
  const [width, setWidth] = useState(0);

  useEffect(() => {
    setWidth(window.innerWidth);
  }, []);

  return <p>Window width: {width}px</p>;
}
3Client Component Boundaries

Important rule: ఒక component "use client" అయితే, దాని లోపల import అయిన అన్ని child components కూడా క్లయింట్ bundle లో భాగం అవుతాయి — even if వాటికి "use client" లేకపోయినా. Kabatti, "use client" boundary ni వీలైనంత లోతుగా, చిన్నగా pెట్టడం best practice — మొత్తం page top level లో pెట్టకూడదు.

app/dashboard/page.tsx (Server Component — default) ├── <Header /> (Server Component) ├── <StatsCard /> (Server Component) └── <LikeButton /> ("use client" — only this needs interactivity)

Ee pattern lo, kevalం LikeButton matrame client bundle లో ఉంటుంది — migతా page zero-JavaScript గా server meedha render అవుతుంది.

⚠️ Common Mistake: Marking the Entire Page as Client

Whole page.tsx top లో 'use client' pెడితే, ఆ page లోపల unna prathi component (data-fetching parts kూడా) client bundle లో చేరిపోతాయి — performance benefit మొత్తం పోతుంది. Interactivity అవసరమైన చిన్న భాగాలనే client components గా extract చేయాలి.

💻 Hands-on Interactive Practice Challenge

Create a client component ToggleTheme with a button that switches between 'Light' and 'Dark' text using useState.

app/_components/ToggleTheme.tsx ▶ Run in Compiler
"use client";

import { useState } from "react";

export default function ToggleTheme() {
  const [theme, setTheme] = useState("Light");

  return (
    <button onClick={() => setTheme(theme === "Light" ? "Dark" : "Light")}>
      Current Theme: {theme}
    </button>
  );
}
Run This Challenge in Online Node.js IDE →
Frequently Asked Questions (FAQ)

Q Client Component లో server-only code (DB queries) వాడొచ్చా?

Ledు. Client Component browser లో run అవుతుంది కాబట్టి, database credentials/secrets ఎప్పుడూ అందులో pెట్టకూడదు — security risk.

Q prathi interactive button ki వేరే file compulsory ah?

అవసరం లేదు, kani best practice. చిన్న, focused client components వేరే files లో pెడితే, code reuse చేయడం easy, and client bundle కూడా చిన్నగా ఉంటుంది.

Q Client Component లోపల Server Component import చేయవచ్చా?

Direct ga import చేయలేరు (avి automatically client-rendered అయిపోతాయి). Kani 'children' prop ద్వారా Server Component ni Client Component లోపలికి pass చేయవచ్చు — advanced pattern.

OC
Written by Our Compiler Technical Editorial Team
Reviewed for accuracy & tested on Next.js 15+ (App Router) · Last updated August 2026