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
*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.
49
+
في المستقبل، ننوي تضمين هذه الإضافة افتراضيًّا عند بناء تطبيقات جديدة باستعمال الأمر Create React App أو أية مجموعة أدوات أخرى (toolkits).
50
50
51
-
**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.
51
+
**يمكنك تخطي بقية هذه الصفحة إلى الصفحة التالية: [بناء خطافات خاصة بك](/docs/hooks-custom.html)الآن.**إذ سنكمل شرح سبب وجود هاتين القاعدتين.
52
52
53
-
## Explanation {#explanation}
53
+
## الشرح {#explanation}
54
54
55
-
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:
55
+
كما [تعلمنا سابقًا](/docs/hooks-state.html#tip-using-multiple-state-variables), يمكننا استعمال خطافات حالة أو تأثير متعددة في مكون واحد:
56
56
57
57
```js
58
58
functionForm() {
59
-
// 1. Use the name state variable
59
+
// 1. نفسه name استعمال متغير الحالة
60
60
const [name, setName] =useState('Mary');
61
61
62
-
// 2. Use an effect for persisting the form
62
+
// 2. استعمال تأثير من أجل استمرار النموذج
63
63
useEffect(functionpersistForm() {
64
64
localStorage.setItem('formData', name);
65
65
});
66
66
67
-
// 3. Use the surname state variable
67
+
// 3. surname استعمال متغير الحالة
68
68
const [surname, setSurname] =useState('Poppins');
69
69
70
-
// 4. Use an effect for updating the title
70
+
// 4. استعمال تأثير من أجل تحديث العنوان
71
71
useEffect(functionupdateTitle() {
72
72
document.title= name +''+ surname;
73
73
});
@@ -76,63 +76,64 @@ function Form() {
76
76
}
77
77
```
78
78
79
-
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:
79
+
إذًا، كيف تعرف React أية حالة توافق أي استدعاء للخطاف`useState`؟ الجواب هو أنَّ **React تعتمد على الترتيب الذي استدعيت الخطافات به**. مثالنا السابق يعمل بشكل صحيح لأنَّ ترتيب استدعاء الخطافات هو نفسه في كل تصيير:
80
80
81
81
```js
82
82
// ------------
83
-
//First render
83
+
//أول تصيير
84
84
// ------------
85
-
useState('Mary') // 1. Initialize the name state variable with 'Mary'
86
-
useEffect(persistForm) // 2. Add an effect for persisting the form
87
-
useState('Poppins') // 3. Initialize the surname state variable with 'Poppins'
88
-
useEffect(updateTitle) // 4. Add an effect for updating the title
85
+
useState('Mary') // 1. 'Mary' إلى name ضبط متغير الحالة
86
+
useEffect(persistForm) // 2. persistForm إضافى تأثير من أجل استمرار النموذج
87
+
useState('Poppins') // 3. 'Poppins' إلى surname ضبط متغير الحالة
88
+
useEffect(updateTitle) // 4. إضافة تأثير من أجل تحديث العنوان
89
89
90
90
// -------------
91
-
//Second render
91
+
//ثاني تصيير
92
92
// -------------
93
-
useState('Mary') // 1. Read the name state variable (argument is ignored)
94
-
useEffect(persistForm) // 2. Replace the effect for persisting the form
95
-
useState('Poppins') // 3. Read the surname state variable (argument is ignored)
96
-
useEffect(updateTitle) // 4. Replace the effect for updating the title
93
+
useState('Mary') // 1. (يتجاهل الوسيط) name قراءة متغير الحالة
94
+
useEffect(persistForm) // 2. استبدال التأثير من أجل استمرار النموذج
95
+
useState('Poppins') // 3. (يتجاهل الوسيط) surname قراءة متغير الحالة
96
+
useEffect(updateTitle) // 4. استبدال التأثير من أجل تحديث العنوان
97
97
98
98
// ...
99
99
```
100
100
101
-
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?
101
+
طالمًا أنَّ ترتيب استدعاءات الخطاف هو نفسه بين عمليات التصيير، تستطيع React من ربط بعض الحالات المحلية مع بعضها بعضًا. ولكن، ماذا يحصل إن وضعنا استدعاء خطاف (التأثير `persistForm`مثلًا) داخل تعبير شرطي؟
102
102
103
103
```js
104
-
// 🔴 We're breaking the first rule by using a Hook in a condition
104
+
// 🔴 نكسر الآن القاعدة الأولى عبر استعمال خطاف داخل تعبير شرطي
105
+
105
106
if (name !=='') {
106
107
useEffect(functionpersistForm() {
107
108
localStorage.setItem('formData', name);
108
109
});
109
110
}
110
111
```
111
112
112
-
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:
113
+
الشرط `name !== ''`هو `true`في عملية التصيير الأولى، لذا يُنفَّذ هذا الخطاف. مع ذلك، في عملية التصيير التالية، قد يمسح المستخدم النموذج مما يؤدي إلى تغيِّر قيمة الشرط إلى `false`. الآن وبعد أن تخطينا هذا الخطاف أثناء عملية التصيير، أصبح ترتيب استدعاءات الخطاف مختلفًا:
113
114
114
115
```js
115
-
useState('Mary') // 1. Read the name state variable (argument is ignored)
116
-
// useEffect(persistForm) // 🔴 This Hook was skipped!
117
-
useState('Poppins') // 🔴 2 (but was 3). Fail to read the surname state variable
118
-
useEffect(updateTitle) // 🔴 3 (but was 4). Fail to replace the effect
116
+
useState('Mary') // 1. (يتجاهل الوسيط) name قراءة متغير الحالة
117
+
// useEffect(persistForm) // 🔴 يُتخطَى هذا الخطاف
118
+
useState('Poppins') // 🔴 2 (يجب أن تكون 3) surname فشل قراءة متغير الحالة
119
+
useEffect(updateTitle) // 🔴 3 (فشل استبدال التأثير (يجب أن تكون 4
119
120
```
120
121
121
-
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.
122
+
لن تعرف React ما الذي ستعيده من أجل استدعاء الخطاف `useState`الثاني. تتوقع React أن استدعاء الخطاف الثاني في هذا المكون يقابل التأثير `persistForm`مثل عملية التصيير السابقة، ولكن الحالة الآن لم تعد مشابه لها. بدءًا من تلك النقطة، كل استدعاء خطاف لاحق بعد ذلك الخطاف الذي جرى تخطيه سينزاح مرةً واحدةً مما يؤدي إلى حصول أخطاء.
122
123
123
-
**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:
124
+
**هذا هو سبب وجوب استدعاء الخطافات في المستوى الأعلى من مكوناتنا.**إن أردنا تنفيذ تأثير شرطيًّا، يمكننا وضع هذا الشرط *داخل* خطافنا:
124
125
125
126
```js
126
127
useEffect(functionpersistForm() {
127
-
// 👍 We're not breaking the first rule anymore
128
+
// 👍 لم نخرق القاعدة الأولى
128
129
if (name !=='') {
129
130
localStorage.setItem('formData', name);
130
131
}
131
132
});
132
133
```
133
134
134
-
**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.
135
+
**لاحظ أنَّه لا داعي للقلق حول هذه المشكلة إن كنت تستعمل [إضافة التصحيح](https://www.npmjs.com/package/eslint-plugin-react-hooks).**الذي أشرنا إليها في الأعلى. على أية، أصبحت الآن تعرف سبب عمل الخطافات بهذه الطريقة، وما هي المشكلات التي تمنع القاعدة من حدوثها.
135
136
136
-
## Next Steps {#next-steps}
137
+
## الخطوات التالية {#next-steps}
137
138
138
-
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.
139
+
أخيرًا، أصبحنا جاهزين لنتعلم كيفية [كتابة خطافات مخصصة](/docs/hooks-custom.html)! تخدم الغرض الذي نريد. الخطافات المخصصة تمكِّننا من دمج الخطافات التي توفرها React سويةً، وإعادة استعمال شيفرة شائعة ذات حالة بين مختلف المكونات.
0 commit comments