Skip to content

Commit 7eca548

Browse files
authored
Merge pull request #252 from reactjs/sync-2cd4d0cf
Sync with reactjs.org @ 2cd4d0c
2 parents 064c273 + 8e9a4a1 commit 7eca548

File tree

6 files changed

+358
-76
lines changed

6 files changed

+358
-76
lines changed

content/docs/hooks-custom.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ import React, { useState, useEffect } from 'react';
1818
function FriendStatus(props) {
1919
const [isOnline, setIsOnline] = useState(null);
2020
21-
function handleStatusChange(status) {
22-
setIsOnline(status.isOnline);
23-
}
24-
2521
useEffect(() => {
22+
function handleStatusChange(status) {
23+
setIsOnline(status.isOnline);
24+
}
25+
2626
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
2727
return () => {
2828
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
@@ -44,11 +44,11 @@ import React, { useState, useEffect } from 'react';
4444
function FriendListItem(props) {
4545
const [isOnline, setIsOnline] = useState(null);
4646
47-
function handleStatusChange(status) {
48-
setIsOnline(status.isOnline);
49-
}
50-
5147
useEffect(() => {
48+
function handleStatusChange(status) {
49+
setIsOnline(status.isOnline);
50+
}
51+
5252
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
5353
return () => {
5454
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
@@ -79,11 +79,11 @@ import React, { useState, useEffect } from 'react';
7979
function useFriendStatus(friendID) {
8080
const [isOnline, setIsOnline] = useState(null);
8181
82-
function handleStatusChange(status) {
83-
setIsOnline(status.isOnline);
84-
}
85-
8682
useEffect(() => {
83+
function handleStatusChange(status) {
84+
setIsOnline(status.isOnline);
85+
}
86+
8787
ChatAPI.subscribeToFriendStatus(friendID, handleStatusChange);
8888
return () => {
8989
ChatAPI.unsubscribeFromFriendStatus(friendID, handleStatusChange);

content/docs/hooks-effect.md

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -198,17 +198,17 @@ class FriendStatus extends React.Component {
198198
199199
Вы должно быть подумали, что нам потребуется отдельный эффект для выполнения сброса. Так как код для оформления и отмены подписки тесно связан с `useEffect`, мы решили объединить их. Если ваш эффект возвращает функцию, React выполнит её только тогда, когда наступит время сбросить эффект.
200200
201-
```js{10-16}
201+
```js{6-16}
202202
import React, { useState, useEffect } from 'react';
203203

204204
function FriendStatus(props) {
205205
const [isOnline, setIsOnline] = useState(null);
206206

207-
function handleStatusChange(status) {
208-
setIsOnline(status.isOnline);
209-
}
210-
211207
useEffect(() => {
208+
function handleStatusChange(status) {
209+
setIsOnline(status.isOnline);
210+
}
211+
212212
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
213213
// Указываем, как сбросить этот эффект:
214214
return function cleanup() {
@@ -237,6 +237,10 @@ function FriendStatus(props) {
237237
238238
```js
239239
useEffect(() => {
240+
function handleStatusChange(status) {
241+
setIsOnline(status.isOnline);
242+
}
243+
240244
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
241245
return () => {
242246
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
@@ -316,15 +320,15 @@ function FriendStatusWithCounter(props) {
316320

317321
const [isOnline, setIsOnline] = useState(null);
318322
useEffect(() => {
323+
function handleStatusChange(status) {
324+
setIsOnline(status.isOnline);
325+
}
326+
319327
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
320328
return () => {
321329
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
322330
};
323331
});
324-
325-
function handleStatusChange(status) {
326-
setIsOnline(status.isOnline);
327-
}
328332
// ...
329333
}
330334
```
@@ -394,6 +398,7 @@ function FriendStatusWithCounter(props) {
394398
function FriendStatus(props) {
395399
// ...
396400
useEffect(() => {
401+
// ...
397402
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
398403
return () => {
399404
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
@@ -449,8 +454,12 @@ useEffect(() => {
449454
450455
Это также работает для эффектов с этапом сброса:
451456
452-
```js{6}
457+
```js{10}
453458
useEffect(() => {
459+
function handleStatusChange(status) {
460+
setIsOnline(status.isOnline);
461+
}
462+
454463
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
455464
return () => {
456465
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
@@ -462,9 +471,14 @@ useEffect(() => {
462471
463472
>Примечание
464473
>
465-
>Если вы хотите использовать эту оптимизацию, обратите внимание на то, чтобы массив включал в себя **все значения из внешней области видимости, которые могут изменяться с течением времени, и которые будут использоваться эффектом**. В противном случае, ваш код будет ссылаться на устаревшее значение из предыдущих рендеров. Мы рассмотрим другие возможные оптимизации на странице [справочник API хуков](/docs/hooks-reference.html).
474+
>Если вы хотите использовать эту оптимизацию, обратите внимание на то, чтобы массив включал в себя **все значения из области видимости компонента (такие как пропсы и состояние), которые могут изменяться с течением времени, и которые будут использоваться эффектом**. В противном случае, ваш код будет ссылаться на устаревшее значение из предыдущих рендеров. Отдельные страницы документации рассказывают о том, [как поступить с функциями](/docs/hooks-faq.html#is-it-safe-to-omit-functions-from-the-list-of-dependencies) и [что делать с часто изменяющимися массивами](/docs/hooks-faq.html#what-can-i-do-if-my-effect-dependencies-change-too-often).
475+
>
476+
>Если вы хотите запустить эффект и сбросить его только один раз (при монтировании и размонтировании), вы можете передать пустой массив (`[]`) вторым аргументом. React посчитает, что ваш эффект не зависит от *каких-либо* значений из пропсов или состояния и поэтому не будет выполнять повторных рендеров. Это не обрабатывается как особый случай -- он напрямую следует из логики работы входных массивов.
466477
>
467-
>Если вы хотите выполнять эффект и сбрасывать его однократно (при монтировании и размонтировании), вы можете передать пустой массив вторым аргументом. React посчитает, что ваш эффект не зависит от *каких-либо* значений из пропсов или состояния, и таким образом, он будет знать, что ему не надо его выполнять повторно. Это не расценивается как особый случай -- он напрямую следует из логики работы массивов при вводе. Хотя передача `[]` ближе по мысли к модели знакомых `componentDidMount` и `componentWillUnmount`, мы не советуем привыкать к этому, так как это часто приводит к багам, [как было рассмотрено ранее](#explanation-why-effects-run-on-each-update). Не забывайте, что React откладывает выполнение `useEffect` пока браузер не отрисует все изменения, поэтому выполнение дополнительной работы не является существенной проблемой.
478+
>Если вы передадите пустой массив (`[]`), пропсы и состояние внутри эффекта всегда будут иметь значения, присвоенные им изначально. Хотя передача `[]` ближе по модели мышления к знакомым `componentDidMount` и `componentWillUnmount`, обычно есть [более хорошие](/docs/hooks-faq.html#is-it-safe-to-omit-functions-from-the-list-of-dependencies) [способы](/docs/hooks-faq.html#what-can-i-do-if-my-effect-dependencies-change-too-often) избежать частых повторных рендеров. Не забывайте, что React откладывает выполнение `useEffect`, пока браузер не отрисует все изменения, поэтому выполнение дополнительной работы не является существенной проблемой.
479+
>
480+
>Мы рекомендуем использовать правило [`exhaustive-deps`](https://github.com/facebook/react/issues/14920), входящее в наш пакет правил линтера [`eslint-plugin-react-hooks`](https://www.npmjs.com/package/eslint-plugin-react-hooks#installation). Оно предупреждает, когда зависимости указаны неправильно и предлагает исправление.
481+
468482
469483
## Следующие шаги {#next-steps}
470484

0 commit comments

Comments
 (0)