0
0
NextJSframework~20 mins

Server action in client components in NextJS - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Server Action Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
component_behavior
intermediate
2:00remaining
What happens when a server action is called inside a client component?
Consider a Next.js client component that calls a server action on a button click. What is the expected behavior of the component after the server action completes?
NextJS
import { useState } from 'react';
'use client';

async function addItem(data) {
  'use server';
  // Imagine this adds data to a database
  return 'Item added';
}

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

  async function handleClick() {
    const result = await addItem({ name: 'New Item' });
    setMessage(result);
  }

  return (
    <>
      <button onClick={handleClick}>Add Item</button>
      <p>{message}</p>
    </>
  );
}
AThe button click triggers the server action, and the component updates the message with 'Item added' without a full page reload.
BThe server action runs on the client, causing a runtime error because server code cannot run in the browser.
CThe component reloads the entire page after the server action completes to update the UI.
DThe server action is ignored because client components cannot call server actions.
Attempts:
2 left
💡 Hint
Think about how Next.js handles server actions called from client components asynchronously.
📝 Syntax
intermediate
1:30remaining
Identify the correct syntax to define a server action in Next.js
Which of the following code snippets correctly defines a server action that can be called from a client component?
Aasync function saveData() { 'use client'; /* server code */ }
Bfunction saveData() { 'use client'; /* server code */ }
Casync function saveData() { 'use server'; /* server code */ }
Dfunction saveData() { 'use server'; /* client code */ }
Attempts:
2 left
💡 Hint
Server actions must be async functions with a special directive.
🔧 Debug
advanced
2:00remaining
Why does this server action call cause a runtime error in a client component?
Examine the code below. Why does calling the server action cause a runtime error in the client component?
NextJS
import { useState } from 'react';
'use client';

function deleteItem(id) {
  'use server';
  // delete logic
}

export default function DeleteButton() {
  const [deleted, setDeleted] = useState(false);

  function handleDelete() {
    deleteItem(1);
    setDeleted(true);
  }

  return <button onClick={handleDelete}>{deleted ? 'Deleted' : 'Delete'}</button>;
}
AThe server action must be imported from a separate server file, not defined inline.
BThe client component cannot use useState with server actions.
CThe 'use server' directive is misplaced; it should be outside the function.
DThe server action is called without await, so it runs on the client causing a runtime error.
Attempts:
2 left
💡 Hint
Consider how async server actions must be called from client components.
state_output
advanced
1:30remaining
What is the value of 'count' after calling this server action in a client component?
Given the code below, what will be the value of 'count' displayed after clicking the button once?
NextJS
import { useState } from 'react';
'use client';

let serverCount = 0;

async function increment() {
  'use server';
  serverCount += 1;
  return serverCount;
}

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

  async function handleClick() {
    const newCount = await increment();
    setCount(newCount);
  }

  return <button onClick={handleClick}>Count: {count}</button>;
}
ACount: 0
BCount: 1
CCount: NaN
DCount: undefined
Attempts:
2 left
💡 Hint
Think about where serverCount is stored and how server actions update it.
🧠 Conceptual
expert
2:30remaining
Why must server actions be async functions in Next.js client components?
Select the best explanation for why server actions are defined as async functions when used in client components.
ABecause server actions run on the server and communicate asynchronously with the client, so they must return promises.
BBecause JavaScript requires all server-side code to be async functions.
CBecause client components cannot handle synchronous functions at all.
DBecause async functions automatically cache server responses in Next.js.
Attempts:
2 left
💡 Hint
Think about how client and server communicate in Next.js.