Skip to content

Commit 9378db4

Browse files
committed
Merge branch 'main' of https://github.com/rumbustious/ar.react.dev into pr/Rumbustious/522
2 parents 9c0d5d1 + c9b943f commit 9378db4

File tree

2 files changed

+26
-25
lines changed

2 files changed

+26
-25
lines changed

src/content/learn/managing-state.md

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ body { direction: rtl; }
116116

117117
## اختيار هيكل الحالة {/*choosing-the-state-structure*/}
118118

119-
هيكلة الحالة جيدا يستطيع أن يصنع فارقا بين مكوّن قابل للإصلاح والتصحيح، وآخر يمثل مصدرا ثابتا للأخطاء. القاعدة الأكثر أهمية هي أنه لا يجب للحالة أن تحتوي على بيانات مكررة أو منسوخة. لو وجدت حالة غير ضرورية، فمن السهل نسيان تحديثها، وحدوث الأخطاء.
119+
هيكلة الحالة جيدا يمكن أن يصنع فارقا بين مكوّن قابل للإصلاح والتصحيح، وآخر يمثل مصدرا ثابتا للأخطاء. القاعدة الأكثر أهمية هي أنه لا يجب للحالة أن تحتوي على بيانات مكررة أو منسوخة. لو وجدت حالة غير ضرورية، فمن السهل نسيان تحديثها، وحدوث الأخطاء.
120120

121121
على سبيل المثال، هذا نموذج يتضمن متغير الحالة `fullName` **مكرر**:
122122

