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
Revalidation after mutation in Next.js
📖 Scenario: You are building a simple blog page using Next.js. The page shows a list of posts fetched from a server. When a new post is added, you want the page to update automatically by revalidating the data.
🎯 Goal: Create a Next.js page that fetches posts with getStaticProps, adds a new post using a server action, and triggers revalidation so the page updates with the new post.
📋 What You'll Learn
Create a posts array with initial posts
Add a revalidateTime variable for incremental static regeneration
Use getStaticProps to fetch posts and set revalidation time
Create a server action to add a new post and trigger revalidation
💡 Why This Matters
🌍 Real World
This pattern is used in blogs, news sites, and e-commerce where content updates need to show quickly without rebuilding the entire site.
💼 Career
Understanding revalidation after mutation is key for Next.js developers to build fast, dynamic sites with static generation benefits.
Progress0 / 4 steps
1
DATA SETUP: Create initial posts array
Create a constant array called posts with these exact objects: { id: 1, title: 'Hello World' } and { id: 2, title: 'Next.js is awesome' }.
NextJS
Hint
Use export const posts = [...] to create the array with two objects.
2
CONFIGURATION: Set revalidation time
Create a constant called revalidateTime and set it to 10 (seconds).
NextJS
Hint
Use export const revalidateTime = 10; to set the revalidation interval.
3
CORE LOGIC: Implement getStaticProps with revalidation
Write an async function called getStaticProps that returns an object with props containing posts and revalidate set to revalidateTime.
NextJS
Hint
Use export async function getStaticProps() and return the posts and revalidate time.
4
COMPLETION: Add server action to add post and revalidate
Create an async function called addPost that takes a newPost object, pushes it to posts, and calls revalidatePath('/') to update the home page.
NextJS
Hint
Import revalidatePath from next/cache, then create addPost that adds the post and calls revalidatePath('/') .
Practice
(1/5)
1. What is the main purpose of revalidation after mutation in Next.js App Router?
easy
A. To update the page data after a change so the UI shows fresh information
B. To prevent any data changes from being saved
C. To reload the entire website from scratch
D. To disable user interactions temporarily
Solution
Step 1: Understand mutation effect
When data changes (mutation), the UI might show old data if not updated.
Step 2: Purpose of revalidation
Revalidation reloads or refreshes data so the UI reflects the latest changes.
Final Answer:
To update the page data after a change so the UI shows fresh information -> Option A
Quick Check:
Revalidation updates data = A [OK]
Hint: Revalidation means refreshing data after changes [OK]
Common Mistakes:
Thinking revalidation stops data saving
Confusing revalidation with full page reload
Believing it disables user actions
2. Which Next.js App Router method is used to trigger revalidation after a mutation?
easy
A. router.replace()
B. router.reload()
C. router.push()
D. router.refresh()
Solution
Step 1: Identify method for revalidation
Next.js App Router provides router.refresh() to reload data without full page reload.
Step 2: Differentiate from other methods
router.reload() reloads whole page, router.push() and router.replace() change routes.
Final Answer:
router.refresh() -> Option D
Quick Check:
Revalidation uses router.refresh() = A [OK]
Hint: Use router.refresh() to reload data after mutation [OK]
Common Mistakes:
Using router.reload() which reloads full page
Confusing route navigation methods with revalidation
Trying to use router.replace() for data refresh
3. Given this code snippet in a Next.js component:
import { useRouter } from 'next/navigation';
export default function UpdateButton() {
const router = useRouter();
async function handleClick() {
await fetch('/api/update', { method: 'POST' });
router.refresh();
}
return Update;
}
What happens when the button is clicked?
medium
A. The API is called, then the page data refreshes without full reload
B. Nothing happens because router.refresh() is incorrect
C. The page reloads completely, losing state
D. The button click causes a navigation to /api/update
Solution
Step 1: Analyze handleClick function
It calls the API with POST, then calls router.refresh() to reload data.
Step 2: Understand router.refresh() effect
This refreshes the current route's data without a full page reload or navigation.
Final Answer:
The API is called, then the page data refreshes without full reload -> Option A
Quick Check:
API call + router.refresh() updates data = C [OK]
Hint: router.refresh() updates data without full reload [OK]
Common Mistakes:
Thinking router.refresh() reloads entire page
Assuming router.refresh() navigates to API route
Believing nothing happens due to syntax error
4. Identify the error in this Next.js code snippet that tries to revalidate after mutation:
import { useRouter } from 'next/navigation';
export default function DeleteButton() {
const router = useRouter;
async function handleDelete() {
await fetch('/api/delete', { method: 'DELETE' });
router.refresh();
}
return Delete;
}
medium
A. Button onClick should be onSubmit
B. fetch method DELETE is invalid in Next.js
C. router is not called as a function, so router.refresh() fails
D. handleDelete should not be async
Solution
Step 1: Check router initialization
Code uses const router = useRouter; missing parentheses, so router is a function reference, not the router object.
Step 2: Effect on router.refresh()
Calling router.refresh() fails because router is not an object but a function reference.
Final Answer:
router is not called as a function, so router.refresh() fails -> Option C
Quick Check:
useRouter missing () causes error = D [OK]
Hint: Always call useRouter() with parentheses [OK]
Common Mistakes:
Forgetting parentheses on useRouter()
Thinking DELETE method is invalid
Confusing onClick with onSubmit
5. You have a Next.js page showing a list of items fetched from the server. After adding a new item via a mutation API call, you want the list to update automatically. Which approach correctly ensures the list refreshes with the new data without a full page reload?
hard
A. Call router.push('/current-page') after mutation to reload the page
B. Call router.refresh() after mutation to revalidate and update data
C. Reload the browser window with window.location.reload()
D. Do nothing; the list updates automatically without any code
Solution
Step 1: Understand goal
After mutation, the UI must show updated list without full reload or navigation.
Step 2: Evaluate options
router.push('/current-page') navigates and reloads route, window.location.reload() reloads full page, and doing nothing won't update data.
Step 3: Correct method
router.refresh() triggers Next.js to revalidate data and update UI efficiently.
Final Answer:
Call router.refresh() after mutation to revalidate and update data -> Option B
Quick Check:
Use router.refresh() to update data after mutation = B [OK]
Hint: Use router.refresh() to update data without full reload [OK]
Common Mistakes:
Using router.push() causing unnecessary navigation