hydrate
hydrate
memungkinkan anda menampilkan komponen React di dalam node DOM peramban yang konten HTML-nya sebelumnya telah dihasilkan oleh react-dom/server
di React 17 dan yang lebih rendah.
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 hydrate
panggilan dengan komponen akarnya.
Lihat lebih banyak contoh di bawah ini.
Parameters
-
reactNode
: Node “React” digunakan untuk me-render HTML yang sudah ada. Ini biasanya berupa potongan JSX seperti<App />
yang di-render denganReactDOM Server
metode sepertirenderToString(<App />)
di React 17. -
domNode
: Sebuah DOM element yang di-render sebagai elemen root di server. -
optional:
callback
: Sebuah fungsi. Jika diberikan, React akan memanggilnya setelah komponen anda hydrated.
Returns
hydrate
returns kosong.
Catatan
hydrate
mengharapkan konten yang di-render identik dengan konten yang di-render di server. React dapat memperbaiki perbedaan dalam konten teks, tetapi anda harus memperlakukan ketidakcocokan sebagai bug dan memperbaikinya.- Dalam mode pengembangan, React memberi peringatan tentang ketidakcocokan selama 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
hydrate
panggilan 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, menggunakan
hydrate()
tidak didukung. Gunakan render() (untuk React 17 dan lebih rendah) or createRoot() (untuk React 18+) sebaliknya.
Penggunaan
Panggil hydrate
untuk melekatkan sebuah React component menjadi server-rendered peramban DOM node.
import { hydrate } from 'react-dom';
hydrate(<App />, document.getElementById('root'));
Menggunakan hydrate()
untuk me-render aplikasi hanya di sisi klien (aplikasi tanpa HTML yang di-render oleh server) tidak didukung. Gunakan render()
(di React 17 dan lebih rendah) atau createRoot()
(di React 18+) sebaliknya.
Hydrating HTML yang di-render oleh server
Di React, “hydration” adalah bagaimana React “attaches” ke HTML yang sudah ada sebelumnya yang telah di-render oleh React di lingkungan server. Selama hydration, React akan mencoba untuk melekatkan event listener ke markup yang ada dan mengambil alih rendering aplikasi pada klien.
Pada aplikasi yang sepenuhnya dibangun dengan React, biasanya hanya akan ada satu hydrate “root”, sekali saat memulai untuk 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 use state.
Untuk informasi lebih lanjut tentang hydration, lihat dokumen untuk hydrateRoot
.
Menghilangkan kesalahan ketidakcocokan hydration 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 hydration.
Untuk menghilangkan peringatan hydration pada elemen, tambahkan suppressHydrationWarning={true}
:
export default function App() { return ( <h1 suppressHydrationWarning={true}> Tanggal Saat ini: {new Date().toLocaleDateString()} </h1> ); }
Hal ini hanya berfungsi untuk satu level kedalaman saja 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 update yang akan datang.
Mengatasi konten berbeda antara client dan server
Jika anda sengaja perlu me-render sesuatu yang berbeda di server dan klien, anda dapat melakukan rendering dua kali. Komponen yang me-render sesuatu yang berbeda pada sisi klien dapat di baca di state variable seperti isClient
, yang dapat ditetapkan ke true
dalam sebuah 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 dengan server, menghindari ketidakcocokan, tetapi ada tambahan proses synchronously setelah hydration.