@@ -166,12 +166,13 @@ export default function Form() {
166166
```
167167

168168
```css
169+
body { direction: rtl; }
169170
label { display: block; margin-bottom: 5px; }
170171
```
171172

172173
</Sandpack>
173174

174-
يمكنك حذفه وتبسيط الكود عن طريق جمع `fullName` بينما يصيّر المكوّن:
175+
يمكنك حذفه وتبسيط الكود عن طريق جمع `fullName` بينما يُصيّر المكوّن:
175176

176177
<Sandpack>
177178

@@ -234,7 +235,7 @@ label { display: block; margin-bottom: 5px; }
234235

235236
## مشاركة الحالة بين المكونات {/*sharing-state-between-components*/}
236237

237-
أحيانا، أنت تريد الحالة ذات المكونين أن تتغير دائما مع بعضها البعض. لعمل ذلك، احذف حالة من كليهما، انقلها لأقرب مكون أب، وبعد ذلك مررها لأسفل باستخدام الخصائص (props). هذا ما يعرف بـ "رفع الحالة لمستوى أعلى (lifting state up)"، وهو واحد من أكثر الأشياء شيوعا التي ستسعملها أثناء كتابتك لكود React.
238+
أحيانا، تريد حالة مكونين أن تتغير دائما مع بعضها البعض. لعمل ذلك، احذف الحالة من كليهما، وانقلها لأقرب مكون أب مشترك، وبعد ذلك مررها لأسفل باستخدام الخصائص (props). هذا ما يعرف بـ "رفع الحالة لمستوى أعلى (lifting state up)"، وهو واحد من أكثر الأشياء شيوعا التي ستستعملها أثناء كتابتك لكود React.
238239

239240
في هذا المثال، في كل مرة يجب أن تكون قائمة واحدة فقط نشطة. لتحقيق ذلك، بدلا من حفظ الحالة النشطة داخل كل قائمة بمفردها، المكونّ الأب يحمل الحالة ويحدد الخصائص لمكوناته الأبناء.
240241

@@ -247,20 +248,20 @@ export default function Accordion() {
247248
const [activeIndex, setActiveIndex] = useState(0);
248249
return (
249250
<>
250-
<h2>Almaty, Kazakhstan</h2>
251+
<h2>ألماتي، كازاخستان</h2>
251252
<Panel
252-
title="About"
253+
title="نبذة"
253254
isActive={activeIndex === 0}
254255
onShow={() => setActiveIndex(0)}
255256
>
256-
مع تعداد سكاني يقارب 2 مليون، Almaty هي أكبر مدينة بـ Kazakhstan. منذ 1929 إلى 1997 كانت هي العاصمة.
257+
مع تعداد سكاني يقارب 2 مليون، ألماتي هي أكبر مدينة بكازاخستان. منذ 1929 إلى 1997 كانت هي العاصمة.
257258
</Panel>
258259
<Panel
259-
title="Etymology"
260+
title="أصل الكلمة"
260261
isActive={activeIndex === 1}
261262
onShow={() => setActiveIndex(1)}
262263
>
263-
الاسم مأخوذ من <span lang="kk-KZ">алма</span>، الكلمة الكازاخستانية التي تعني "تفاحة" وغالبا تترجم على أنها "مليئة بالتفاح". في الحقيقة، المنطقة المحيطة بـ Almaty تعتبر الموطن الأصلي للتفاح، والنوع البريّ <i lang="la">Malus sieversii</i> يعتبر أقرب مرشح لكونه أصل للتفاح المحلي الحديث.
264+
الاسم مأخوذ من <span lang="kk-KZ">алма</span>، الكلمة الكازاخية التي تعني "تفاحة" وغالبا تترجم على أنها "مليئة بالتفاح". في الحقيقة، المنطقة المحيطة بألماتي تعتبر الموطن الأصلي للتفاح، والنوع البريّ <i lang="la">Malus sieversii</i> يعتبر أقرب مرشح لكونه أصل للتفاح المحلي الحديث.
264265
</Panel>
265266
</>
266267
);
@@ -306,7 +307,7 @@ h3, p { margin: 5px 0px; }
306307

307308
## حفظ وإعادة تعيين الحالة {/*preserving-and-resetting-state*/}
308309

309-
عندما تعيد تصيير مكون، React تحتاج لتقرر أىّ أجزاء من الشجرة لتحفظها (وتحدثها)، وأيّ أجزاء لتلغيها أو تعيد إنشاءها من الصفر. في أغلب الحالات، التصرف التلقائي لـ React يعمل بشكل جيد كفاية. تلقائيا، React تحفظ الأجزاء من الشجرة التي "تتوافق" مع مكون الشجرة المصيّر مسبقا.
310+
عندما تعيد تصيير مكون، React تحتاج لتقرر أىّ أجزاء شجرة المكونات تحفظها (وتحدثها)، وأيّ أجزاءها تلغيها أو تعيد إنشاءها من الصفر. في أغلب الحالات، التصرف التلقائي لـ React يعمل بشكل جيد كفاية. تحفظ React تلقائيًا أجزاء الشجرة التي "تتوافق" مع مكون الشجرة المصيّر مسبقا.
310311

311312
على كل حال، أحيانا هذا ما لا تريده أنت. في تطبيق المحادثة هذا، كتابة رسالة وتغيير الطرف المستقبل لا يعيد تعيين المدخل. هذا قد يجعل المستخدم يرسل رسالة بغير قصد للشخص الخطأ.
312313

@@ -384,7 +385,7 @@ export default function Chat({ contact }) {
384385
```css
385386
body { direction: rtl; }
386387
.chat, .contact-list {
387-
float: left;
388+
float: right;
388389
margin-bottom: 20px;
389390
}
390391
ul, li {
@@ -404,7 +405,7 @@ textarea {
404405

405406
</Sandpack>
406407

407-
React تعطيك القدرة على تجاوز السلوك الافتراضي، و*الفرض* على المكون إعادة تعيين حالته عن طريق تمرير `key` مختلف لها، مثل `<Chat key={email} />`. هذا يخبر React أن الطرف المستقبل مختلف، ومن الواجب تعيين مكون `Chat` *مختلف* يكون بحاجة إلى إعادة الإنشاء من الصفر ببايانات جديدة (وواجهة مستخدم مطابقة للمدخلات). الآن الانتقال بين المستقبلين يعيد تعيين حقل الإدخال--حتى بالرغم من أنك تعيد تصيير نفس المكون.
408+
تعطيك React القدرة على تجاوز السلوك الافتراضي، و*إجبار* المكون إعادة تعيين حالته عن طريق تمرير `key` مختلف لها، مثل `<Chat key={email} />`. هذا يخبر React أن الطرف المستقبل مختلف، ومن الواجب تعيين مكون `Chat` *مختلف* يكون بحاجة إلى إعادة الإنشاء من الصفر ببايانات جديدة (وواجهة مستخدم مطابقة للمدخلات). الآن الانتقال بين المستقبلين يعيد تعيين حقل الإدخال -- حتى بالرغم من أنك تعيد تصيير نفس المكون.
408409

409410
<Sandpack>
410411

@@ -480,7 +481,7 @@ export default function Chat({ contact }) {
480481
```css
481482
body { direction: rtl; }
482483
.chat, .contact-list {
483-
float: left;
484+
float: right;
484485
margin-bottom: 20px;
485486
}
486487
ul, li {
@@ -547,7 +548,7 @@ export default function TaskApp() {
547548

548549
return (
549550
<>
550-
<h1>Prague مخطط رحلة</h1>
551+
<h1>مخطط رحلة Prague</h1>
551552
<AddTask
552553
onAddTask={handleAddTask}
553554
/>
@@ -591,7 +592,7 @@ let nextId = 3;
591592
const initialTasks = [
592593
{ id: 0, text: 'زيارة متحف Kafka', done: true },
593594
{ id: 1, text: 'مشاهدة عرض الدمى', done: false },
594-
{ id: 2, text: 'Lennon Wall صورة', done: false }
595+
{ id: 2, text: 'صورة Lennon Wall', done: false }
595596
];
596597
```
597598

@@ -706,9 +707,9 @@ ul, li { margin: 0; padding: 0; }
706707

707708
## تمرير البيانات إلى عمق باستخدام السياق (context) {/*passing-data-deeply-with-context*/}
708709

709-
عادة، سوف تقوم بتمرير معلومات من مكوّن أب إلى مكوّن ابن بواسطة الخصائص (props). لكن تمرير الخصائص قد يكون غير مجدٍ لو احتجت لتمرير بعض الخصائص خلال مكونات عديدة، أو لو أن العديد من المكونات تحتاج نفس المعلومات. السياق (context) يتيح للمكون الأب جعل بعض المعلومات متوفرة لأي مكون أدناه في الشجرة-لا يهم مقدار عمق المكون-بدون تمريرها مباشرة عن طريق الخصائص.
710+
عادة، سوف تقوم بتمرير معلومات من مكوّن أب إلى مكوّن ابن بواسطة الخصائص (props). لكن تمرير الخصائص قد يكون غير مجدٍ لو احتجت لتمرير بعض الخصائص خلال مكونات عديدة، أو لو أن العديد من المكونات تحتاج نفس المعلومات. السياق (context) يتيح للمكون الأب جعل بعض المعلومات متوفرة لأي مكون أدناه في الشجرة -لا يهم مقدار عمق المكون- بدون تمريرها مباشرة عن طريق الخصائص.
710711

711-
هنا، المكوّن `Heading` يحدد مستوى عنوانه عن طريق "سؤال" أقرب `Section` لمستواه. كل `Section` يتتبع مستواه الخاص عن طريق سؤال `Section` الأب وإضافة واحد له. كل `Section` يقوم بتوفير معلومات لجميع المكونات أدناه دون نقل الخصائص--وهذا يتم عبر السياق (context).
712+
هنا، المكوّن `Heading` يحدد مستوى عنوانه عن طريق "سؤال" أقرب `Section` لمستواه. كل `Section` يتتبع مستواه الخاص عن طريق سؤال `Section` الأب وإضافة واحد له. كل `Section` يقوم بتوفير معلومات لجميع المكونات أدناه دون نقل الخصائص -- وهذا يتم عبر السياق (context).
712713

713714
<Sandpack>
714715

@@ -809,7 +810,7 @@ body { direction: rtl; }
809810

810811
## التوسع بواسطة المخفض (reducer) و السياق (context) {/*scaling-up-with-reducer-and-context*/}
811812

812-
المخفضات (Reducers) تتيح لك تجميع منطق تحديث الحالة لمكون. السياق (Context) تتيح لك تمرير معلومات بعمق إلى أسفل لمكونات أخرى. يمكنك جمع المخفضات والسايق معا لتدير الحالة الخاصة بشاشة معقدة.
813+
المخفضات (Reducers) تتيح لك تجميع منطق تحديث الحالة لمكون. السياق (Context) يتيح لك تمرير معلومات بعمق إلى أسفل لمكونات أخرى. يمكنك جمع المخفضات والسايق معا لتدير الحالة الخاصة بشاشة معقدة.
813814

814815
مع هذا النهج، يدير المكون الأب حالة معقدة بواسطة مخفض. المكونات الأخرى في أي عمق كانت داخل الشجرة يمكن قراءة حالتها بواسطة السياق. يمكنهم أيضا إرسال الأوامر لتحديث الحالة.
815816

src/sidebarLearn.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -125,36 +125,36 @@
125125
]
126126
},
127127
{
128-
"title": "التحكم في الحالة",
128+
"title": "Managing State",
129129
"path": "/learn/managing-state",
130130
"tags": ["intermediate"],
131131
"routes": [
132132
{
133-
"title": "الاستجابة للمدخلات باستخدام الحالة",
133+
"title": "Reacting to Input with State",
134134
"path": "/learn/reacting-to-input-with-state"
135135
},
136136
{
137-
"title": "اختيار هيكل الحالة",
137+
"title": "Choosing the State Structure",
138138
"path": "/learn/choosing-the-state-structure"
139139
},
140140
{
141-
"title": "مشاركة الحالة بين المكونات",
141+
"title": "Sharing State Between Components",
142142
"path": "/learn/sharing-state-between-components"
143143
},
144144
{
145-
"title": "حفظ وإعادة تعيين الحالة",
145+
"title": "Preserving and Resetting State",
146146
"path": "/learn/preserving-and-resetting-state"
147147
},
148148
{
149-
"title": "استخلاص منطق الحالة إلى مخفض (reducer)",
149+
"title": "Extracting State Logic into a Reducer",
150150
"path": "/learn/extracting-state-logic-into-a-reducer"
151151
},
152152
{
153-
"title": "تمرير البيانات إلى عمق باستخدام السياق (context)",
153+
"title": "Passing Data Deeply with Context",
154154
"path": "/learn/passing-data-deeply-with-context"
155155
},
156156
{
157-
"title": "التوسع بواسطة المخفض (reducer) و السياق (context)",
157+
"title": "Scaling Up with Reducer and Context",
158158
"path": "/learn/scaling-up-with-reducer-and-context"
159159
}
160160
]

0 commit comments

Comments
 (0)