Skip to content

Commit faed786

Browse files
committed
fixing typos & rephrasing
1 parent 655eaf6 commit faed786

File tree

1 file changed

+26
-26
lines changed

1 file changed

+26
-26
lines changed

src/content/learn/keeping-components-pure.md

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ title: الحفاظ على نقاء المكوّنات
44

55
<Intro>
66

7-
بعض دوال JavaScript *نقية.* الدوال النقية (pure functions) تقوم فقط بإجراء حساب ولا شيء اكثر. من خلال كتابة مكوّناتك (components) بصرامة كدوال نقية، يمكنك تجنب صنف كامل من الأخطاء (bugs) المحيرة والسلوك غير المتوقع مع نمو قاعدة التعليمات البرمجية (codebase) الخاصة بك. للحصول على هذه الفوائد، هناك بعض القواعد التي يجب عليك اتباعها.
7+
بعض دوال JavaScript *نقية.* الدوال النقية تقوم فقط بإجراء حساب ولا شيء اكثر. من خلال كتابة مكوّناتك بصرامة كدوال نقية، يمكنك تجنب صنف كامل من الأخطاء المحيرة والسلوك غير المتوقع مع نمو قاعدة التعليمات البرمجية الخاصة بك. للحصول على هذه الفوائد، هناك بعض القواعد التي يجب عليك اتباعها.
88

99

