Menu

React 19: Fitur Baru, API yang Dihapus, dan Cara Upgrade

React 19 menambahkan Actions, useActionState, useOptimistic, use, ref sebagai prop, dan metadata dokumen, lalu 19.2 menambahkan Activity dan useEffectEvent. Lihat setiap fitur berjalan, apa saja yang dihapus, dan cara upgrade.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

React 19 adalah versi mayor React yang dirilis pada Desember 2024. Versi ini menambahkan Actions (fungsi async yang mengelola keadaan pending, error, dan form), hook useActionState, useOptimistic, dan use, ref sebagai prop biasa, serta tag <title> dan <meta> yang dipindahkan React ke head dokumen. React 19.2 (Oktober 2025) menambahkan <Activity> dan useEffectEvent.

Setiap contoh di bawah berjalan di React 19.2. Berikut sebuah Action: fungsi async yang dikirim ke form, dengan keadaan pending dan error yang dikembalikan ditangani oleh useActionState.

Tekan Save dengan field kosong untuk melihat error-nya, lalu ketik sebuah nama dan simpan: tombolnya bertuliskan "Saving..." selama 800 ms. Tidak ada useState untuk error, tidak ada flag isLoading, dan tidak ada e.preventDefault().

Actions dan form action

Di React 18, kamu menulis langkah-langkah yang sama untuk setiap form: mencegah submit default, mengatur flag loading, menunggu request dengan await, menyimpan error, lalu menghapus flag. React 19 menyebut fungsi yang melakukan pekerjaan async di dalam transition sebagai Action, dan mengurus pencatatan itu untukmu.

  • startTransition (dan useTransition) sekarang menerima fungsi async. isPending tetap true sampai seluruh fungsi selesai.
  • <form action={fn}> memanggil fn dengan FormData milik form saat form dikirim. Fungsi itu berjalan sebagai Action, dan setelah selesai, React mengatur ulang field form yang tidak terkontrol.
  • <button formAction={fn}> memberi satu tombol submit action-nya sendiri.
  • useActionState menyimpan nilai yang terakhir dikembalikan action, jadi sebuah action bisa mengembalikan pesan error atau data yang disimpan.
  • useFormStatus dari react-dom memungkinkan komponen di dalam form membaca apakah form itu sedang dikirim, tanpa mengirim props ke bawah. Hook ini butuh <form> sebagai induk, jadi di sini ia muncul di blok statis:
import { useFormStatus } from 'react-dom';

function SubmitButton() {
    const { pending } = useFormStatus();
    return <button disabled={pending}>{pending ? 'Sending...' : 'Send'}</button>;
}

useOptimistic

useOptimistic menampilkan hasil yang kamu harapkan selama sebuah Action masih berjalan, lalu kembali ke state yang sebenarnya saat Action selesai. Penghitung like bisa langsung naik saat kamu mengklik, lalu turun lagi jika request-nya gagal.

const [optimisticLikes, addOptimisticLike] = useOptimistic(likes, (current, delta) => current + delta);

Halaman useOptimistic punya contoh yang bisa dijalankan dengan API palsu yang sengaja gagal, jadi kamu bisa melihat rollback-nya.

API use

use membaca nilai dari promise atau dari context. Dengan promise, ia membuat komponen suspend sampai promise selesai, dan <Suspense> terdekat menampilkan fallback-nya selama menunggu. Berbeda dengan hook lain, use bisa dipanggil di dalam if atau loop, dan setelah early return.

React 19 juga memungkinkanmu merender <ThemeContext value="dark"> secara langsung, bukan <ThemeContext.Provider>. Keduanya muncul di contoh ini:

ref sebagai prop, dan cleanup ref

Function component sekarang menerima ref seperti prop lain. Kamu tidak perlu lagi membungkusnya dengan forwardRef untuk meneruskan ref ke elemen DOM.

Ref callback juga bisa mengembalikan fungsi cleanup. React memanggilnya saat elemen meninggalkan layar, sama seperti cleanup milik effect. Callback yang tidak mengembalikan apa pun tetap dipanggil dengan null saat elemennya dihapus, seperti di React 18.

Klik tombolnya beberapa kali lalu baca konsol: setiap penghapusan mencatat baris cleanup, setiap kemunculan kembali mencatat attached to DIV.

Metadata dokumen

Kamu bisa merender <title>, <meta>, dan <link> di mana saja di dalam komponen, dan React memindahkannya ke <head>. Komponen halaman bisa mengatur judulnya sendiri tanpa library seperti react-helmet.

Pratinjau tidak punya tab browser untuk ditampilkan, jadi effect-nya mencatat document.title sebagai gantinya. Ganti artikel, dan judul yang tercatat ikut berubah.

Stylesheet mendapat perlakuan yang sama: <link rel="stylesheet" href="..." precedence="default" /> di dalam komponen dimasukkan ke head sekali saja, sesuai urutan precedence, dan React menunggunya sebelum menampilkan konten yang membutuhkannya. <script async src="..."> yang dirender oleh beberapa komponen hanya dimuat sekali. react-dom juga mengekspor preload, preinit, preconnect, dan prefetchDNS untuk resource hint.

Activity dan useEffectEvent (React 19.2)

<Activity mode="hidden"> menyembunyikan anak-anaknya tanpa membuang state-nya. React menyembunyikan DOM-nya, menjalankan cleanup dari effect-nya, lalu memulihkan semuanya saat mode-nya kembali menjadi "visible". Cocok untuk tab dan panel yang kamu perkirakan akan dikunjungi lagi oleh pengguna.

Ketik sebuah catatan, pindah ke About, lalu kembali. Teksnya masih ada, dan konsol menunjukkan effect-nya sudah dibersihkan selama disembunyikan. Ganti wrapper <Activity> dengan {tab === 'notes' && <Notes />}, dan catatannya hilang setiap kali berpindah.

useEffectEvent mengeluarkan sebuah fungsi dari dependensi effect. Fungsi itu selalu melihat props dan state terbaru, tetapi perubahannya tidak memulai ulang effect:

function ChatRoom({ roomId, theme }) {
    const onConnected = useEffectEvent(() => {
        showNotification('Connected!', theme);
    });

    useEffect(() => {
        const connection = createConnection(roomId);
        connection.on('connected', () => onConnected());
        connection.connect();
        return () => connection.disconnect();
    }, [roomId]); // theme is not a dependency
}

19.2 juga menambahkan cacheSignal untuk Server Components (memberi tahu kapan hasil cache() tidak lagi dibutuhkan) dan Performance Tracks di panel performance Chrome DevTools. React 19.1 menambahkan captureOwnerStack, fungsi khusus development yang mengembalikan komponen mana saja yang merender komponen saat ini.

Server Components dan Server Functions

Server Components adalah komponen yang berjalan lebih dulu di server (atau saat build) dan mengirim output-nya ke browser. Komponen ini bisa async dan langsung membaca database, dan kodenya tidak pernah dikirim ke client. Server Functions (awalnya disebut Server Actions) adalah fungsi async yang ditandai dengan 'use server' dan bisa dipanggil client component seperti fungsi biasa. Keduanya butuh framework dengan bundler yang mendukungnya, seperti Next.js App Router, jadi tidak bisa dijalankan di editor ini.

// A Server Component: async, runs on the server only
export default async function Notes() {
    const notes = await db.notes.findMany();
    return notes.map((note) => <Note key={note.id} note={note} />);
}

// A Server Function, usable as a form action
async function createNote(formData) {
    'use server';
    await db.notes.create({ text: formData.get('text') });
}

API yang dihapus dan diubah

React 19 menghapus API yang sudah deprecated selama bertahun-tahun:

DihapusGantinya
ReactDOM.render, ReactDOM.hydratecreateRoot, hydrateRoot dari react-dom/client
unmountComponentAtNoderoot.unmount()
findDOMNoderef pada elemen DOM
String ref (ref="input")useRef atau ref callback
Context lawas (contextTypes, getChildContext)createContext dengan static contextType atau use
Pemeriksaan propTypes (sekarang diabaikan diam-diam)TypeScript, atau pemeriksaanmu sendiri
defaultProps pada function componentnilai default parameter
react-dom/test-utilsact dari react; React Testing Library untuk sisanya
react-test-renderer/shallowpackage react-shallow-renderer
React.createFactoryJSX

Class component tetap memiliki defaultProps. Error juga dilaporkan dengan cara berbeda: error yang ditangkap error boundary dicatat sekali dengan console.error, error yang tidak tertangkap dikirim ke window.reportError, dan createRoot menerima opsi onCaughtError dan onUncaughtError untuk melaporkannya sendiri.

Upgrade ke React 19

Upgrade ke React 18.3 dulu. Versi ini identik dengan 18.2, tetapi memberi peringatan tentang API yang deprecated dan perubahan lain yang dibutuhkan React 19, jadi kamu bisa memperbaikinya selagi aplikasi masih berjalan. React 19 juga mewajibkan JSX transform modern, yang sudah dipakai Vite dan setiap framework saat ini. Lalu install React 19:

npm install react@^19 react-dom@^19
npm install --save-dev @types/react@^19 @types/react-dom@^19

Panduan upgrade resmi menyarankan codemod untuk perubahan yang mekanis. Codemod pertama menangani string ref, import act, dan ReactDOM.render; yang kedua memperbarui kode TypeScript untuk tipe-tipe baru:

npx codemod@latest react/19/migration-recipe
npx types-react-codemod@latest preset-19 ./src

Setelah upgrade, tidak ada yang memaksamu memakai Actions atau hook baru. Komponen, hook, dan class component yang sudah ada tetap berjalan; kamu bisa memindahkan form ke <form action> satu per satu.

Pertanyaan yang sering diajukan

Kapan React 19 dirilis?

React 19 menjadi stabil pada Desember 2024. React 19.1 menyusul pada Maret 2025, dan React 19.2 pada Oktober 2025.

Apa perubahan terbesar di React 19?

Actions (fungsi async yang menangani keadaan pending, error, dan form untukmu), hook useActionState, useOptimistic, dan use, ref sebagai prop biasa, <Context> sebagai provider, serta tag <title> dan <meta> yang dipindahkan ke head dokumen. Server Components menjadi stabil untuk framework.

Apakah forwardRef sudah deprecated di React 19?

Function component sekarang bisa menerima ref sebagai prop biasa, jadi kode baru tidak butuh forwardRef. forwardRef masih berjalan, dan tim React sudah menyatakan bahwa ia akan menjadi deprecated di versi mendatang.

Apakah React 19 merusak aplikasi React 18 saya?

Sebagian besar lewat API yang dihapus: ReactDOM.render, findDOMNode, string ref, context lawas, propTypes, dan defaultProps pada function component. React 19 juga mewajibkan JSX transform modern. Upgrade ke React 18.3 dulu, perbaiki peringatan deprecation-nya, lalu jalankan codemod React 19.

Apakah saya butuh Next.js untuk memakai React 19?

Tidak. Actions, hook baru, ref sebagai prop, dan metadata semuanya berjalan di aplikasi client biasa yang dibuat dengan Vite. Server Components dan Server Functions butuh framework yang mendukungnya, seperti Next.js.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai