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: content/docs/hooks-rules.md
+43-43Lines changed: 43 additions & 43 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,33 +6,33 @@ next: hooks-custom.html
6
6
prev: hooks-effect.html
7
7
---
8
8
9
-
*Hooks* are a new addition in React 16.8. They let you use state and other React features without writing a class.
9
+
*الخطافات* هي إضافة جديدة إلى الإصدار 16.8 في React، إذ تسمح لك باستعمال ميزة الحالة وميزات React الأخرى دون كتابة أي صنف:
10
10
11
-
Hooks are JavaScript functions, but you need to follow two rules when using them. We provide a [linter plugin](https://www.npmjs.com/package/eslint-plugin-react-hooks)to enforce these rules automatically:
11
+
الخطافات هي دوال JavaScript، ولكن تحتاج إلى اتباع قاعدتين عند استعمالها. نوفر [إضافة تصحيح أخطاء الصياغة](https://www.npmjs.com/package/eslint-plugin-react-hooks)تجبرك على تطبيق هاتين القاعدتين تلقائيًّا.
12
12
13
-
### Only Call Hooks at the Top Level {#only-call-hooks-at-the-top-level}
13
+
### استدعي الخطافات في المستوى الأعلى فقط {#only-call-hooks-at-the-top-level}
14
14
15
-
**Don't call Hooks inside loops, conditions, or nested functions.**Instead, always use Hooks at the top level of your React function. By following this rule, you ensure that Hooks are called in the same order each time a component renders. That's what allows React to correctly preserve the state of Hooks between multiple `useState`and`useEffect`calls. (If you're curious, we'll explain this in depth [below](#explanation).)
15
+
**لا تستدعي الخطافات داخل حلقات التكرار، أو التعابير الشرطية، أو الدوال المتعشبة.**بدلًا من ذلك، استعمل الخطافات دومًا في المستوى الأعلى (top level) من دالة React. بتطبيق هذه القاعدة، تتأكد من أن الخطافات تُستدَعى بالترتيب نفسه في كل مرة يصيَّر فيها مكونٌ. هذا يسمح لـ React بحفظ حالة الخطافات بين الاستدعاءات `useState`و`useEffect`المتعددة بشكل صحيح. (إن شدَّك فضولك للتعلم أكثر، سنشرح هذا الأمر بالتفصيل في [الأسفل](#explanation).)
16
16
17
-
### Only Call Hooks from React Functions {#only-call-hooks-from-react-functions}
17
+
### استدعي الخطافات من دوال React فقط {#only-call-hooks-from-react-functions}
18
18
19
-
**Don't call Hooks from regular JavaScript functions.**Instead, you can:
19
+
**لا تستدعي الخطافات من دوال JavaScript العادية.**بدلًا من ذلك، يمكنك:
20
20
21
-
* ✅ Call Hooks from React function components.
22
-
* ✅ Call Hooks from custom Hooks (we'll learn about them [on the next page](/docs/hooks-custom.html)).
21
+
* ✅ استدعاء الخطافات من مكونات دالة React.
22
+
* ✅ استدعاء الخطافات من خطافات مخصصة (سنتعرف عليهم في [الصفحة التالية](/docs/hooks-custom.html)).
23
23
24
-
By following this rule, you ensure that all stateful logic in a component is clearly visible from its source code.
24
+
باتباع هذه القاعدة، تتأكد من أنَّ الشيفرة ذات الحالة (stateful logic) في مكونٍ ما مرئيةٌ بوضوح من شيفرتها المصدرية.
25
25
26
-
## ESLint Plugin {#eslint-plugin}
26
+
## الإضافة ESLint {#eslint-plugin}
27
27
28
-
We released an ESLint plugin called [`eslint-plugin-react-hooks`](https://www.npmjs.com/package/eslint-plugin-react-hooks)that enforces these two rules. You can add this plugin to your project if you'd like to try it:
28
+
أطلقنا إضافةً لتصحيح الأخطاء تدعى [`eslint-plugin-react-hooks`](https://www.npmjs.com/package/eslint-plugin-react-hooks)تجبر على تطبيق هاتين القاعدتين. يمكنك إضافة هذه الإضافة إلى مشروعك إن أحببت تجريبها:
In the future, we intend to include this plugin by default into Create React App and similar toolkits.
48
+
في المستقبل، ننوي تضمين هذه الإضافة افتراضيًّا عند بناء تطبيقات جديدة باستعمال الأمر into Create React App أو أية مجموعة أدوات أخرى (toolkits).
49
49
50
-
**You can skip to the next page explaining how to write [your own Hooks](/docs/hooks-custom.html)now.**On this page, we'll continue by explaining the reasoning behind these rules.
50
+
**يمكنك تخطي بقية هذه الصفحة إلى الصفحة التالية: [بناء خطافات خاصة بك](/docs/hooks-custom.html)الآن.**إذ سنكمل شرح سبب وجود هاتين القاعدتين.
51
51
52
-
## Explanation {#explanation}
52
+
## الشرح {#explanation}
53
53
54
-
As we [learned earlier](/docs/hooks-state.html#tip-using-multiple-state-variables), we can use multiple State or Effect Hooks in a single component:
54
+
كما [تعلمنا سابقًا](/docs/hooks-state.html#tip-using-multiple-state-variables), يمكننا استعمال خطافات حالة أو تأثير متعددة في مكون واحد:
55
55
56
56
```js
57
57
functionForm() {
58
-
// 1. Use the name state variable
58
+
// 1. نفسه name استعمال متغير الحالة
59
59
const [name, setName] =useState('Mary');
60
60
61
-
// 2. Use an effect for persisting the form
61
+
// 2. استعمال تأثير من أجل استمرار النموذج
62
62
useEffect(functionpersistForm() {
63
63
localStorage.setItem('formData', name);
64
64
});
65
65
66
-
// 3. Use the surname state variable
66
+
// 3. surname استعمال متغير الحالة
67
67
const [surname, setSurname] =useState('Poppins');
68
68
69
-
// 4. Use an effect for updating the title
69
+
// 4. استعمال تأثير من أجل تحديث العنوان
70
70
useEffect(functionupdateTitle() {
71
71
document.title= name +''+ surname;
72
72
});
@@ -75,29 +75,29 @@ function Form() {
75
75
}
76
76
```
77
77
78
-
So how does React know which state corresponds to which`useState` call? The answer is that **React relies on the order in which Hooks are called**. Our example works because the order of the Hook calls is the same on every render:
78
+
إذًا، كيف تعرف React أية حالة توافق أي استدعاء للخطاف`useState`؟ الجواب هو أنَّ **React تعتمد على الترتيب الذي استدعيت الخطافات به**. مثالنا السابق يعمل بشكل صحيح لأنَّ ترتيب استدعاء الخطافات هو نفسه في كل تصيير:
79
79
80
80
```js
81
81
// ------------
82
-
//First render
82
+
//أول تصيير
83
83
// ------------
84
-
useState('Mary') // 1. Initialize the name state variable with 'Mary'
85
-
useEffect(persistForm) // 2. Add an effect for persisting the form
86
-
useState('Poppins') // 3. Initialize the surname state variable with 'Poppins'
87
-
useEffect(updateTitle) // 4. Add an effect for updating the title
84
+
useState('Mary') // 1. 'Mary' إلى name ضبط متغير الحالة
85
+
useEffect(persistForm) // 2. persistForm إضافى تأثير من أجل استمرار النموذج
86
+
useState('Poppins') // 3. 'Poppins' إلى surname ضبط متغير الحالة
87
+
useEffect(updateTitle) // 4. إضافة تأثير من أجل تحديث العنوان
88
88
89
89
// -------------
90
-
//Second render
90
+
//ثاني تصيير
91
91
// -------------
92
-
useState('Mary') // 1. Read the name state variable (argument is ignored)
93
-
useEffect(persistForm) // 2. Replace the effect for persisting the form
94
-
useState('Poppins') // 3. Read the surname state variable (argument is ignored)
95
-
useEffect(updateTitle) // 4. Replace the effect for updating the title
92
+
useState('Mary') // 1. (يتجاهل الوسيط) name قراءة متغير الحالة
93
+
useEffect(persistForm) // 2. استبدال التأثير من أجل استمرار النموذج
94
+
useState('Poppins') // 3. (يتجاهل الوسيط) surname قراءة متغير الحالة
95
+
useEffect(updateTitle) // 4. استبدال التأثير من أجل تحديث العنوان
96
96
97
97
// ...
98
98
```
99
99
100
-
As long as the order of the Hook calls is the same between renders, React can associate some local state with each of them. But what happens if we put a Hook call (for example, the `persistForm`effect) inside a condition?
100
+
طالمًا أنَّ ترتيب استدعاءات الخطاف هو نفسه بين عمليات التصيير، تستطيع React من ربط بعض الحالات المحلية مع بعضها بعضًا. ولكن، ماذا يحصل إن وضعنا استدعاء خطاف (التأثير `persistForm`مثلًا) داخل تعبير شرطي؟
101
101
102
102
```js
103
103
// 🔴 We're breaking the first rule by using a Hook in a condition
@@ -108,30 +108,30 @@ As long as the order of the Hook calls is the same between renders, React can as
108
108
}
109
109
```
110
110
111
-
The `name !== ''`condition is `true`on the first render, so we run this Hook. However, on the next render the user might clear the form, making the condition `false`. Now that we skip this Hook during rendering, the order of the Hook calls becomes different:
111
+
الشرط `name !== ''`هو `true`في عملية التصيير الأولى، لذا يُنفَّذ هذا الخطاف. مع ذلك، في عملية التصيير التالية، قد يمسح المستخدم النموذج مما يؤدي إلى تغيِّر قيمة الشرط إلى `false`. الآن وبعد أن تخطينا هذا الخطاف أثناء عملية التصيير، أصبح ترتيب استدعاءات الخطاف مختلفًا:
112
112
113
113
```js
114
-
useState('Mary') // 1. Read the name state variable (argument is ignored)
115
-
// useEffect(persistForm) // 🔴 This Hook was skipped!
116
-
useState('Poppins') // 🔴 2 (but was 3). Fail to read the surname state variable
117
-
useEffect(updateTitle) // 🔴 3 (but was 4). Fail to replace the effect
114
+
useState('Mary') // 1. (يتجاهل الوسيط) name قراءة متغير الحالة
115
+
// useEffect(persistForm) // 🔴 يُتخطَى هذا الخطاف
116
+
useState('Poppins') // 🔴 2 (يجب أن تكون 3) surname فشل قراءة متغير الحالة
117
+
useEffect(updateTitle) // 🔴 3 (فشل استبدال التأثير (يجب أن تكون 4
118
118
```
119
119
120
-
React wouldn't know what to return for the second `useState`Hook call. React expected that the second Hook call in this component corresponds to the `persistForm`effect, just like during the previous render, but it doesn't anymore. From that point, every next Hook call after the one we skipped would also shift by one, leading to bugs.
120
+
لن تعرف React ما الذي ستعيده من أجل استدعاء الخطاف `useState`الثاني. تتوقع React أن استدعاء الخطاف الثاني في هذا المكون يقابل التأثير `persistForm`مثل عملية التصيير السابقة، ولكن الحالة الآن لم تعد مشابه لها. بدءًا من تلك النقطة، كل استدعاء خطاف لاحق بعد ذلك الخطاف الذي جرى تخطيه سينزاح مرةً واحدةً مما يؤدي إلى حصول أخطاء.
121
121
122
-
**This is why Hooks must be called on the top level of our components.**If we want to run an effect conditionally, we can put that condition *inside* our Hook:
122
+
**هذا هو سبب وجوب استدعاء الخطافات في المستوى الأعلى من مكوناتنا.**إن أردنا تنفيذ تأثير شرطيًّا، يمكننا وضع هذا الشرط *داخل* خطافنا:
123
123
124
124
```js
125
125
useEffect(functionpersistForm() {
126
-
// 👍 We're not breaking the first rule anymore
126
+
// 👍 لم نخرق القاعدة الأولى
127
127
if (name !=='') {
128
128
localStorage.setItem('formData', name);
129
129
}
130
130
});
131
131
```
132
132
133
-
**Note that you don't need to worry about this problem if you use the [provided lint rule](https://www.npmjs.com/package/eslint-plugin-react-hooks).**But now you also know *why* Hooks work this way, and which issues the rule is preventing.
133
+
**لاحظ أنَّه لا داعي للقلق حول هذه المشكلة إن كنت تستعمل [إضافة التصحيح](https://www.npmjs.com/package/eslint-plugin-react-hooks).**الذي أشرنا إليها في الأعلى. على أية، أصبحت الآن تعرف سبب عمل الخطافات بهذه الطريقة، وما هي المشكلات التي تمنع القاعدة من حدوثها.
134
134
135
-
## Next Steps {#next-steps}
135
+
## الخطوات التالية {#next-steps}
136
136
137
-
Finally, we're ready to learn about [writing your own Hooks](/docs/hooks-custom.html)! Custom Hooks let you combine Hooks provided by React into your own abstractions, and reuse common stateful logic between different components.
137
+
أخيرًا، أصبحنا جاهزين لنتعلم كيفية [كتابة خطافات مخصصة](/docs/hooks-custom.html)! تخدم الغرض الذي نريد. الخطافات المخصصة تمكِّننا من دمج الخطافات التي توفرها React سويةً، وإعادة استعمال شيفرة شائعة ذات حالة بين مختلف المكونات.
0 commit comments