1010
</Intro>
@@ -22,7 +22,7 @@ title: الحفاظ على نقاء المكوّنات
2222
في علم الحاسب (وخاصة عالم البرمجة الوظيفية (functional programming)), [الدالة النقية](https://wikipedia.org/wiki/Pure_function) هي دالة بالخواص التالية:
2323

2424
* **تهتم بشؤونها.** لا تغير أي كائنات أو متغيرات كانت موجودة قبل استدعائها.
25-
* **نفس الدخل، نفس الخرج** بإعطاء نفس المدخلات ، يجب أن تُرجع الدالة النقية نفس النتيجة دائمًا.
25+
* **نفس المدخلات تؤدي لنفس المخرجات** بإعطاء نفس المدخلات ، يجب أن تُرجع الدالة النقية نفس النتيجة دائمًا.
2626

2727
قد تكون بالفعل على دراية بمثال واحد من الوظائف النقية: المعادلات في الرياضيات.
2828

@@ -69,7 +69,7 @@ export default function App() {
6969
<h1>وصفة شاي متبل</h1>
7070
<h2>لاثنين</h2>
7171
<Recipe drinkers={2} />
72-
<h2>لتجمًع</h2>
72+
<h2>لتجمّع</h2>
7373
<Recipe drinkers={4} />
7474
</section>
7575
);
@@ -78,13 +78,13 @@ export default function App() {
7878

7979
</Sandpack>
8080

81-
عند تمرير `drinkers={2}` إلى `Recipe`, ستعيد JSX تحتوي على `2 cups of water`. دائمًا.
81+
عند تمرير `drinkers={2}` إلى `Recipe`, ستعيد JSX تحتوي على `2 اكواب من الماء`. دائمًا.
8282

83-
إذا قمت بتمرير `drinkers={4}`, ستعيد JSX تحتوي على `4 cups of water`. دائمًا.
83+
إذا قمت بتمرير `drinkers={4}`, ستعيد JSX تحتوي على `4 اكواب من الماء`. دائمًا.
8484

8585
تمامًا مثل الصيغ الرياضية.
8686

87-
يمكنك التفكير في المكوّنات الخاصة بك كوصفات: إذا اتبعتها ولم تقم بإدخال مكوّنات جديدة أثناء عملية الطهي، ستحصل على نفس الطبق في كل مرة. هذا "الطبق" هو ال JSX الذي يقدمه المكوّن لReact لل[تصيير.](/learn/render-and-commit)
87+
يمكنك التفكير في المكوّنات الخاصة بك كوصفات: إذا اتبعتها ولم تقم بإدخال مكوّنات جديدة أثناء عملية الطهي، ستحصل على نفس الطبق في كل مرة. هذا "الطبق" هو ال JSX الذي يقدمه المكوّن لReact [للتصيير.](/learn/render-and-commit)
8888

8989
<Illustration src="/images/docs/illustrations/i_puritea-recipe.png" alt="A tea recipe for x people: take x cups of water, add x spoons of tea and 0.5x spoons of spices, and 0.5x cups of milk" />
9090

@@ -94,7 +94,7 @@ export default function App() {
9494

9595

9696

97-
فيما يلي مكوّن يخالف هذا القاعدة:
97+
فيما يلي مكوّن يخالف هذه القاعدة:
9898

9999
<Sandpack>
100100

@@ -120,7 +120,7 @@ export default function TeaSet() {
120120

121121
</Sandpack>
122122

123-
يقوم هذا المكوّن بقراءة وكتابة متغير `guest` المعلن خارجه. هذا يعني أن **استدعاء هذا المكوّن مرات متعددة سينتج** وما هو أكثر من ذلك ، إذا قرأت المكوّنات الأخرى `guest`, سوف تنتج JSX مختلف , أيضًا ، اعتمادًا على متى تم تصييرها! وهذا لا يمكن توقعه
123+
يقوم هذا المكوّن بقراءة وكتابة متغير `guest` المعلن خارجه. هذا يعني أن **استدعاء هذا المكوّن مرات متعددة سينتج JSX مختلف** بل وأكثر من ذلك ، إذا قرأت المكوّنات الأخرى `guest`, سوف تنتج JSX مختلف , أيضًا ، اعتمادًا على متى تم تصييرها! وهذا لا يمكن توقعه
124124

125125
نعود إلى صيغتنا السابقة <Math><MathI>y</MathI> = 2<MathI>x</MathI></Math>, الآن حتى إذا كان <Math><MathI>x</MathI> = 2</Math>, لا يمكننا الاعتماد على أن <Math><MathI>y</MathI> = 4</Math>. قد تفشل اختباراتنا ، وقد يكون, المستخدمون مشوشين, وقد تسقط الطائرات من السماء - يمكنك رؤية كيف يمكن أن يؤدي ذلك إلى خلل مربك!
126126

@@ -160,17 +160,17 @@ export default function TeaSet() {
160160

161161
React يوفر "وضعًا صارمًا"(Strict Mode) يقوم فيه باستدعاء دالة كل مكوّن مرتين أثناء التطوير. **من خلال استدعاء وظائف المكوّن مرتين، يساعد الوضع الصارم في العثور على المكوّنات التي تخالف هذه القواعد.**
162162

163-
لاحظ كيف عرض المثال الأصلي "Guest #2", "Guest #4", و "Guest #6" بدلاً من "Guest #1", "Guest #2", و "Guest #3". كانت الدالة الأصلية غير نقية، لذا تعطلت عند استدعاؤها مرتين. ولكن الإصدار النقي المُصلح يعمل حتى إذا تم استدعاء الوظيفة مرتين. **الدوال النقية تقوم بالحساب فقط، لذلك لن يتغير أي شيء عند استدعائها مرتين**--تمامًا مثل استدعاء `double(2)` مرتين لن يتغير ما يتم إرجاعه، وحل <Math><MathI>y</MathI> = 2<MathI>x</MathI></Math> مرتين لن يغير ما هو <MathI>y</MathI>. نفس المدخلات، نفس المخرجات. دائمًا.
163+
لاحظ كيف عرض المثال الأصلي "Guest #2", "Guest #4", و "Guest #6" بدلاً من "Guest #1", "Guest #2", و "Guest #3". كانت الدالة الأصلية غير نقية، لذا تعطلت عند استدعاءها مرتين. ولكن الإصدار النقي المُصلح يعمل حتى إذا تم استدعاء الوظيفة مرتين. **الدوال النقية تقوم بالحساب فقط، لذلك لن يتغير أي شيء عند استدعائها مرتين**--تمامًا مثل استدعاء `double(2)` مرتين لن يتغير ما يتم إرجاعه، وحل <Math><MathI>y</MathI> = 2<MathI>x</MathI></Math> مرتين لن يغير ما هو <MathI>y</MathI>. نفس المدخلات، نفس المخرجات. دائمًا.
164164

165-
الوضع الصارم لا يؤثر في الإنتاج، لذلك لن يبطئ التطبيق لمستخدمينك. يمكنك الانضمام إلى الوضع الصارم, عن طريق تغليف عنصر الجذر(root component) الخاص بك في `<React.StrictMode>`. تفعل بعض الإطارات ذلك افتراضيًا.
165+
الوضع الصارم لا يؤثر في الإنتاج، لذلك لن يبطئ التطبيق لمستخدمينك. يمكنك الانضمام إلى الوضع الصارم, عن طريق تغليف المكّون الجذر(root component) الخاص بك في `<React.StrictMode>`. تفعل بعض الإطارات ذلك افتراضيًا.
166166

167167
</DeepDive>
168168

169169
### التغيير المحلي: سر صغير لمكوّناتك {/*local-mutation-your-components-little-secret*/}
170170

171-
في المثال أعلاه، كان المشكلة في أن المكوّن قام بتغيير متغير *موجود مسبقًا* أثناء التصيير. يُطلق عليها في كثير من الأحيان **"طفرة"** لجعلها تبدو أكثر رعبًا. الدوال النقية لا تغيّر المتغيرات خارج نطاق الدالة أو الكائنات التي تم إنشاؤها قبل الاستدعاء - هذا يجعلها غير نقية!
171+
في المثال أعلاه، كانت المشكلة في أن المكوّن قام بتغيير متغير *موجود مسبقًا* أثناء التصيير. يُطلق عليها في كثير من الأحيان **"طفرة"** لجعلها تبدو أكثر رعبًا. الدوال النقية لا تغيّر المتغيرات خارج نطاق الدالة أو الكائنات التي تم إنشاؤها قبل الاستدعاء - هذا يجعلها غير نقية!
172172

173-
ومع ذلك, **فمن المسموح تمامًا بتغيير المتغيرات والكائنات التي قمت بإنشائها *فقط* خلال العرض** في هذا المثال, قم بإنشاء `[]` مصفوفة, وعيينها إلى متغير `cups`, ثم `ادفع(push)` اثني عشر كوبًا فيها:
173+
ومع ذلك, **فمن المسموح تمامًا بتغيير المتغيرات والكائنات التي قمت بإنشائها *فقط* خلال التصيير** في هذا المثال, قم بإنشاء `[]` مصفوفة, وعيينها إلى متغير `cups`, ثم ادفع `(push)` اثني عشر كوبًا فيها:
174174

175175
<Sandpack>
176176

@@ -190,43 +190,43 @@ export default function TeaGathering() {
190190

191191
</Sandpack>
192192

193-
إذا تم إنشاء متغير `cups` او `[]` مصفوفة خارج دالة `TeaGathering` فسيكون هذا مشكلة كبيرة! ستقوم بتغيير كائن *موجود مسبقًا* عن طريق دفع العناصر في تلك المصفوفة.
193+
إذا تم إنشاء متغير `cups` او `[]` مصفوفة خارج دالة `TeaGathering` فستكون هذه مشكلة كبيرة! ستقوم بتغيير كائن *موجود مسبقًا* عند دفع العناصر في تلك المصفوفة.
194194

195-
ومع ذلك, فإنه يعد أمرًا صحيحًا لأنك قمت بإنشائهم *خلال نفس العرض*, داخل `TeaGathering`. لن يعرف أي كود خارج `TeaGathering` بدًا أن هذا حدث. يُطلق عليه **"تغيير المحلي"**—هو مثل سر صغير لمكوّناتك.
195+
ومع ذلك, فإنه يعد أمرًا صحيحًا لأنك قمت بإنشائهم *خلال نفس التصيير*, داخل `TeaGathering`. لن يعرف أي كود خارج `TeaGathering` ابدًا أن هذا حدث. يُطلق عليه **"تغيير المحلي"**—هو مثل سر صغير لمكوّناتك.
196196

197197
## المكان الذي يمكنك فيه التسبب بآثار جانبية {/*where-you-_can_-cause-side-effects*/}
198198

199-
على الرغم من أن البرمجة الوظيفية تعتمد بشدة على النقاء, إلا أنه في نقطة ما، في, مكان ما،يجب أن يتغير _شيء_. هذه هي نقطة البرمجة! هذه التغييرات - تحديث الشاشة، بدء الرسوم المتحركة، تغيير البيانات - تسمى **الآثار الجانبية** إنها أشياء تحدث _"على الجانب"_, وليست خلال التصيير.
199+
على الرغم من أن البرمجة الوظيفية تعتمد بشدة على النقاء، إلا أنه في نقطة ما، في مكان ما ،يجب أن يتغير _شيء_. هذه هي النقطة من البرمجة! هذه التغييرات - تحديث الشاشة، بدء الرسوم المتحركة، تغيير البيانات - تسمى **الآثار الجانبية** إنها أشياء تحدث _"على الجانب"_, وليس خلال التصيير.
200200

201-
في React, **تنتمي الآثار الجانبية عادةً داخل [معالجات الأحداث(event handlers).](/learn/responding-to-events)** معالجات الأحداث هي الدوال التي يقوم React بتشغيلها عندما تقوم بإجراء بعض الإجراءات—على سبيل المثال، عند النقر فوق زر. على الرغم من أن معالجات الأحداث تم تعريفها *داخل* المكوّن الخاص بك، إلا أنها لا تعمل *خلال* التصيير! **لذلك، فإن معالجات الأحداث لا تحتاج إلى أن تكون نقية.**
201+
في React, **تنتمي الآثار الجانبية عادةً داخل [معالجات الأحداث(event handlers).](/learn/responding-to-events)** معالجات الأحداث هي الدوال التي يقوم React بتشغيلها عندما تقوم بإجراء بعض الإجراءات—على سبيل المثال، عند النقر فوق زر. على الرغم من أن معالجات الأحداث يتم تعريفها *داخل* المكوّن الخاص بك، إلا أنها لا تعمل *خلال* التصيير! **لذلك، فإن معالجات الأحداث لا يجب أن تكون نقية.**
202202

203-
إذا استنفذت كل الخيارات الأخرى ولم تتمكن من العثور على معالج الأحداث المناسب لآثار جانبية، فيمكنك تثبيتها على JSX المُرجَع الخاص بك باستدعاء[`useEffect`](/reference/react/useEffect) في مكوّنك. يخبر هذا React بتنفيذها لاحقًا، بعد التصيير، عندما يسمح بالآثار الجانبية. **ومع ذلك، يجب أن يكون هذا النهج هو خيارك الأخير.**
203+
إذا استنفذت كل الخيارات الأخرى ولم تتمكن من العثور على معالج أحداث مناسب للآثار الجانبية، فيمكنك ربطها على JSX المُرجَع الخاص بك باستدعاء[`useEffect`](/reference/react/useEffect) في مكوّنك. يخبر هذا React بتنفيذها لاحقًا، بعد التصيير، عندما يسمح بالآثار الجانبية. **ومع ذلك، يجب أن يكون هذا النهج هو خيارك الأخير.**
204204

205-
عندما يكون ذلك ممكنًا، حاول التعبير عن منطقك فقط من خلال التصرير. ستتفاجأ الى اي مدى يمكن لهذاأن يأخذك!
205+
عندما يكون ذلك ممكنًا، حاول التعبير عن منطقك فقط من خلال التصرير. ستتفاجأ الى اي مدى يمكن لهذا أن يأخذك!
206206

207207
<DeepDive>
208208

209209
#### لماذا يهتم React بالنقاء؟ {/*why-does-react-care-about-purity*/}
210210

211-
يتطلب كتابة الدوال النقية بعض العادات والانضباط. ولكنه يفتح أيضًا فرصًا رائعة
211+
يتطلب كتابة الدوال النقية بعض العادات والانضباط. ولكنه يفتح أيضًا فرصًا رائعة:
212212

213213
* يمكن لمكوّناتك أن تعمل في بيئة مختلفة - على سبيل المثال، على الخادم! نظرًا لأنها تعيد نفس النتيجة لنفس المدخلات، يمكن لمكوّن واحد أن يخدم العديد من طلبات المستخدم.
214-
* يمكنك تحسين الأداء من خلال [تخطي تصيير](/reference/react/memo) المكوّنات التي لم تتغير مدخلاتها. هذا آمن لأن الدوال النقية تعيد نفس النتائج دائمًا، لذلك فهي آمنة للتخزين المؤقت.
214+
* يمكنك تحسين الأداء من خلال [تخطي تصيير](/reference/react/memo) المكوّنات التي لم تتغير مدخلاتها. هذا آمن لأن الدوال النقية تعيد نفس النتائج دائمًا، لذلك فهي آمنة للتخزين المؤقت (cashe).
215215
* إذا تغيرت بعض البيانات في منتصف تصيير شجرة مكوّنات عميقة، يمكن لـReact إعادة بدء التصيير دون إضاعة الوقت لإنهاء التصيير القديم. يجعل النقاء من الآمن التوقف عن الحساب في أي وقت.
216216

217-
كل الميزات الجديدة التي نقوم ببنائها في React تستفيد من النقاء. من جلب البيانات إلى الرسوم المتحركة إلى الأداء، يفتح الحفاظ على المكوّنات نقية قوة نمط React.
217+
كل الميزات الجديدة التي نقوم ببنائها في React تستفيد من النقاء. من جلب البيانات إلى الرسوم المتحركة إلى الأداء، الحفاظ على المكوّنات نقية يطلق العنان لقوة نموذج React.
218218

219219
</DeepDive>
220220

221221
<Recap>
222222

223223
* يجب أن يكون المكوّن نقيًا، مما يعني:
224224
* **يهتم بأمره الخاص.** لا يجب أن يغير أي كائنات أو متغيرات كانت موجودة قبل التصيير.
225-
* **نفس المدخلات، نفس المخرجات.** باعطاء نفس المدخلات، يجب على المكوّن أن يعيد دائمًا نفس JSX.
225+
* **نفس المدخلات تؤدي لنفس المخرجات.** باعطاء نفس المدخلات، يجب على المكوّن أن يعيد دائمًا نفس JSX.
226226
* يمكن أن يحدث التصيير في أي وقت ، لذلك لا يجب أن تعتمد المكوّنات على تسلسل التصيير لبعضها البعض.
227227
* لا يجب تغيير أي من المدخلات التي تستخدمها المكوّنات الخاصة بك للتصيير. ويشمل ذلك الخصائص والحالة والسياق. لتحديث الشاشة ، استخدم, ["set" state](/learn/state-a-components-memory) بدلاً من تغيير الكائنات الموجودة مسبقًا.
228-
* يجب السعي للتعبير عن منطق المكوّن في JSX الذي تعيده. عندما تحتاج إلى "تغيير الأشياء" ، عادةً ما تريد القيام بذلك في معالج الحدث(event listener). كخيار أخير ، يمكنك استخدام `useEffect`.
229-
* يتطلب كتابة الدوال النقية بعض الممارسة ، ولكنه يفتح باب قوة نمط React.
228+
* يجب ان تسعى للتعبير عن منطق المكوّن في الJSX الذي تعيده. عندما تحتاج إلى "تغيير الأشياء" ، عادةً ما تريد القيام بذلك في معالج الحدث(event listener). كخيار أخير ، يمكنك استخدام `useEffect`.
229+
* يتطلب كتابة الدوال النقية بعض الممارسة ، ولكنه يطلق العنان لقوة نموذج React.
230230

231231
</Recap>
232232

@@ -580,7 +580,7 @@ h1 { margin: 5px; font-size: 18px; }
580580

581581
</Solution>
582582

583-
#### إصلاح صينية القصص المعطوبة {/*fix-a-broken-story-tray*/}
583+
#### أصلح علبة قصة مكسورة {/*fix-a-broken-story-tray*/}
584584

585585
يطلب منك الرئيس التنفيذي لشركتك إضافة "قصص" إلى تطبيق الساعة الخاص بك على الإنترنت ، ولا يمكنك الرفض. لقد كتبت مكوّن `StoryTray` الذي يقبل قائمة من القصص `stories` ، تليها "إنشاء قصة" العنصر النائب.
586586

@@ -768,7 +768,7 @@ li {
768768

769769
</Sandpack>
770770

771-
بديلًا عن ذلك ، يمكنك إنشاء مصفوفة _جديدة_ (عن طريق نسخ الحالية) قبل دفع عنصر فيها:
771+
بدلًا عن ذلك ، يمكنك إنشاء مصفوفة _جديدة_ (عن طريق نسخ الحالية) قبل دفع عنصر فيها:
772772

773773
<Sandpack>
774774

0 commit comments

Comments
 (0)