hydrate יכול להמציא קומפוננטות React בתוך DOM צומת של דפדפן, כשהתוכן ה-HTML נוצר קודם על ידי react-dom/server ב-React 17 ומטה.
hydrate(reactNode, domNode, callback?)הפניה
hydrate(reactNode, domNode, callback?)
ב-React 17 ומטה, קראו ל-hydrate כדי “לחבר” את React ל-HTML קיים רונדר על ידי React בסביבת שרת.
import { hydrate } from 'react-dom';
hydrate(reactNode, domNode);React תתחבר ל-HTML שקיים בתוך domNode, ותיקח שליטה על ניהול ה-DOM שבתוכו. אפליקציה שבנויה לגמרי ב-React כלול בדרך כלל קריאת hydrate אחת בלבד עם קומפונטת השורש שלה.
פרמטרים
-
reactNode: “React node” ששימש לרינדור ה-HTML הקיים. בדרך כלל זו חתיכת JSX כמו<App />שרונדרה עם מתודתReactDOM ServerכמוrenderToString(<App />)ב-React 17. -
domNode: אלמנט DOM שרונדר כ-root element בשרת. -
אופציונלי:
callback: פונקציה. אם הועברה, React תקרא לה אחרי שהקומפוננטה עוברת הידרציה.
מחזירה
hydrate מחזירה null.
אזהרות
hydrateמצפה שהתוכן המרונדר יהיה זה לתוכן שרונדר בשרת. React יכולה לתקן הבדלים בתוכן טקסט, אבל צריך להתייחס לחוסר התאמות כבאגים ולתקן אותם.- במצב פיתוח, React מציגה אזרות על חוסר התאמות בזמן הידרציה. אין הבטחה שהבדלי תכונות יתוקנו במקרה של חוסר התאמה. זה חשוב לביצועים כי ברוב האפליקציות חוסר תאונות נדיר, זה מתאים מלא של כל ה-markup יהיה יקר מדי.
- סביר שתהיה לכם רק קריאת
hydrateאחת באפליקציה. אם אתם משתמשים ב-framework, אתם יכולים לבצע את הקריאה הזו בשבילכם. - אם האפליקציה שלכם מרונדרת בלקוח בלבד בלי HTML קיים, שימוש ב-
hydrate()לא נתמך. השתמשו ב-render() (עבור React 17 ומטה) או ב-createRoot() (עבור React 18+) במקום.
שימוש
קראו ל-hydrate כדי לחבר קומפונטת React לתוך DOM צומת של דפדפן שרו בשרת.
import { hydrate } from 'react-dom';
hydrate(<App />, document.getElementById('root'));שימוש ב-hydrate() לרינדור אפליקציית לקוח בלבד (אפליקציה ללא HTML מרונדר שרת) לא נתמך. השתמשו ב-render() (ב-React 17 ומטה) או ב-createRoot() (ב-React 18+) במקום.
ביצוע הידרציה ל-HTML מרונדר שרת
ב-React, “hydration” הוא האופן שבו React “מתחברת” ל-HTML קיים רונדר על ידי React בסביבת שרת. בזמן הידרציה, React תנסה לחבר מאזיני אירועים ל-markup הקיים ולקחת שליטה על רינדור האפליקציה בצד הלקוח.
באפליקציות שבנויות לגמרי עם React, בדרך כלל תבצעו הידרציה רק ל”root” אחד, פעם אחת בזמן ההפעלה לכל האפליקציה.
import './styles.css'; import { hydrate } from 'react-dom'; import App from './App.js'; hydrate(<App />, document.getElementById('root'));
בדרך כלל לא צריך לקרוא ל-hydrate שוב או במקומות נוספים. מהנקודה הזו React תנהל את ה-DOM של האפליקציה. כדי לעדכן את ה-UI, הקומפוננטות שלכם ישתמשו ב-state.
למידע נוסף על הידרציה, ראו את התיעוד של hydrateRoot.
השתקת אזהרות hydratation dismatch בלתי נמנעות
אם תכונה של אלמנט בודד או תוכן טקסט שלו שונים בהכרח בין השרת ללקוח (לאחר חותמת זמן), אפשר להשתיק את אזהרת ה-hydration mismatch.
כדי להשתיק אזהרות הידרציה על אלמנט, הוסיפו suppressHydrationWarning={true}:
export default function App() { return ( <h1 suppressHydrationWarning={true}> Current Date: {new Date().toLocaleDateString()} </h1> ); }
זה עובד לעומק של רמה אחת בלבד, ומיועד כ-escape hatch. אל תשתמשו בזה מעבר לנדרש. אלא אם מדובר בתוכן טקסט, React עדיין לא תנסה לתקן אותו, הוא יישאר לא עקבי עד עדכונים עתידיים.
טיפול בתוכן שונה בין לקוח לשרת
אם אתם צריכים בכוונה לרנדר משהו שונה בשרת ובלקוח, אפשר לבצע רינדור בשני מעברים. קומפוננטות שמרנדרות משהו שלקוח יכול לקרוא שינוי state כמו isClient, אפשר לקבוע ל-true בתוך 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> ); }
תוכן כמו בשרת וימנע חוסר התאמות, אבל מעבר נוסף יתרחש באופן סינכרוני מיד אחרי הידרציה.