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
+21-21Lines changed: 21 additions & 21 deletions
Original file line number
Diff line number
Diff line change
@@ -6,26 +6,26 @@ next: hooks-custom.html
6
6
prev: hooks-effect.html
7
7
---
8
8
9
-
*Хуки*появились в React 16.8. Они позволяют использовать состояние и другие возможности React без необходимости создавать класс.
9
+
*Хуки*-- новинка в React 16.8, которая позволяет использовать состояние и другие возможности React без написания классов.
10
10
11
-
Хуки — обычные функции JavaScript, но существует два правила, которым нужно следовать. Чтобы автоматически их применять мы создали [плагин для линтера](https://www.npmjs.com/package/eslint-plugin-react-hooks):
11
+
Хуки — обычные JavaScript-функции, но существует два правила, которым нужно следовать. Чтобы автоматически их применять мы создали [плагин для линтера](https://www.npmjs.com/package/eslint-plugin-react-hooks):
12
12
13
13
### Используйте хуки только на верхнем уровне {#only-call-hooks-at-the-top-level}
14
14
15
-
**Не используйте хуки внутри циклов, условных операторов или вложенных функций** Вместо этого всегда используйте хуки только на верхнем уровне React-функций. Cледуя этому правилу, можно гарантировать, что каждый раз, когда производится рендеринг компонента хуки вызываются в той же последовательности. А это то, что позволяет React правильно сохранять состояние хуков между множественными вызовами `useState` и `useEffect`. (Если вам интересно, подробное объяснение [ниже](#explanation).)
15
+
**Не используйте хуки внутри циклов, условных операторов или вложенных функций** Вместо этого всегда используйте хуки только на верхнем уровне React-функций. Исполнение этого правила гарантирует, что хуки вызываются в одинаковой последовательности при каждом рендере компонента. Это позволит React правильно сохранять состояние хуков между множественными вызовами `useState` и `useEffect`. (Если вам интересно, подробное объяснение [ниже](#explanation).)
16
16
17
17
### Вызывайте хуки только из React-функций {#only-call-hooks-from-react-functions}
18
18
19
19
**Не вызывайте хуки из обычных функций JavaScript.** Вместо этого можно:
20
20
21
-
* ✅ Вызвать хуки из функционального компонента React.
22
-
* ✅ Вызвать хуки из пользовательского хука (мы научимся делать это [на следующей странице](/docs/hooks-custom.html)).
21
+
* ✅ Вызывать хуки из функционального компонента React.
22
+
* ✅ Вызывать хуки из пользовательского хука (мы научимся делать это [на следующей странице](/docs/hooks-custom.html)).
23
23
24
-
Следуя этому правилу, можно гарантировать, что вся логика состояния компонента четко видна из исходного кода.
24
+
Следуя этому правилу, можно гарантировать, что вся логика состояния компонента чётко видна из исходного кода.
25
25
26
26
## Плагин для ESLint {#eslint-plugin}
27
27
28
-
Мы выпустили плагин для ESLint [`eslint-plugin-react-hooks`](https://www.npmjs.com/package/eslint-plugin-react-hooks), который обеспечивает соблюдение этих двух правил. Если хотите испытать его в деле, просто добавьте этот плагин в ваш проект.
28
+
Мы выпустили плагин для ESLint [`eslint-plugin-react-hooks`](https://www.npmjs.com/package/eslint-plugin-react-hooks), который принуждает к соблюдению этих двух правил. Если хотите испытать его в деле, добавьте этот плагин в ваш проект.
В будущем мы намереваемся включать этот плагин в Create React App и подобные инструменты по умолчанию.
49
49
50
-
**Теперь вы можете перейти на следующую страницу, рассказывающую как создать [собственный хук](/docs/hooks-custom.html).**А далее на этой странице мы объясним, зачем необходимы данные правила.
50
+
**Вы можете пропустить остаток этой страницы и перейти к созданию [собственного хука](/docs/hooks-custom.html).**Но если вам интересно, ниже приведено объяснение, почему правила хуков необходимы.
51
51
52
52
## Объяснение {#explanation}
53
53
@@ -75,29 +75,29 @@ function Form() {
75
75
}
76
76
```
77
77
78
-
Итак, как же React сопоставляет состояние вызову `useState`? Ответ следующий: **React полагается на порядок вызова хуков**. Наш пример работает, потому что порядок вызова хуков сохраняется при каждом рендеринге.
78
+
Итак, как же React сопоставляет переменные состояния с вызовами `useState`? Ответ таков: **React полагается на порядок вызова хуков**. Наш пример работает, потому что порядок вызова хуков одинаков при каждом рендере.
79
79
80
80
```js
81
81
// ------------
82
-
// Первый рендеринг
82
+
// Первый рендер
83
83
// ------------
84
-
useState('Mary') // 1. Инициализируем переменную name значением 'Mary'
84
+
useState('Мэри') // 1. Инициализируем переменную name значением 'Mary'
85
85
useEffect(persistForm) // 2. Добавляем эффект для сохранения данных формы
useEffect(updateTitle) // 4. Добавляем эффект для обновления заголовка страницы
88
88
89
89
// -------------
90
-
// Второй рендеринг
90
+
// Второй рендер
91
91
// -------------
92
-
useState('Mary') // 1. Читаем переменную состояния name (аргумент игнорируется)
92
+
useState('Мэри') // 1. Читаем переменную состояния name (аргумент игнорируется)
93
93
useEffect(persistForm) // 2. Заменяем эффект сохранения данных формы
94
-
useState('Poppins') // 3. Читаем переменную состояния surname (аргумент игнорируется)
94
+
useState('Поппинс') // 3. Читаем переменную состояния surname (аргумент игнорируется)
95
95
useEffect(updateTitle) // 4. Заменяем эффект обновления заголовка страницы
96
96
97
97
// ...
98
98
```
99
99
100
-
До тех пор пока порядок вызова хуков сохраняется между каждым рендерингом, React может сопоставить некое внутреннее состояние с каждым из них. Но что случится, если мы поместим вызов хука (например, эффект `persistForm`) внутрь условного оператора?
100
+
До тех пор пока порядок вызова хуков одинаков в каждом рендере, React может сопоставить некое внутреннее состояние с каждым из них. Но что случится, если мы поместим вызов хука (например, эффект `persistForm`) внутрь условного оператора?
101
101
102
102
```js
103
103
// 🔴 Нарушаем первое правило, помещая хук в условие
@@ -108,7 +108,7 @@ useEffect(updateTitle) // 4. Заменяем эффект обновлен
108
108
}
109
109
```
110
110
111
-
Условие `name !== ''` равняется `true` при первом рендеринге, поэтому хук выполняется. Тем не менее, при следующем рендеринге пользователь может обратить это условие в `false`, очистив поля формы. Теперь во время рендеринга хук будет пропущен и порядок вызовов хуков изменится.
111
+
Условие `name !== ''` равняется `true` при первом рендере, поэтому хук выполняется. Тем не менее, при следующем рендере пользователь может обратить это условие в `false`, очистив поля формы. Теперь во время рендера хук будет пропущен и порядок вызовов хуков изменится.
112
112
113
113
```js
114
114
useState('Mary') // 1. Читаем переменную состояния name (аргумент игнорируется)
@@ -117,7 +117,7 @@ useState('Poppins') // 🔴 2 (но ранее был 3). Ошибка п
117
117
useEffect(updateTitle) // 🔴 3 (но ранее был 4). Ошибка при замене эффекта
118
118
```
119
119
120
-
React не будет знать, что вернуть для второго вызова хука `useState`. React ожидал, что второй вызов хука в этом компоненте соответствует эффекту `persistForm`, так же как при предыдущем рендеринге, но это больше не так. Начиная с этого момента каждый последующий вызов хука после того который был пропущен, также будет сдвинут на один назад, что приведет к ошибкам.
120
+
React не будет знать, что вернуть для второго вызова хука `useState`. React ожидал, что второй вызов хука в этом компоненте соответствует эффекту `persistForm`, так же как при предыдущем рендере, но это больше не так. Начиная с этого момента, вызов каждого хука, следующего за пропущенным, также будет сдвинут на один назад, что приведёт к ошибкам.
121
121
122
122
**Вот почему хуки должны вызываться на верхнем уровне компонента.** Если мы хотим запускать эффект по условию, то можем поместить это условие *внутрь* хука:
123
123
@@ -130,8 +130,8 @@ React не будет знать, что вернуть для второго в
130
130
});
131
131
```
132
132
133
-
**Но эта проблема не будет вас беспокоить, если вы включите в свой проект [наше правило линтера](https://www.npmjs.com/package/eslint-plugin-react-hooks).** Но теперь вы знаете, *почему* хуки работают таким образом и какие проблемы это правило предотвращает.
133
+
**Эта проблема не будет вас беспокоить, если вы включите в свой проект [наше правило линтера](https://www.npmjs.com/package/eslint-plugin-react-hooks).** Но теперь вы знаете, *почему* хуки работают таким образом и какие проблемы это правило предотвращает.
134
134
135
-
## Далее {#next-steps}
135
+
## Следующие шаги {#next-steps}
136
136
137
-
Наконец-то мы готовы изучить как [написать свой собственный хук](/docs/hooks-custom.html)! Пользовательские хуки позволят вам включить собственные хуки React в ваши абстракции и повторно использовать общую логику состояния в различных компонентах.
137
+
Наконец-то мы готовы изучить как [написать свой собственный хук](/docs/hooks-custom.html)! Пользовательские хуки позволят вам включить собственные хуки React в ваши абстракции и повторно использовать общую логику состояния в различных компонентах.
0 commit comments