<Activity> приховує й відновлює частину інтерфейсу разом з її станом. Це проміжний варіант між «показати» і «прибрати з дерева».
import { Activity } from 'react';
<Activity mode={tab === 'comments' ? 'visible' : 'hidden'}>
<Comments />
</Activity>
Порівняння трьох підходів:
| Підхід | Стан | Ефекти | DOM |
|---|---|---|---|
{show && <Comments />} |
губиться при приховуванні | очищаються | видаляється |
CSS hidden |
зберігається | продовжують працювати | лишається |
<Activity mode="hidden"> |
зберігається | очищаються (підписки знімаються) | лишається, display: none |
Що відбувається в прихованому режимі:
- діти приховуються через
display: none; - ефекти знищуються - таймери, підписки, з'єднання закриваються, ніби компонент розмонтовано;
- стан і DOM зберігаються - введений текст, позиція прокрутки, розгорнуті секції;
- компоненти продовжують перерендерюватися при зміні props, але з нижчим пріоритетом, ніж видимий вміст;
- при поверненні у
visibleефекти створюються знову, стан на місці.
Застосування:
- вкладки й бічні панелі, де користувач очікує, що повернеться до того самого стану (заповнена форма, позиція в списку);
- попередній рендер: прихована вкладка, яку користувач, ймовірно, відкриє наступною, може заздалегідь завантажити дані й підготувати розмітку - перемикання буде миттєвим;
- історія навігації: зберегти попередній екран, щоб «Назад» відкривав його миттєво.
Що треба враховувати:
- ефекти мають правильно прибирати за собою - Activity активно використовує очищення ефектів. Компонент, що не відписується в очищенні, при приховуванні «протікатиме» (те, що й так ловить StrictMode);
- пам'ять: прихований вміст лишається в DOM і пам'яті. Десятки прихованих важких екранів - помітне навантаження;
- медіа: відео й аудіо в прихованому вмісті продовжують грати, якщо не зупинити їх в очищенні ефекту;
- прихована Activity, що рендерить лише текст, не рендерить нічого - немає DOM-елемента, якому призначити
display: none.
Раніше подібне робили вручну: тримали стан угорі або ховали через CSS, змиряючись із працюючими ефектами.