Skip to content

Commit 085e5c6

Browse files
authored
hooks-rules: various improvements
1 parent 5c907a9 commit 085e5c6

File tree

1 file changed

+21
-21
lines changed

1 file changed

+21
-21
lines changed

content/docs/hooks-rules.md

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,26 @@ next: hooks-custom.html
66
prev: hooks-effect.html
77
---
88

9-
*Хуки* появились в React 16.8. Они позволяют использовать состояние и другие возможности React без необходимости создавать класс.
9+
*Хуки* -- новинка в React 16.8, которая позволяет использовать состояние и другие возможности React без написания классов.
1010

11-
Хуки — обычные функции JavaScript, но существует два правила, которым нужно следовать. Чтобы автоматически их применять мы создали [плагин для линтера](https://www.npmjs.com/package/eslint-plugin-react-hooks):
11+
Хуки — обычные JavaScript-функции, но существует два правила, которым нужно следовать. Чтобы автоматически их применять мы создали [плагин для линтера](https://www.npmjs.com/package/eslint-plugin-react-hooks):
1212

1313
### Используйте хуки только на верхнем уровне {#only-call-hooks-at-the-top-level}
1414

15-
**Не используйте хуки внутри циклов, условных операторов или вложенных функций** Вместо этого всегда используйте хуки только на верхнем уровне React-функций. Cледуя этому правилу, можно гарантировать, что каждый раз, когда производится рендеринг компонента хуки вызываются в той же последовательности. А это то, что позволяет React правильно сохранять состояние хуков между множественными вызовами `useState` и `useEffect`. (Если вам интересно, подробное объяснение [ниже](#explanation).)
15+
**Не используйте хуки внутри циклов, условных операторов или вложенных функций** Вместо этого всегда используйте хуки только на верхнем уровне React-функций. Исполнение этого правила гарантирует, что хуки вызываются в одинаковой последовательности при каждом рендере компонента. Это позволит React правильно сохранять состояние хуков между множественными вызовами `useState` и `useEffect`. (Если вам интересно, подробное объяснение [ниже](#explanation).)
1616

1717
### Вызывайте хуки только из React-функций {#only-call-hooks-from-react-functions}
1818

1919
**Не вызывайте хуки из обычных функций JavaScript.** Вместо этого можно:
2020

21-
*Вызвать хуки из функционального компонента React.
22-
*Вызвать хуки из пользовательского хука (мы научимся делать это [на следующей странице](/docs/hooks-custom.html)).
21+
*Вызывать хуки из функционального компонента React.
22+
*Вызывать хуки из пользовательского хука (мы научимся делать это [на следующей странице](/docs/hooks-custom.html)).
2323

24-
Следуя этому правилу, можно гарантировать, что вся логика состояния компонента четко видна из исходного кода.
24+
Следуя этому правилу, можно гарантировать, что вся логика состояния компонента чётко видна из исходного кода.
2525

2626
## Плагин для ESLint {#eslint-plugin}
2727

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), который принуждает к соблюдению этих двух правил. Если хотите испытать его в деле, добавьте этот плагин в ваш проект.
2929

3030
```bash
3131
npm install eslint-plugin-react-hooks
@@ -47,7 +47,7 @@ npm install eslint-plugin-react-hooks
4747

4848
В будущем мы намереваемся включать этот плагин в Create React App и подобные инструменты по умолчанию.
4949

50-
**Теперь вы можете перейти на следующую страницу, рассказывающую как создать [собственный хук](/docs/hooks-custom.html).** А далее на этой странице мы объясним, зачем необходимы данные правила.
50+
**Вы можете пропустить остаток этой страницы и перейти к созданию [собственного хука](/docs/hooks-custom.html).** Но если вам интересно, ниже приведено объяснение, почему правила хуков необходимы.
5151

5252
## Объяснение {#explanation}
5353

@@ -75,29 +75,29 @@ function Form() {
7575
}
7676
```
7777

78-
Итак, как же React сопоставляет состояние вызову `useState`? Ответ следующий: **React полагается на порядок вызова хуков**. Наш пример работает, потому что порядок вызова хуков сохраняется при каждом рендеринге.
78+
Итак, как же React сопоставляет переменные состояния с вызовами `useState`? Ответ таков: **React полагается на порядок вызова хуков**. Наш пример работает, потому что порядок вызова хуков одинаков при каждом рендере.
7979

8080
```js
8181
// ------------
82-
// Первый рендеринг
82+
// Первый рендер
8383
// ------------
84-
useState('Mary') // 1. Инициализируем переменную name значением 'Mary'
84+
useState('Мэри') // 1. Инициализируем переменную name значением 'Mary'
8585
useEffect(persistForm) // 2. Добавляем эффект для сохранения данных формы
86-
useState('Poppins') // 3. Инициализируем переменную surname значением 'Poppins'
86+
useState('Поппинс') // 3. Инициализируем переменную surname значением 'Poppins'
8787
useEffect(updateTitle) // 4. Добавляем эффект для обновления заголовка страницы
8888

8989
// -------------
90-
// Второй рендеринг
90+
// Второй рендер
9191
// -------------
92-
useState('Mary') // 1. Читаем переменную состояния name (аргумент игнорируется)
92+
useState('Мэри') // 1. Читаем переменную состояния name (аргумент игнорируется)
9393
useEffect(persistForm) // 2. Заменяем эффект сохранения данных формы
94-
useState('Poppins') // 3. Читаем переменную состояния surname (аргумент игнорируется)
94+
useState('Поппинс') // 3. Читаем переменную состояния surname (аргумент игнорируется)
9595
useEffect(updateTitle) // 4. Заменяем эффект обновления заголовка страницы
9696

9797
// ...
9898
```
9999

100-
До тех пор пока порядок вызова хуков сохраняется между каждым рендерингом, React может сопоставить некое внутреннее состояние с каждым из них. Но что случится, если мы поместим вызов хука (например, эффект `persistForm`) внутрь условного оператора?
100+
До тех пор пока порядок вызова хуков одинаков в каждом рендере, React может сопоставить некое внутреннее состояние с каждым из них. Но что случится, если мы поместим вызов хука (например, эффект `persistForm`) внутрь условного оператора?
101101

102102
```js
103103
// 🔴 Нарушаем первое правило, помещая хук в условие
@@ -108,7 +108,7 @@ useEffect(updateTitle) // 4. Заменяем эффект обновлен
108108
}
109109
```
110110

111-
Условие `name !== ''` равняется `true` при первом рендеринге, поэтому хук выполняется. Тем не менее, при следующем рендеринге пользователь может обратить это условие в `false`, очистив поля формы. Теперь во время рендеринга хук будет пропущен и порядок вызовов хуков изменится.
111+
Условие `name !== ''` равняется `true` при первом рендере, поэтому хук выполняется. Тем не менее, при следующем рендере пользователь может обратить это условие в `false`, очистив поля формы. Теперь во время рендера хук будет пропущен и порядок вызовов хуков изменится.
112112

113113
```js
114114
useState('Mary') // 1. Читаем переменную состояния name (аргумент игнорируется)
@@ -117,7 +117,7 @@ useState('Poppins') // 🔴 2 (но ранее был 3). Ошибка п
117117
useEffect(updateTitle) // 🔴 3 (но ранее был 4). Ошибка при замене эффекта
118118
```
119119

120-
React не будет знать, что вернуть для второго вызова хука `useState`. React ожидал, что второй вызов хука в этом компоненте соответствует эффекту `persistForm`, так же как при предыдущем рендеринге, но это больше не так. Начиная с этого момента каждый последующий вызов хука после того который был пропущен, также будет сдвинут на один назад, что приведет к ошибкам.
120+
React не будет знать, что вернуть для второго вызова хука `useState`. React ожидал, что второй вызов хука в этом компоненте соответствует эффекту `persistForm`, так же как при предыдущем рендере, но это больше не так. Начиная с этого момента, вызов каждого хука, следующего за пропущенным, также будет сдвинут на один назад, что приведёт к ошибкам.
121121

122122
**Вот почему хуки должны вызываться на верхнем уровне компонента.** Если мы хотим запускать эффект по условию, то можем поместить это условие *внутрь* хука:
123123

@@ -130,8 +130,8 @@ React не будет знать, что вернуть для второго в
130130
});
131131
```
132132

133-
**Но эта проблема не будет вас беспокоить, если вы включите в свой проект [наше правило линтера](https://www.npmjs.com/package/eslint-plugin-react-hooks).** Но теперь вы знаете, *почему* хуки работают таким образом и какие проблемы это правило предотвращает.
133+
**Эта проблема не будет вас беспокоить, если вы включите в свой проект [наше правило линтера](https://www.npmjs.com/package/eslint-plugin-react-hooks).** Но теперь вы знаете, *почему* хуки работают таким образом и какие проблемы это правило предотвращает.
134134

135-
## Далее {#next-steps}
135+
## Следующие шаги {#next-steps}
136136

137-
Наконец-то мы готовы изучить как [написать свой собственный хук](/docs/hooks-custom.html)! Пользовательские хуки позволят вам включить собственные хуки React в ваши абстракции и повторно использовать общую логику состояния в различных компонентах.
137+
Наконец-то мы готовы изучить как [написать свой собственный хук](/docs/hooks-custom.html)! Пользовательские хуки позволят вам включить собственные хуки React в ваши абстракции и повторно использовать общую логику состояния в различных компонентах.

0 commit comments

Comments
 (0)