Bird
Raised Fist0
NextJSframework~10 mins

Server action in client components in NextJS - Interactive Code Practice

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to mark the function as a server action.

NextJS
export const addItem = async () => {
  'use [1]';
  // server logic here
};
Drag options to blanks, or click blank then click option'
Aclient
Bserver
Caction
Duse
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'use client' instead of 'use server'.
Forgetting the quotes around the directive.
2fill in blank
medium

Complete the client component to import the server action correctly.

NextJS
import { [1] } from './actions';

export default function ClientComponent() {
  return <button onClick={() => addItem()}>Add</button>;
}
Drag options to blanks, or click blank then click option'
AaddItemAction
BuseServer
CaddItem
DserverAction
Attempts:
3 left
💡 Hint
Common Mistakes
Importing a wrong or non-existent name.
Trying to import a hook instead of the function.
3fill in blank
hard

Fix the error in the client component to call the server action properly.

NextJS
export default function ClientComponent() {
  const handleClick = async () => {
    await [1]();
  };
  return <button onClick={handleClick}>Add</button>;
}
Drag options to blanks, or click blank then click option'
AaddItem
BaddItem.call
CaddItem()
DaddItem.invoke
Attempts:
3 left
💡 Hint
Common Mistakes
Putting parentheses inside the await expression incorrectly.
Using non-existent methods like .call or .invoke.
4fill in blank
hard

Fill both blanks to define a server action and export it for client use.

NextJS
export const [1] = async () => {
  'use [2]';
  // server code
};
Drag options to blanks, or click blank then click option'
AsubmitForm
Bclient
Cserver
DhandleSubmit
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'use client' directive inside server action.
Choosing a function name that doesn't match usage.
5fill in blank
hard

Fill all three blanks to create a client component that calls a server action on button click.

NextJS
import { [1] } from './actions';

export default function ClientComp() {
  const handleClick = async () => {
    await [2]();
  };
  return <button onClick=[3]>Submit</button>;
}
Drag options to blanks, or click blank then click option'
AsubmitForm
ChandleClick
DaddItem
Attempts:
3 left
💡 Hint
Common Mistakes
Calling the function directly in onClick instead of passing a function.
Mismatching import and call names.

Practice

(1/5)
1. What is the main benefit of using server actions in Next.js client components?
easy
A. They enable client components to run only on the client side without server interaction.
B. They replace the need for React hooks in client components.
C. They allow client components to run server code securely without separate API routes.
D. They automatically convert client components into server components.

Solution

  1. Step 1: Understand server actions purpose

    Server actions let client components run server-side code directly, simplifying data handling.
  2. Step 2: Compare with API routes

    They remove the need for separate API routes by securely running server code from client components.
  3. Final Answer:

    They allow client components to run server code securely without separate API routes. -> Option C
  4. Quick Check:

    Server actions simplify server code use in client components = B [OK]
Hint: Server actions run server code from client without APIs [OK]
Common Mistakes:
  • Thinking server actions run only on client side
  • Confusing server actions with React hooks
  • Believing server actions convert client to server components
2. Which syntax correctly defines a server action in a Next.js client component?
easy
A. async function fetchData() { return await fetch('/api/data') }
B. export async function action() { 'use server'; /* server code */ }
C. function action() { 'use client'; /* client code */ }
D. const action = () => { return 'server action' }

Solution

  1. Step 1: Identify server action syntax

    Server actions require the 'use server' directive inside an async function to mark server code.
  2. Step 2: Check options for correct usage

    export async function action() { 'use server'; /* server code */ } correctly exports an async function with 'use server' directive, matching Next.js pattern.
  3. Final Answer:

    export async function action() { 'use server'; /* server code */ } -> Option B
  4. Quick Check:

    'use server' directive marks server action = A [OK]
Hint: Look for 'use server' directive inside async function [OK]
Common Mistakes:
  • Missing 'use server' directive in server action
  • Using 'use client' inside server action
  • Defining server action as non-async function
3. Given this code in a Next.js client component, what will happen when the button is clicked?
"use client";
import { useState } from 'react';
import { serverAction } from './actions';

export default function MyComponent() {
  const [message, setMessage] = useState('');

  async function handleClick() {
    const result = await serverAction();
    setMessage(result);
  }

  return (
    <>
      Click me
      

{message}

</> ); }
medium
A. The button click calls serverAction, updates message with its result, and displays it.
B. The button click causes a syntax error because serverAction cannot be called in client.
C. The message state never updates because serverAction runs only on server components.
D. The button click reloads the page instead of calling serverAction.

Solution

  1. Step 1: Understand serverAction usage in client component

    The client component imports and calls serverAction asynchronously on button click.
  2. Step 2: Analyze state update and rendering

    After awaiting serverAction, the result updates state 'message', which renders inside <p> tag.
  3. Final Answer:

    The button click calls serverAction, updates message with its result, and displays it. -> Option A
  4. Quick Check:

    Server action called and result shown = C [OK]
Hint: Server actions return data to client, update state to show result [OK]
Common Mistakes:
  • Assuming serverAction cannot be called from client
  • Forgetting async/await in handleClick
  • Expecting page reload on button click
4. Identify the error in this Next.js client component using a server action:
"use client";
import { serverAction } from './actions';

export default function Comp() {
  function handleClick() {
    const result = serverAction();
    console.log(result);
  }

  return Run;
}
medium
A. The component must use 'use server' directive instead of 'use client'.
B. serverAction cannot be imported into client components.
C. The button element must have an aria-label for accessibility.
D. handleClick must be async and await serverAction to get the result.

Solution

  1. Step 1: Check serverAction call in handleClick

    serverAction is async, so calling it without await returns a Promise, not the result.
  2. Step 2: Fix handleClick to async and await

    Making handleClick async and awaiting serverAction ensures correct result is logged.
  3. Final Answer:

    handleClick must be async and await serverAction to get the result. -> Option D
  4. Quick Check:

    Async function must await server action = D [OK]
Hint: Always await async server actions in client handlers [OK]
Common Mistakes:
  • Calling async server action without await
  • Thinking serverAction can't be imported in client
  • Ignoring accessibility best practices (not main error here)
5. You want to create a Next.js client component that uses a server action to submit a form and then reset the form fields. Which approach correctly combines server action usage and client state reset?
hard
A. Define an async server action with 'use server', call it in client handler with await, then reset state after await.
B. Call the server action without await, reset state immediately after calling it.
C. Use a server component instead of client component to handle form and reset state automatically.
D. Reset form state inside the server action function after processing data.

Solution

  1. Step 1: Understand server action and client state interaction

    Server actions run on server; client state reset must happen after server action completes.
  2. Step 2: Correct async handling and state reset

    Await server action call in client handler, then reset form state to ensure proper sequence.
  3. Final Answer:

    Define an async server action with 'use server', call it in client handler with await, then reset state after await. -> Option A
  4. Quick Check:

    Await server action before resetting client state = A [OK]
Hint: Await server action before resetting client form state [OK]
Common Mistakes:
  • Resetting state before awaiting server action
  • Trying to reset client state inside server action
  • Using server component instead of client for interactive form