Updating Data
Learn how to mutate data using Server Functions.
You can update data in Next.js using React's Server Functions. This page will go through how you can create and invoke Server Functions.
What are Server Functions?
A Server Function is an asynchronous function that runs on the server. They can be called from client through a network request, which is why they must be asynchronous.
In an action
or mutation context, they are also called Server Actions.
By convention, a Server Action is an async function used with startTransition
. This happens automatically when the function is:
- Passed to a
<form>
using theaction
prop. - Passed to a
<button>
using theformAction
prop.
In Next.js, Server Actions integrate with the framework's caching architecture. When an action is invoked, Next.js can return both the updated UI and new data in a single server roundtrip.
Behind the scenes, actions use the POST
method, and only this HTTP method can invoke them.
Creating Server Functions
A Server Function can be defined by using the use server
directive. You can place the directive at the top of an asynchronous function to mark the function as a Server Function, or at the top of a separate file to mark all exports of that file.
Server Components
Server Functions can be inlined in Server Components by adding the "use server"
directive to the top of the function body:
Good to know: Server Components support progressive enhancement by default, meaning forms that call Server Actions will be submitted even if JavaScript hasn't loaded yet or is disabled.
Client Components
It's not possible to define Server Functions in Client Components. However, you can invoke them in Client Components by importing them from a file that has the "use server"
directive at the top of it:
Good to know: In Client Components, forms invoking Server Actions will queue submissions if JavaScript isn't loaded yet, and will be prioritized for hydration. After hydration, the browser does not refresh on form submission.
Passing actions as props
You can also pass an action to a Client Component as a prop:
Invoking Server Functions
There are two main ways you can invoke a Server Function:
- Forms in Server and Client Components
- Event Handlers and useEffect in Client Components
Forms
React extends the HTML <form>
element to allow Server Function to be invoked with the HTML action
prop.
When invoked in a form, the function automatically receives the FormData
object. You can extract the data using the native FormData
methods:
Event Handlers
You can invoke a Server Function in a Client Component by using event handlers such as onClick
.
Examples
Showing a pending state
While executing a Server Function, you can show a loading indicator with React's useActionState
hook. This hook returns a pending
boolean:
Revalidating
After performing an update, you can revalidate the Next.js cache and show the updated data by calling revalidatePath
or revalidateTag
within the Server Function:
Redirecting
You may want to redirect the user to a different page after performing an update. You can do this by calling redirect
within the Server Function:
Cookies
You can get
, set
, and delete
cookies inside a Server Action using the cookies
API:
useEffect
You can use the React useEffect
hook to invoke a Server Action when the component mounts or a dependency changes. This is useful for mutations that depend on global events or need to be triggered automatically. For example, onKeyDown
for app shortcuts, an intersection observer hook for infinite scrolling, or when the component mounts to update a view count: