hydrateRoot
hydrateRoot
memungkinkan Anda menampilkan komponen React di dalam DOM node peramban yang konten HTML-nya sebelumnya dibuat oleh react-dom/server
.
const root = hydrateRoot(domNode, reactNode, options?)
Referensi
hydrateRoot(domNode, reactNode, options?)
Panggil fungsi hydrateRoot
untuk “menambahkan” React ke dalam HTML yang sudah ada yang sebelumnya di-render oleh React di dalam environment server.
import { hydrateRoot } from 'react-dom/client';
const domNode = document.getElementById('root');
const root = hydrateRoot(domNode, reactNode);
React akan ditambahkan ke dalam HTML yang ada di dalam domNode
, dan mengambil alih pengelolaan DOM didalamnya. Sebuah aplikasi yang sepenuhnya dibangun dengan React biasanya hanya akan memiliki satu pemanggilan hydrateRoot
dengan komponen root-nya.
Lihat contoh-contoh lainnya di bawah ini.
Parameter
-
domNode
: Elemen DOM yang di-render sebagai elemen akar di server. -
reactNode
: “React node” yang digunakan untuk me-render HTML yang ada. Biasanya berupa bagian dari JSX seperti<App />
yang dengan methodReactDOM Server
sepertirenderToPipeableStream(<App />)
. -
opsional
options
: Objek dengan opsi untuk akar React.- opsional
onRecoverableError
: Callback dipanggil ketika React secara otomatis pulih dari kesalahan. - opsional
identifierPrefix
: Awalan string yang digunakan React untuk ID yang dihasilkan olehuseId
. Berguna untuk menghindari konflik ketika menggunakan beberapa akar pada halaman yang sama. Harus awalan yang sama dengan yang digunakan pada server.
- opsional
Kembalian
hydrateRoot
mengembalikan objek dengan dua method: render
dan unmount
.
Catatan penting
hydrateRoot()
mengharapkan konten yang di-render identik dengan konten yang di-render server. Anda harus memperlakukan ketidakcocokan sebagai bug dan memperbaikinya.- Dalam mode pengembangan, React memperingatkan tentang ketidakcocokan selama hydration. Tidak ada jaminan bahwa perbedaan atribut akan diperbaiki jika terjadi ketidakcocokan. Hal ini penting untuk alasan performa karena pada sebagian besar aplikasi, ketidakcocokan jarang terjadi, sehingga memvalidasi semua markup akan sangat mahal.
- Anda mungkin hanya akan memiliki satu panggilan
hydrateRoot
dalam aplikasi Anda. Jika Anda menggunakan framework, framework tersebut mungkin akan melakukan pemanggilan ini untuk Anda. - Jika aplikasi Anda di-render oleh klien tanpa HTML yang telah di-render, penggunaan
hydrateRoot()
tidak disarankan. Sebaiknya gunakancreateRoot()
.
root.render(reactNode)
Panggil root.render
untuk memperbarui komponen React di dalam hydrated React root untuk elemen DOM peramban.
root.render(<App />);
React akan memperbarui <App />
di dalam hydrated root
.
Lihat contoh-contoh lainnya di bawah ini.
Parameter
reactNode
: Sebuah “React node” yang ingin Anda perbarui. Biasanya berupa bagian dari JSX seperti<App />
, tetapi Anda juga dapat mengoper elemen React yang dibangun dengancreateElement()
, sebuah string, sebuah angka,null
, atauundefined
.
Kembalian
root.render
mengembalikan undefined
.
Catatan penting
- Jika Anda memanggil
root.render
sebelum akar selesai melakukan hydrating, React akan menghapus konten HTML yang di-render oleh server dan mengalihkan seluruh akar ke render klien.
root.unmount()
Panggil root.unmount
untuk menghancurkan pohon yang di-render di dalam akar React.
root.unmount();
Aplikasi yang sepenuhnya dibangun dengan React biasanya tidak akan memiliki panggilan ke root.unmount
.
Hal ini sangat berguna jika akar React DOM node (atau salah satu dari induknya) mungkin akan dihapus dari DOM oleh kode lain. Sebagai contoh, bayangkan sebuah panel tab jQuery menghapus tab yang tidak aktif dari DOM. Jika sebuah tab dihapus, semua yang ada di dalamnya (termasuk akar React di dalamnya) akan dihapus dari DOM juga. Anda perlu memberi tahu React untuk “berhenti” mengelola akar konten yang telah dihapus dengan memanggil root.unmount
. Jika tidak, komponen-komponen di dalam akar yang dihapus tidak akan dibersihkan dan membebaskan sumber daya seperti langganan.
Memanggil root.unmount
akan melepas semua komponen di root dan “melepaskan” React dari akar DOM node, termasuk menghapus semua event handler atau state di dalam pohon.
Parameter
root.unmount
tidak menerima parameter apa pun.
Kembalian
root.unmount
mengembalikan undefined
.
Catatan penting
-
Memanggil
root.unmount
akan melepas semua komponen di dalam pohon dan “melepaskan” React dari akar DOM node. -
Setelah Anda memanggil
root.unmount
Anda tidak dapat memanggilroot.render
lagi pada akar. Mencoba memanggilroot.render
pada akar yang tidak terpasang akan menimbulkan kesalahan berupa “Cannot update an unmounted root”.
Penggunaan
Meng-hydrate server yang di-render di HTML
Jika HTML aplikasi Anda dibuat oleh react-dom/server
, Anda perlu melakukan hydrate kepada klien.
import { hydrateRoot } from 'react-dom/client';
hydrateRoot(document.getElementById('root'), <App />);
Ini akan meng-hydrate server HTML di dalam peramban DOM node dengan komponen React untuk aplikasi Anda. Biasanya, Anda akan melakukannya sekali pada saat dijalankan. Jika Anda menggunakan framework, framework tersebut mungkin akan melakukan hal ini di belakang layar untuk Anda.
Untuk meng-hydrate aplikasi Anda, React akan “menambahkan” logika komponen Anda ke HTML yang dihasilkan dari server. Hydration mengubah gambaran HTML awal dari server menjadi aplikasi yang sepenuhnya interaktif yang berjalan di peramban.
import './styles.css'; import { hydrateRoot } from 'react-dom/client'; import App from './App.js'; hydrateRoot( document.getElementById('root'), <App /> );
Anda seharusnya tidak perlu memanggil hydrateRoot
lagi atau memanggilnya di banyak tempat. Mulai saat ini, React akan mengelola DOM aplikasi Anda. Untuk memperbarui UI, komponen Anda akan menggunakan state sebagai gantinya.
Meng-hydrate seluruh dokumen
Aplikasi yang sepenuhnya dibangun dengan React dapat me-render seluruh dokumen sebagai JSX, termasuk tag <html>
:
function App() {
return (
<html>
<head>
<meta charSet="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="/styles.css"></link>
<title>My app</title>
</head>
<body>
<Router />
</body>
</html>
);
}
Untuk meng-hydrate seluruh dokumen, berikan document
bersifat global sebagai argumen pertama ke hydrateRoot
:
import { hydrateRoot } from 'react-dom/client';
import App from './App.js';
hydrateRoot(document, <App />);
Menekan kesalahan ketidakcocokan hydration yang tidak dapat dihindari
Jika atribut atau konten teks dari satu elemen tidak dapat dihindari berbeda antara server dan klien (misalnya, timestamp), Anda dapat membungkam peringatan ketidakcocokan hydration.
Untuk membungkam peringatan hydration pada sebuah elemen, tambahkan suppressHydrationWarning={true}
:
export default function App() { return ( <h1 suppressHydrationWarning={true}> Tanggal Sekarang: {new Date().toLocaleDateString()} </h1> ); }
Ini hanya berfungsi satu tingkat, dan dimaksudkan sebagai jalan keluar. Jangan terlalu sering menggunakannya. Kecuali jika itu adalah konten teks, React masih belum mencoba untuk memperbaikinya, sehingga mungkin tetap tidak konsisten hingga pembaruan di masa mendatang.
Menangani konten klien dan server yang berbeda
Jika Anda secara sengaja ingin me-render sesuatu yang berbeda di server dan klien, Anda dapat melakukan rendering dua kali. Komponen yang me-render sesuatu yang berbeda di klien dapat membaca variabel state seperti isClient
, yang dapat Anda setel menjadi true
di dalam Effect:
import { useState, useEffect } from "react"; export default function App() { const [isClient, setIsClient] = useState(false); useEffect(() => { setIsClient(true); }, []); return ( <h1> {isClient ? 'Is Client' : 'Is Server'} </h1> ); }
Dengan cara ini proses render awal akan me-render konten yang sama seperti server, sehingga menghindari ketidakcocokan, tetapi proses tambahan akan terjadi secara serempak setelah hydration.
Memperbarui hydrated root component
Setelah root telah selesai melakukan proses hydrating, Anda dapat memanggil root.render
untuk memperbarui komponen root React. Tidak seperti pada createRoot
, Anda biasanya tidak perlu melakukan hal ini karena konten awal telah di-render sebagai HTML.
Jika Anda memanggil root.render
pada suatu saat setelah hydration, dan struktur pohon komponen sesuai dengan apa yang sebelumnya di-render, React akan mempertahankan state. Perhatikan bagaimana Anda dapat mengetikkan input, dimana pembaruan dari pemanggilan render
diulang-ulang setiap detik pada contoh ini tidak bersifat destruktif:
import { hydrateRoot } from 'react-dom/client'; import './styles.css'; import App from './App.js'; const root = hydrateRoot( document.getElementById('root'), <App counter={0} /> ); let i = 0; setInterval(() => { root.render(<App counter={i} />); i++; }, 1000);
Tidak lazim untuk memanggil root.render
pada hydrated root. Biasanya, Anda akan memperbarui state di dalam salah satu komponen sebagai gantinya.