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/state-and-lifecycle.md
+24-24Lines changed: 24 additions & 24 deletions
Original file line number
Diff line number
Diff line change
@@ -8,9 +8,9 @@ prev: components-and-props.html
8
8
next: handling-events.html
9
9
---
10
10
11
-
На этой странице представлена концепция "состояния" (state) и "жизненного цикла" (lifecycle) компонентов React. Подробная [документация API компонента доступна по ссылке](/docs/react-component.html) .
11
+
На этой странице представлена концепция "состояния" (state) и "жизненного цикла" (lifecycle) компонентов React. Подробная [справочнике API компонента доступна по ссылке](/docs/react-component.html) .
12
12
13
-
В качестве примера рассмотрим бегущие часы из [предыдущего раздела](/docs/rendering-elements.html#updating-the-rendered-element). В разделе [Рендeринг элементов](/docs/rendering-elements.html#rendering-an-element-into-the-dom) мы изучили лишь один способ обновления UI - вызвать `ReactDOM.render()` для изменения результата отрисовки (рендеринга):
13
+
В качестве примера рассмотрим бегущие часы из [предыдущего раздела](/docs/rendering-elements.html#updating-the-rendered-element). В разделе [Рендeринг элементов](/docs/rendering-elements.html#rendering-an-element-into-the-dom) мы изучили лишь один способ обновления UI - вызвать `ReactDOM.render()` для изменения результата рендера:
14
14
15
15
```js{8-11}
16
16
function tick() {
@@ -29,9 +29,9 @@ function tick() {
29
29
setInterval(tick, 1000);
30
30
```
31
31
32
-
[**Попробовать на CodePen**](http://codepen.io/gaearon/pen/gwoJZk?editors=0010)
32
+
[**Посмотреть на CodePen**](http://codepen.io/gaearon/pen/gwoJZk?editors=0010)
33
33
34
-
В этом разделе мы узнаем, как инкаспулировать и обеспечить многократное использование компонента `Clock`. Компонент будет самостоятельно инициировать свой собственный таймер и будет самообновляться раз в секунду.
34
+
В этом разделе мы узнаем, как инкаспулировать и обеспечить многократное использование компонента `Clock`. Компонент самостоятельно создаст свой собственный таймер и будет самообновляться раз в секунду.
35
35
36
36
Начнем с инкапсуляции кода ответственного за вывод строки с текущим временем в функциональный компонент `Clock`:
37
37
@@ -55,11 +55,11 @@ function tick() {
55
55
setInterval(tick, 1000);
56
56
```
57
57
58
-
[**Попробовать на CodePen**](http://codepen.io/gaearon/pen/dpdoYR?editors=0010)
58
+
[**Посмотреть на CodePen**](http://codepen.io/gaearon/pen/dpdoYR?editors=0010)
59
59
60
-
Обратите внимание, что инциирование таймера и ежесекундное обновление интерфейса не является внутренней деталью реализации компонента `Clock`, а это одно из ключевых требований.
60
+
Обратите внимание, что создание таймера и ежесекундное обновление интерфейса не является внутренней деталью реализации компонента `Clock`, а это одно из ключевых требований.
61
61
62
-
В идеале мы бы хотели имплементировать`Clock` таким образом, чтобы компонент сам себя обновлял:
62
+
В идеале мы бы хотели реализовать`Clock` таким образом, чтобы компонент сам себя обновлял:
63
63
64
64
```js{2}
65
65
ReactDOM.render(
@@ -72,11 +72,11 @@ ReactDOM.render(
72
72
73
73
"Состояние" очень похоже на уже знакомые нам пропс (props), отличие в том, что состояние контролируется и доступно только конкретному компоненту.
74
74
75
-
Мы [уже упоминали](/docs/components-and-props.html#functional-and-class-components), что класс-компоненты обладают дополнительными свойствами. Локальное "состояние" — это одно из таких свойств, которое доступно только класс-компнентам.
75
+
Мы [уже упоминали](/docs/components-and-props.html#functional-and-class-components), что классовые компоненты обладают дополнительными свойствами. Локальное "состояние" — это одно из таких свойств, которое доступно только классовым компнентам.
76
76
77
77
## Преобразование функции в класс {#converting-a-function-to-a-class}
78
78
79
-
Давайте преобразуем функциональный компонент `Clock` в класс-компонент в 5 этапов:
79
+
Давайте преобразуем функциональный компонент `Clock` в классовый компонент в 5 этапов:
80
80
81
81
1. Создаем [ES6-класс](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Classes) с таким же именем, указываем `React.Component` в качестве родительского класса
82
82
@@ -102,12 +102,12 @@ class Clock extends React.Component {
102
102
}
103
103
```
104
104
105
-
[**Попробовать на CodePen**](http://codepen.io/gaearon/pen/zKRGpo?editors=0010)
105
+
[**Посмотреть на CodePen**](http://codepen.io/gaearon/pen/zKRGpo?editors=0010)
106
106
107
107
`Clock` теперь определён как класс, а не функция.
108
108
109
109
110
-
Метод `render` будет вызываться каждый раз, когда происходит обновление. Так как мы отрисовываем`<Clock />` в один и тот же DOM-контейнер, мы используем единственный экземпляр класса `Clock` - поэтому мы можем задействовать внутреннее состояние и хуки жизненного цикла.
110
+
Метод `render` будет вызываться каждый раз, когда происходит обновление. Так как мы рендерим`<Clock />` в один и тот же DOM-контейнер, мы используем единственный экземпляр класса `Clock` - поэтому мы можем задействовать внутреннее состояние и хуки жизненного цикла.
111
111
112
112
## Добавление локального состояния в класс {#adding-local-state-to-a-class}
113
113
@@ -158,7 +158,7 @@ class Clock extends React.Component {
158
158
}
159
159
```
160
160
161
-
Класс-компоненты всегда должны вызывать базовый конструктор с передачей ему `props`.
161
+
Классовые компоненты всегда должны вызывать базовый конструктор с передачей ему `props`.
162
162
163
163
3) Удалим проп `date` из элемента `<Clock />`:
164
164
@@ -196,15 +196,15 @@ ReactDOM.render(
196
196
);
197
197
```
198
198
199
-
[**Попробовать на CodePen**](http://codepen.io/gaearon/pen/KgQpJd?editors=0010)
199
+
[**Посмотреть на CodePen**](http://codepen.io/gaearon/pen/KgQpJd?editors=0010)
200
200
201
-
Следущий этап - добавить в `Clock`инициализацию собственного таймера с обновлением каждую секунду.
201
+
Следущий этап - добавить в `Clock`создание собственного таймера с обновлением каждую секунду.
202
202
203
203
## Добавление методов жизненного цикла в класс {#adding-lifecycle-methods-to-a-class}
204
204
205
205
В приложениях с множеством компонентов очень важно освобождать используемые системные ресурсы при удалении компонентов.
206
206
207
-
Мы называем "монтированием" (установкой) первоначальный рендеринг `Clock` в DOM. Наша цель - [инициировать таймер](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval) всякий раз, когда это происходит.
207
+
Мы называем "монтированием" (установкой) первоначальный рендеринг `Clock` в DOM. Наша цель - [создать таймер](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval) всякий раз, когда это происходит.
208
208
209
209
Каждый раз когда DOM-узел, созданный `Clock`, удаляется, просходит то, что мы называем "размонтирование". Учитывая важность сохранения ресурсов, мы [сбросим таймер](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/clearInterval) при каждой "размонтировке".
210
210
@@ -238,7 +238,7 @@ class Clock extends React.Component {
238
238
239
239
Эти методы называются "хуками (методами) жизненного цикла" (lifecycle methods).
240
240
241
-
Хук `componentDidMount()` запускается после того, как компонент отрендерился в DOM - это подходящее место для инициализирования таймера:
241
+
Хук `componentDidMount()` запускается после того, как компонент отрендерился в DOM - это подходящее место для создания таймера:
242
242
243
243
```js{2-5}
244
244
componentDidMount() {
@@ -251,7 +251,7 @@ class Clock extends React.Component {
251
251
252
252
Обратите внимание, что мы сохраняем ID таймера в `this`.
253
253
254
-
В класс-компонентах `this.props`инициализируется самим React, так же как и `this.state` - у этих полей особое назначение. Однако, если вам нужно сохранить информацию, которая не является частью процесса обработки данных React, можно вручную добавить дополнительные поля в класс (например, ID таймера).
254
+
В классовых компонентах `this.props`создается самим React, так же как и `this.state` - у этих полей особое назначение. Однако, если вам нужно сохранить информацию, которая не является частью процесса обработки данных React, можно вручную добавить дополнительные поля в класс (например, ID таймера).
255
255
256
256
Удалим таймер в хуке жизненного цикла `componentWillUnmount()`:
257
257
@@ -303,7 +303,7 @@ ReactDOM.render(
303
303
);
304
304
```
305
305
306
-
[**Попробовать на CodePen**](http://codepen.io/gaearon/pen/amqdNA?editors=0010)
306
+
[**Посмотреть на CodePen**](http://codepen.io/gaearon/pen/amqdNA?editors=0010)
307
307
308
308
Результат - часы обновляются каждую секунду.
309
309
@@ -313,9 +313,9 @@ ReactDOM.render(
313
313
314
314
2) React вызывает метод `render()` компонента `Clock`. Таким образом React узнаёт, что отобразить на экране. Далее, React обновляет DOM так, чтобы он соответствовал выводу ренедера `Clock`.
315
315
316
-
3) Как только вывод рендера `Clock` вставлен в DOM, React вызывает хук жизненного цикла `componentDidMount()`. Внутри него компонент `Clock` указывает браузеру инициализировать таймер, который будет вызывать метод компонента `tick()` раз в секунду.
316
+
3) Как только вывод рендера `Clock` вставлен в DOM, React вызывает хук жизненного цикла `componentDidMount()`. Внутри него компонент `Clock` указывает браузеру создать таймер, который будет вызывать метод компонента `tick()` раз в секунду.
317
317
318
-
4) Таймер вызывает метод `tick()` ежесекундно. Часть метода - вызов `setState()` с объектом, содержащим текущее время в качестве аргумента - таким образом компонент `Clock` планирует обновление UI. Благодаря вызову `setState()` React знает, что состояние изменилось, и снова вызывает метод `render()`, чтобы узнать, что должно отображаться на экране. На этот раз `this.state.date` в методе `render()` будет другим, и поэтому вывод отрисованного компонента будет включать обновлённое время и React соответственно обновит DOM.
318
+
4) Таймер вызывает метод `tick()` ежесекундно. Часть метода - вызов `setState()` с объектом, содержащим текущее время в качестве аргумента - таким образом компонент `Clock` планирует обновление UI. Благодаря вызову `setState()` React знает, что состояние изменилось, и снова вызывает метод `render()`, чтобы узнать, что должно отображаться на экране. На этот раз `this.state.date` в методе `render()` будет другим, и поэтому ренедер компонента будет включать обновлённое время и React соответственно обновит DOM.
319
319
320
320
5) Если компонент `Clock` когда-либо удаляется из DOM, React вызывает хук жизненного цикла `componentWillUnmount()`, таким образом таймер будет остановлен и удален.
321
321
@@ -325,7 +325,7 @@ ReactDOM.render(
325
325
326
326
### Не изменяйте состояние напрямую {#do-not-modify-state-directly}
327
327
328
-
В следующем примере повторной отрисовки компонента не происходит:
328
+
В следующем примере повторного рендера не происходит:
329
329
330
330
```js
331
331
// Неправильно
@@ -436,13 +436,13 @@ function FormattedDate(props) {
436
436
}
437
437
```
438
438
439
-
[**Попробовать на CodePen**](http://codepen.io/gaearon/pen/zKRqNB?editors=0010)
439
+
[**Посмотреть на CodePen**](http://codepen.io/gaearon/pen/zKRqNB?editors=0010)
440
440
441
441
Этот процесс называется "сверху вниз" ("top-down") потоком данных или "однонаправленным" ("unidirectional") потоком данных. Состояние всегда принадлежит определённому компоненту, а любые производные этого состояния могут влиять только на компоненты, находящиеся «ниже» в дереве компонентов.
442
442
443
443
Если представить иерархию компонентов как водопад пропс, то состояние каждого компонента похоже на дополнительный источник, который сливается с водопадом в произвольной точке, но также течёт вниз.
444
444
445
-
Чтобы показать, что все компоненты действительно изолированы, создадим компонент `App`, который отрисовывает три компонента `<Clock>`:
445
+
Чтобы показать, что все компоненты действительно изолированы, создадим компонент `App`, который рендерит три компонента `<Clock>`:
446
446
447
447
```js{4-6}
448
448
function App() {
@@ -461,7 +461,7 @@ ReactDOM.render(
461
461
);
462
462
```
463
463
464
-
[**Попробовать на CodePen**](http://codepen.io/gaearon/pen/vXdGmd?editors=0010)
464
+
[**Посмотреть на CodePen**](http://codepen.io/gaearon/pen/vXdGmd?editors=0010)
465
465
466
466
У каждого компонента `Clock` есть собственное состояние таймера, которое обновляется независимо от других компонентов.
0 commit comments