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
+17-17
Original file line number
Diff line number
Diff line change
@@ -10,7 +10,7 @@ next: handling-events.html
10
10
11
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() {
@@ -31,7 +31,7 @@ setInterval(tick, 1000);
31
31
32
32
[**Посмотреть на CodePen**](http://codepen.io/gaearon/pen/gwoJZk?editors=0010)
33
33
34
-
В этой главе мы узнаем, как инкапсулировать и обеспечить многократное использование компонента `Clock`. Компонент самостоятельно создаст свой собственный таймер и будет самообновляться раз в секунду.
34
+
В этой главе мы узнаем, как инкапсулировать и обеспечить многократное использование компонента `Clock`. Компонент самостоятельно установит свой собственный таймер и будет обновляться раз в секунду.
35
35
36
36
Для начала, извлечём компонент, показывающий время:
37
37
@@ -70,7 +70,7 @@ ReactDOM.render(
70
70
71
71
Для этого добавим так называемое «состояние» (state) в компонент `Clock`.
72
72
73
-
«Состояние» очень похоже на уже знакомые нам пропсы (props), отличие в том, что состояние контролируется и доступно только конкретному компоненту.
73
+
«Состояние» очень похоже на уже знакомые нам пропсы, отличие в том, что состояние контролируется и доступно только конкретному компоненту.
74
74
75
75
Мы [уже упоминали](/docs/components-and-props.html#functional-and-class-components), что классовые компоненты обладают дополнительными способностями. Локальное «состояние» — одна из таких способностей, которое доступно только классовым компнентам.
76
76
@@ -197,17 +197,17 @@ ReactDOM.render(
197
197
198
198
[**Посмотреть на CodePen**](http://codepen.io/gaearon/pen/KgQpJd?editors=0010)
199
199
200
-
Теперь осталось только создать собственный таймер внутри `Clock` и обновлять компонент каждую секунду.
200
+
Теперь осталось только установить собственный таймер внутри `Clock` и обновлять компонент каждую секунду.
201
201
202
202
## Добавим методы жизненного цикла в класс {#adding-lifecycle-methods-to-a-class}
203
203
204
204
В приложениях с множеством компонентов очень важно освобождать используемые системные ресурсы когда компоненты удаляются.
205
205
206
-
Первоначальный рендеринг компонента в DOM называется «монтирование» (установка). Нам нужно [создавать таймер](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval) всякий раз, когда это происходит.
206
+
Первоначальный рендеринг компонента в DOM называется «монтирование» (установка). Нам нужно [устанавливать таймер](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval) всякий раз, когда это происходит.
207
207
208
-
Каждый раз когда DOM-узел, созданный компонентом, удаляется, просходит то, что мы называем «размонтирование». Учитывая важность сохранения ресурсов, мы будем [сбрасывать таймер](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/clearInterval) при каждой «размонтировке».
208
+
Каждый раз когда DOM-узел, созданный компонентом, удаляется, просходит то, что мы называем «размонтирование». Учитывая важность сохранения ресурсов, мы будем [сбрасывать таймер](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/clearInterval) при каждом «размонтировании».
209
209
210
-
Объявим специальные методы, которые компонент будет вызывать при монтировнии и размонтировании:
210
+
Объявим специальные методы, которые компонент будет вызывать при монтировании и размонтировании:
211
211
212
212
```js{7-9,11-13}
213
213
class Clock extends React.Component {
@@ -237,7 +237,7 @@ class Clock extends React.Component {
237
237
238
238
Эти методы называются «методами жизненного цикла» (lifecycle methods).
239
239
240
-
Метод `componentDidMount()` запускается после того, как компонент отрендерился в DOM — здесь мы и создадим таймер:
240
+
Метод `componentDidMount()` запускается после того, как компонент отрендерился в DOM — здесь мы и установим таймер:
241
241
242
242
```js{2-5}
243
243
componentDidMount() {
@@ -252,7 +252,7 @@ class Clock extends React.Component {
252
252
253
253
В классовых компонентах у полей `this.props` и `this.state` особое назначение, более того, React сам создает `this.props`. Вы можете вручную добавить новые поля (например, ID таймера), если нужно сохранить дополнительную информацию о классе.
254
254
255
-
Удалим таймер в методе жизненного цикла `componentWillUnmount()`:
255
+
Теперь нам осталось сбросить таймер в методе жизненного цикла `componentWillUnmount()`:
256
256
257
257
```js{2}
258
258
componentWillUnmount() {
@@ -308,17 +308,17 @@ ReactDOM.render(
308
308
309
309
Теперь часы обновляются каждую секунду.
310
310
311
-
Давайте рассмотрим наше решение и разберем порядок, в котором вызываются методы:
311
+
Давайте рассмотрим наше решение и разберём порядок, в котором вызываются методы:
312
312
313
313
1) Когда мы передаём `<Clock />` в `ReactDOM.render()`, React вызывает конструктор компонента. `Clock` должен отображать текущее время, поэтому мы задаем начальное состояние `this.state` объектом с текущим временем.
314
314
315
-
2) React вызывает метод `render()` компонента `Clock`. Таким образом React узнаёт, что отобразить на экране. Далее, React обновляет DOM так, чтобы он соответствовал выводу ренедера`Clock`.
315
+
2) React вызывает метод `render()` компонента `Clock`. Таким образом React узнаёт, что отобразить на экране. Далее, React обновляет DOM так, чтобы он соответствовал выводу рендера`Clock`.
316
316
317
-
3) Как только вывод рендера `Clock` вставлен в DOM, React вызывает метод жизненного цикла `componentDidMount()`. Внутри него компонент `Clock` указывает браузеру создать таймер, который будет вызывать `tick()` раз в секунду.
317
+
3) Как только вывод рендера `Clock` вставлен в DOM, React вызывает метод жизненного цикла `componentDidMount()`. Внутри него компонент `Clock` указывает браузеру установить таймер, который будет вызывать `tick()` раз в секунду.
318
318
319
-
4) Таймер вызывает метод `tick()` ежесекундно. Часть метода — вызов `setState()`с объектом текущего времени — таким образом компонент `Clock` планирует обновление UI. Благодаря вызову `setState()`React знает, что состояние изменилось, и снова вызывает метод `render()`, чтобы узнать, что должно отображаться на экране. На этот раз `this.state.date` в методе `render()`будет другим, рендер компонента будет включать обновлённое время и React обновит DOM соответственно.
319
+
4) Таймер вызывает `tick()` ежесекундно. Внутри `tick()`мы меняем состояние посредством вызова `setState()` с текущим временем. React реагирует на изменение состояния и снова запускает `render()`. На этот раз `this.state.date` в методе `render()`содержит новое значение, поэтому React заменит DOM. Таким образом компонент `Clock` каждую секунду обновляет UI.
320
320
321
-
5) Если компонент `Clock` когда-либо удаляется из DOM, React вызывает метод жизненного цикла `componentWillUnmount()`, таким образом таймер будет остановлен и удален.
321
+
5) Если компонент `Clock` когда-либо удалится из DOM, React вызовет метод жизненного цикла `componentWillUnmount()` и сбросит таймер.
322
322
323
323
## Как правильно использовать состояние {#using-state-correctly}
## Однонаправленный поток данных {#the-data-flows-down}
417
417
418
-
В иерархии компонентов, ни родительский, ни дочерние компоненты не знают задано ли состояние другого компонента. Также не важно, как был создан определенный компонент — с помощью функции или класса.
418
+
В иерархии компонентов, ни родительский, ни дочерние компоненты не знают, задано ли состояние другого компонента. Также не важно, как был создан определенный компонент — с помощью функции или класса.
419
419
420
420
Состояние часто называют «локальным», «внутренним» или инкапсулированным. Оно доступно только для самого компонента и скрыто от других.
Своё состояние можно передать и другому пользовательскому компоненту:
429
429
430
430
```js
431
431
<FormattedDate date={this.state.date} />
432
432
```
433
433
434
-
Компонент `FormattedDate` получает `date` через пропсы но не знает, является ли первоисточником состояние `Clock`, пропс`Clock` или оно было передано напрямую:
434
+
Компонент `FormattedDate` получает `date` через пропсы но не знает, является ли первоисточником состояние `Clock`, пропсы`Clock` или оно было передано напрямую:
0 commit comments