You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/content/reference/react-dom/client/hydrateRoot.md
+83Lines changed: 83 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -115,3 +115,86 @@ root.unmount();
115
115
* بمجرد استدعاء `root.unmount`، لا يمكنك استدعاء `root.render` مرة أخرى على نفس الجذر. ستؤدي محاولة استدعاء `root.render` على جذر غير مثبتة إلى إطلاق خطأ "Cannot update an unmounted root". ومع ذلك، يمكنك إنشاء جذر جديد لنفس عنصر DOM بعد إلغاء تثبيت الجذر السابقة لذلك العنصر.
116
116
117
117
---
118
+
119
+
## الاستخدام {/*usage*/}
120
+
121
+
### ربط HTML تم رسمه بالخادم {/*hydrating-server-rendered-html*/}
122
+
123
+
إذا تم إنشاء HTML تطبيقك بواسطة [`react-dom/server`](/reference/react-dom/client/createRoot)، فستحتاج إلى *ترطيبه* في جانب الخادم.
سيقوم هذا بترطيب HTML الخادم داخل <CodeStep step={1}>عنصر DOM المتصفح</CodeStep> باستخدام <CodeStep step={2}>مكوِّن React</CodeStep> لتطبيقك. عادةً ما تقوم بفعل ذلك مرة واحدة عند بدء التشغيل. إذا كنت تستخدم إطار عمل ما، فقد يقوم الإطار بعمل هذا الأمر بالنيابة عنك.
132
+
133
+
بهذه الطريقة، سيقوم React بـ "ربط" منطق المكوِّنات الخاصة بك بالـ HTML الأولي الذي تم إنشاؤه من الخادم. يحول الربطُ نسخة HTML الأولية من الخادم إلى تطبيق متفاعل بالكامل يعمل في المتصفح.
134
+
135
+
<Sandpack>
136
+
137
+
```html public/index.html
138
+
<!--
139
+
HTML content inside <div id="root">...</div>
140
+
was generated from App by react-dom/server.
141
+
-->
142
+
<div id="root"><h1>Hello, world!</h1><button>You clicked me <!---->0<!----> times</button></div>
143
+
```
144
+
145
+
```js index.js active
146
+
import'./styles.css';
147
+
import { hydrateRoot } from'react-dom/client';
148
+
importAppfrom'./App.js';
149
+
150
+
hydrateRoot(
151
+
document.getElementById('root'),
152
+
<App />
153
+
);
154
+
```
155
+
156
+
```js App.js
157
+
import { useState } from'react';
158
+
159
+
exportdefaultfunctionApp() {
160
+
return (
161
+
<>
162
+
<h1>Hello, world!</h1>
163
+
<Counter />
164
+
</>
165
+
);
166
+
}
167
+
168
+
functionCounter() {
169
+
const [count, setCount] =useState(0);
170
+
return (
171
+
<button onClick={() =>setCount(count +1)}>
172
+
You clicked me {count} times
173
+
</button>
174
+
);
175
+
}
176
+
```
177
+
178
+
</Sandpack>
179
+
180
+
لن تحتاج لاستدعاء `hydrateRoot` مرة أخرى في أي مكان أخر. من هذه النقطة فصاعدًا، سيقوم React بإدارة DOM لتطبيقك. لتحديث واجهة مستخدم، ستقوم المكوِّنات الخاصة بك [باستخدام الحالة](/reference/react/useState) بدلاً من ذلك.
181
+
182
+
<Pitfall>
183
+
184
+
عنصر React الذي تمرره إلى `hydrateRoot` يحتاج إلى إنتاج **نفس النتيجة** التي حققها عند الخادم.
185
+
186
+
هذا مهم لتجربة المستخدم. سيقضي المستخدم بعض الوقت في النظر إلى HTML الذي تم إنشاؤه من الخادم قبل تحميل كود JavaScript الخاص بك. يخلق الرسم من جانب الخادم وهمًا بأن التطبيق يحمل بشكل أسرع عن طريق عرض نسخة HTML المُمنتج. إظهار محتوى مختلف فجأة يكسر هذا الوهم. لهذا السبب، يجب أن يتطابق إخراج الرسم الخادم مع إخراج الرسم الأولي على العميل.
187
+
188
+
أكثر الأسباب شيوعًا التي تؤدي إلى حدوث أخطاء الربط تشمل:
189
+
190
+
* فراغ إضافي (مثل الأسطر الجديدة) حول HTML المُنتَج بواسطة React داخل العنصر الجذر.
191
+
* استخدام فحوص مثل `typeofwindow!=='undefined'` في منطق الرسم الخاص بك.
192
+
* استخدام واجهات برمجة تطبيقات معتمدة على المتصفح مثل [`window.matchMedia`](https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia) في منطق الرسم الخاص بك.
193
+
* عرض بيانات مختلفة على الخادم والعميل.
194
+
195
+
يقوم React بالتعافي من بعض أخطاء الربط، ولكن يجب عليك **إصلاحها مثل الأخطاء الأخرى**. في أفضل الحالات، ستؤدي إلى إبطاء الأداء. في أسوأ الحالات، يمكن أن تتم إضافة المعالجات إلى العناصر الخاطئة.
0 commit comments