HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>При правильном использовании React большая часть компонентов состоит из метода render и обработчиков событий:</p>
1 <p>При правильном использовании React большая часть компонентов состоит из метода render и обработчиков событий:</p>
2 <p>Но не все задачи решаются так просто. Представьте себе компонент &lt;Clock /&gt;, имитирующий цифровые часы в формате<em>чч:мм:сс</em>. Заготовка:</p>
2 <p>Но не все задачи решаются так просто. Представьте себе компонент &lt;Clock /&gt;, имитирующий цифровые часы в формате<em>чч:мм:сс</em>. Заготовка:</p>
3 <p>Этот компонент отображает текущее время. Теперь нужно придумать, как его обновлять. Часы, в отличие от обычных компонентов, не ожидают действий от пользователя. Они обновляются каждую секунду самостоятельно. Возникает цепочка: происходит событие =&gt; меняется текущее время =&gt; React вызывает render и меняет DOM. Итак, состояние инициализируется текущим временем:</p>
3 <p>Этот компонент отображает текущее время. Теперь нужно придумать, как его обновлять. Часы, в отличие от обычных компонентов, не ожидают действий от пользователя. Они обновляются каждую секунду самостоятельно. Возникает цепочка: происходит событие =&gt; меняется текущее время =&gt; React вызывает render и меняет DOM. Итак, состояние инициализируется текущим временем:</p>
4 <p>Компонент по-прежнему показывает текущее время на момент отрисовки/перерисовки компонента, но теперь он готов к изменению. Время относится к периодическим событиям, для которых используются таймеры. Для &lt;Clock /&gt; подойдет setInterval. Таймер должен быть установлен сразу после отрисовки часов и должен быть очищен при удалении компонента из дерева элементов.</p>
4 <p>Компонент по-прежнему показывает текущее время на момент отрисовки/перерисовки компонента, но теперь он готов к изменению. Время относится к периодическим событиям, для которых используются таймеры. Для &lt;Clock /&gt; подойдет setInterval. Таймер должен быть установлен сразу после отрисовки часов и должен быть очищен при удалении компонента из дерева элементов.</p>
5 <p>Где запускать таймер? render вызывается на каждое изменение состояния, а значит он не подходит. Ведь тогда &lt;Clock /&gt; будет запускать новый таймер каждую секунду. Конструктор кажется более подходящим местом, но здесь ожидает сюрприз. Вызов конструктора и отрисовка часов в DOM-дереве, в общем случае - два независимых события. Посмотрите на код:</p>
5 <p>Где запускать таймер? render вызывается на каждое изменение состояния, а значит он не подходит. Ведь тогда &lt;Clock /&gt; будет запускать новый таймер каждую секунду. Конструктор кажется более подходящим местом, но здесь ожидает сюрприз. Вызов конструктора и отрисовка часов в DOM-дереве, в общем случае - два независимых события. Посмотрите на код:</p>
6 <p>Эти часы еще не находятся в DOM-дереве, но уже вовсю работают и обновляются. Стоит ли об этом беспокоиться? Да, такое поведение крайне неожиданно, оно мешает тестированию и расходует процессорное время. Кроме того, конструктор никак не помогает с удалением таймера.</p>
6 <p>Эти часы еще не находятся в DOM-дереве, но уже вовсю работают и обновляются. Стоит ли об этом беспокоиться? Да, такое поведение крайне неожиданно, оно мешает тестированию и расходует процессорное время. Кроме того, конструктор никак не помогает с удалением таймера.</p>
7 <p>Каждый компонент React проходит несколько стадий в процессе своей жизни: он создается, затем добавляется в DOM, затем может обновляться (например, при изменении пропсов или состояния), и, наконец, удаляется из дерева. Этот процесс называют жизненным циклом компонента (Component Lifecycle). React предоставляет набор методов, которые позволяют встроиться в этот процесс. Например, запуск часов логичнее всего сделать сразу после их отрисовки. В этом поможет метод componentDidMount. Он вызывается сразу после отрисовки компонента. Происходит это ровно один раз.</p>
7 <p>Каждый компонент React проходит несколько стадий в процессе своей жизни: он создается, затем добавляется в DOM, затем может обновляться (например, при изменении пропсов или состояния), и, наконец, удаляется из дерева. Этот процесс называют жизненным циклом компонента (Component Lifecycle). React предоставляет набор методов, которые позволяют встроиться в этот процесс. Например, запуск часов логичнее всего сделать сразу после их отрисовки. В этом поможет метод componentDidMount. Он вызывается сразу после отрисовки компонента. Происходит это ровно один раз.</p>
8 <p>Обратите внимание на то, как сохраняется идентификатор таймера внутри объекта. Он не участвует в представлении, поэтому нет необходимости сохранять его в состоянии.</p>
8 <p>Обратите внимание на то, как сохраняется идентификатор таймера внутри объекта. Он не участвует в представлении, поэтому нет необходимости сохранять его в состоянии.</p>
9 <p>Теперь нужно выполнить очистку таймера. Для этого подойдет метод componentWillUnmount, который выполняется прямо перед удалением компонента из DOM.</p>
9 <p>Теперь нужно выполнить очистку таймера. Для этого подойдет метод componentWillUnmount, который выполняется прямо перед удалением компонента из DOM.</p>
10 <p>Часы приобрели законченный вид.</p>
10 <p>Часы приобрели законченный вид.</p>
11 <p>Итак, вы узнали два метода, позволяющих встраиваться в жизненный цикл компонента, но их значительно больше. Они делятся на три независимые группы:</p>
11 <p>Итак, вы узнали два метода, позволяющих встраиваться в жизненный цикл компонента, но их значительно больше. Они делятся на три независимые группы:</p>
12 <p><strong>Монтирование (Mounting)</strong></p>
12 <p><strong>Монтирование (Mounting)</strong></p>
13 <p>Эти методы вызываются по порядку во время создания объекта и вставки его в DOM.</p>
13 <p>Эти методы вызываются по порядку во время создания объекта и вставки его в DOM.</p>
14 <ul><li>constructor()</li>
14 <ul><li>constructor()</li>
15 <li>static getDerivedStateFromProps()</li>
15 <li>static getDerivedStateFromProps()</li>
16 <li>render()</li>
16 <li>render()</li>
17 <li>componentDidMount()</li>
17 <li>componentDidMount()</li>
18 </ul><p><strong>Обновление (Updating)</strong></p>
18 </ul><p><strong>Обновление (Updating)</strong></p>
19 <p>Обновление может происходить при изменении свойств или состояния. Эти методы вызываются по порядку во время перерисовки:</p>
19 <p>Обновление может происходить при изменении свойств или состояния. Эти методы вызываются по порядку во время перерисовки:</p>
20 <ul><li>static getDerivedStateFromProps()</li>
20 <ul><li>static getDerivedStateFromProps()</li>
21 <li>shouldComponentUpdate()</li>
21 <li>shouldComponentUpdate()</li>
22 <li>render()</li>
22 <li>render()</li>
23 <li>getSnapshotBeforeUpdate()</li>
23 <li>getSnapshotBeforeUpdate()</li>
24 <li>componentDidUpdate()</li>
24 <li>componentDidUpdate()</li>
25 </ul><p><strong>Удаление или демонтирование (Unmounting)</strong></p>
25 </ul><p><strong>Удаление или демонтирование (Unmounting)</strong></p>
26 <p>В эту группу входит один метод. Он вызывается во время удаления компонента из DOM.</p>
26 <p>В эту группу входит один метод. Он вызывается во время удаления компонента из DOM.</p>
27 <ul><li>componentWillUnmount()</li>
27 <ul><li>componentWillUnmount()</li>
28 </ul><p>Такое количество методов объясняется сложностью реальной разработки. Но на практике лишь некоторые используются регулярно. К таким методам относится componentDidMount. С его помощью устанавливают таймеры, выполняют AJAX-запросы, меняют DOM в обход React. Последнее бывает нужно при интеграции со сторонними библиотеками.</p>
28 </ul><p>Такое количество методов объясняется сложностью реальной разработки. Но на практике лишь некоторые используются регулярно. К таким методам относится componentDidMount. С его помощью устанавливают таймеры, выполняют AJAX-запросы, меняют DOM в обход React. Последнее бывает нужно при интеграции со сторонними библиотеками.</p>