Aksi Server - This feature is available in the latest Canary

Aksi Server memungkinkan Komponen Client memanggil fungsi async yang dijalankan di server.

Catatan

Bagaimana cara membangun dukungan untuk Aksi Server?

Meskipun Aksi Server di React 19 sudah stabil dan tidak akan rusak antar versi mayor, API dasar yang digunakan untuk mengimplementasikan Aksi Server di bundler atau framework React Server Components tidak mengikuti semver dan dapat berubah antar versi minor di React 19.x.

Untuk mendukung Aksi Server sebagai bundler atau framework, kami merekomendasikan untuk mengunci ke versi React tertentu, atau menggunakan rilis Canary. Kami akan terus bekerja sama dengan bundler dan framework untuk menstabilkan API yang digunakan untuk mengimplementasikan Aksi Server di masa mendatang.

Ketika sebuah Aksi Server didefinisikan dengan direktif "use server", framework Anda akan secara otomatis membuat referensi ke fungsi server, dan meneruskan referensi tersebut ke Komponen Client. Ketika fungsi itu dipanggil di client, React akan mengirim permintaan ke server untuk mengeksekusi fungsi tersebut, dan mengembalikan hasilnya.

Aksi Server dapat dibuat di Komponen Server dan diteruskan sebagai prop ke Komponen Client, atau dapat diimpor dan digunakan di Komponen Client.

Membuat Aksi Server dari Komponen Server

Komponen Server dapat mendefinisikan Aksi Server dengan direktif "use server":

// Komponen Server
import Button from './Button';

function EmptyNote () {
async function createNoteAction() {
// Aksi Server
'use server';

await db.notes.create();
}

return <Button onClick={createNoteAction}/>;
}

Ketika React merender Komponen Server EmptyNote, ia akan membuat referensi ke fungsi createNoteAction, dan meneruskan referensi itu ke Komponen Client Button. Ketika tombol diklik, React akan mengirim permintaan ke server untuk mengeksekusi fungsi createNoteAction dengan referensi yang diberikan:

"use client";

export default function Button({onClick}) {
console.log(onClick);
// {$$typeof: Symbol.for("react.server.reference"), $$id: 'createNoteAction'}
return <button onClick={onClick}>Buat Catatan Kosong</button>
}

Untuk lebih jelasnya, lihat dokumen tentang "use server".

Mengimpor Aksi Server dari Komponen Client

Komponen Client dapat mengimpor Aksi Server dari file yang menggunakan direktif "use server":

"use server";

export async function createNoteAction() {
await db.notes.create();
}

Ketika bundler membangun Komponen Client EmptyNote, ia akan membuat referensi ke fungsi createNoteAction dalam bundle. Ketika button diklik, React akan mengirim permintaan ke server untuk mengeksekusi fungsi createNoteAction menggunakan referensi yang diberikan:

"use client";
import {createNoteAction} from './actions';

function EmptyNote() {
console.log(createNoteAction);
// {$$typeof: Symbol.for("react.server.reference"), $$id: 'createNoteAction'}
<button onClick={createNoteAction} />
}

Untuk lebih jelasnya, lihat dokumen tentang "use server".

Menggabungkan Aksi Server dengan Aksi

Aksi Server dapat digabungkan dengan Aksi di klien:

"use server";

export async function updateName(name) {
if (!name) {
return {error: 'Nama diperlukan'};
}
await db.users.updateName(name);
}
"use client";

import {updateName} from './actions';

function UpdateName() {
const [name, setName] = useState('');
const [error, setError] = useState(null);

const [isPending, startTransition] = useTransition();

const submitAction = async () => {
startTransition(async () => {
const {error} = await updateName(name);
if (!error) {
setError(error);
} else {
setName('');
}
})
}

return (
<form action={submitAction}>
<input type="text" name="name" disabled={isPending}/>
{state.error && <span>Gagal: {state.error}</span>}
</form>
)
}

Ini memungkinkan Anda mengakses status isPending dari Aksi Server dengan membungkusnya dalam Aksi di klien.

Untuk lebih jelasnya, lihat dokumen tentang Memanggil Aksi Server di luar <form>

Aksi Form dengan Aksi Server

Aksi Server bekerja dengan fitur Formulir baru di React 19.

Anda dapat meneruskan Aksi Server ke Formulir untuk secara otomatis mengirim formulir ke server:

"use client";

import {updateName} from './actions';

function UpdateName() {
return (
<form action={updateName}>
<input type="text" name="name" />
</form>
)
}

Ketika pengiriman Formulir berhasil, React secara otomatis akan mereset formulir. Anda dapat menambahkan useActionState untuk mengakses status tertunda, respons terakhir, atau untuk mendukung peningkatan progresif.

Untuk lebih jelasnya, lihat dokumen tentang Aksi Server dalam Formulir.

Aksi Server dengan useActionState

Anda dapat menggabungkan Aksi Server dengan useActionState untuk kasus umum di mana Anda hanya perlu mengakses status tertunda aksi dan respons terakhir yang dikembalikan:

"use client";

import {updateName} from './actions';

function UpdateName() {
const [state, submitAction, isPending] = useActionState(updateName, {error: null});

return (
<form action={submitAction}>
<input type="text" name="name" disabled={isPending}/>
{state.error && <span>Gagal: {state.error}</span>}
</form>
);
}

Saat menggunakan useActionState dengan Aksi Server, React juga secara otomatis akan memutar ulang pengiriman formulir yang dimasukkan sebelum hidrasi selesai. Ini berarti pengguna dapat berinteraksi dengan aplikasi Anda bahkan sebelum aplikasi terhidrasi.

Untuk lebih jelasnya, lihat dokumen tentang useActionState.

Peningkatan progresif dengan useActionState

Aksi Server juga mendukung peningkatan progresif dengan argumen ketiga dari useActionState.

"use client";

import {updateName} from './actions';

function UpdateName() {
const [, submitAction] = useActionState(updateName, null, `/name/update`);

return (
<form action={submitAction}>
...
</form>
);
}

Ketika tautan permanen disediakan ke useActionState, React akan mengalihkan ke URL yang diberikan jika formulir dikirim sebelum bundel JavaScript dimuat.

Untuk lebih jelasnya, lihat dokumen tentang useActionState.