hydrate
hydrate
memungkinkan Anda menampilkan komponen React di dalam simpul DOM peramban yang konten HTML-nya sebelumnya telah dihasilkan oleh react-dom/server
di React versi 17 ke bawah.
hydrate(reactNode, domNode, callback?)
Referensi
hydrate(reactNode, domNode, callback?)
Memanggil hydrate
di React 17 dan yang lebih rendah untuk “melekatkan” React ke HTML yang sudah ada sebelumnya yang dihasilkan oleh React di lingkungan server.
import { hydrate } from 'react-dom';
hydrate(reactNode, domNode);
React akan melekat pada HTML yang ada di dalam domNode
, dan mengambil alih pengelolaan DOM di dalamnya. Sebuah aplikasi yang sepenuhnya dibangun dengan React biasanya hanya akan memiliki satu pemanggilan hydrate
dengan komponen akarnya.
Lihat lebih banyak contoh di bawah ini.
Parameter
-
reactNode
: “Simpul React” yang digunakan untuk me-render HTML yang sudah ada. Ini biasanya berupa potongan JSX seperti<App />
yang di-render dengan metode (method)ReactDOM Server
sepertirenderToString(<App />)
di React 17. -
domNode
: Sebuah elemen DOM yang di-render sebagai elemen akar di server. -
opsional:
callback
: Sebuah fungsi. Jika diberikan, React akan memanggilnya setelah komponen Anda terhidrasi (hydrated).
Kembalian
hydrate
mengembalikan nilai kosong (null).
Catatan
hydrate
mengharapkan konten yang di-render identik dengan konten yang di-render di server. React dapat memperbaiki perbedaan dalam konten teks, tetapi Anda seharusnya memperlakukan ketidakcocokan tersebut sebagai bug dan memperbaikinya sendiri.- Dalam mode pengembangan, React memberi peringatan tentang ketidakcocokan selama hidrasi (hydration). Tidak ada jaminan bahwa perbedaan atribut akan diperbaiki dalam kasus ketidakcocokan. Ini penting untuk alasan kinerja karena dalam sebagian besar aplikasi, ketidakcocokan jarang terjadi, sehingga memvalidasi semua markup akan menjadi sangat mahal.
- Kemungkinan Anda hanya akan memiliki satu pemanggilan
hydrate
dalam aplikasi Anda. Jika Anda menggunakan sebuah framework, mungkin framework tersebut melakukan panggilan ini untuk Anda. - Jika aplikasi Anda di-render oleh klien tanpa HTML yang sudah di-render sebelumnya, penggunaan
hydrate()
tidak didukung. Alih-alih menggunakanhydrate()
, gunakanlah render() (untuk React 17 dan lebih rendah) atau createRoot() (untuk React 18+).
Penggunaan
Panggil hydrate
untuk melekatkan sebuah komponen React kepada simpul DOM peramban yang di-render di server.
import { hydrate } from 'react-dom';
hydrate(<App />, document.getElementById('root'));
Penggunaan hydrate()
untuk me-render aplikasi hanya di sisi klien (aplikasi tanpa HTML yang di-render oleh server) tidak didukung. Alih-alih menggunakan hydrate()
, gunakanlah render()
(di React 17 dan lebih rendah) atau createRoot()
(di React 18+).
Menghidrasi HTML yang di-render oleh server
Di React, “hidrasi” adalah bagaimana React “melekatkan” ke HTML yang sudah ada sebelumnya yang telah di-render oleh React di lingkungan server. Selama hidrasi, React akan mencoba untuk melekatkan event listeners ke markup yang ada dan mengambil alih pe-render-an aplikasi pada sisi klien.
Pada aplikasi yang sepenuhnya dibangun dengan React, biasanya Anda hanya akan menghidrasi satu “akar” (“root”), yakni sekali saat memulai menjalankan seluruh aplikasi Anda”.
import './styles.css'; import { hydrate } from 'react-dom'; import App from './App.js'; hydrate(<App />, document.getElementById('root'));
Biasanya Anda tidak perlu memanggil hydrate
lagi atau memanggilnya di tempat lain. Dari titik ini, React akan mengelola DOM dari aplikasi Anda. Untuk memperbarui UI, komponen akan menggunakan state.
Untuk informasi lebih lanjut tentang hidrasi, lihat dokumen untuk hydrateRoot
.
Menghilangkan kesalahan ketidakcocokan hidrasi yang tidak dapat dihindari
Jika satu atribut elemen atau konten teks secara tidak terhindarkan berbeda antara server dan klien (misalnya, timestamp), Anda dapat menghilangkan peringatan ketidakcocokan hidrasi.
Untuk menghilangkan peringatan hidrasi pada elemen, tambahkan suppressHydrationWarning={true}
:
export default function App() { return ( <h1 suppressHydrationWarning={true}> Tanggal Saat ini: {new Date().toLocaleDateString()} </h1> ); }
Cara ini hanya berfungsi untuk satu tingkat kedalaman dan dimaksudkan untuk menjadi jalan keluar ketika tidak ada pilihan lain. Jangan terlalu sering menggunakannya. Kecuali jika itu adalah konten teks, React masih tidak akan mencoba memperbaikinya, sehingga konten tersebut mungkin tetap tidak konsisten sampai dengan pembaruan di versi-versi mendatang.
Mengatasi konten berbeda antara client dan server
Jika Anda sengaja perlu me-render sesuatu yang berbeda di server dan klien, Anda dapat melakukan dua kali pe-render-an. Komponen yang me-render sesuatu yang berbeda pada sisi klien dapat membaca variabel state seperti isClient
, yang dapat ditetapkan ke true
dalam sebuah efek:
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 dengan server, menghindari ketidakcocokan, tetapi ada tambahan proses synchronously setelah hidrasi.