diff --git a/packages/vkui/src/components/ModalRoot/Readme.md b/packages/vkui/src/components/ModalRoot/Readme.md
index 9573dd87be..6467590788 100644
--- a/packages/vkui/src/components/ModalRoot/Readme.md
+++ b/packages/vkui/src/components/ModalRoot/Readme.md
@@ -1,5 +1,11 @@
Менеджер модальных окон.
+- Спецификация
+- FAQ
+ - Могу ли я создавать обёртки для `ModalPage` / `ModalCard`?
+
+# Спецификация
+
В качестве `children` принимает коллекцию [`ModalPage`](#/ModalPage) и/или [`ModalCard`](#/ModalCard). У каждого модального окна
должен быть уникальный `id`.
@@ -538,3 +544,54 @@ const App = () => {
;
```
+
+# FAQ
+
+## Могу ли я создавать обёртки для `ModalPage` / `ModalCard`?
+
+Да, но нужно учитывать, что бизнес-логика должна либо вызываться внутри `ModalPage` / `ModalCard`, либо включаться в зависимости от
+контекста `useModalRootContext()`, т.к. `ModalRoot` лишь передаёт через контекст свойство `activeModal`, а `ModalPage` / `ModalCard`
+сравнивают его значение со своим `id` / `nav` – если совпадает, монтируются; иначе размонтируются.
+
+```jsx static
+const SomeAsyncEffect = () => {
+ const [data, setData] = useState({});
+ useEffect(function fetchData() {
+ fetch('...')
+ .then((r) => r.json())
+ .then(setData);
+ }, []);
+ return
{data}
;
+};
+
+const ModalPageWrapper = ({ id, ...restProps }) => {
+ const { activeModal } = useModalRootContext();
+
+ useEffect(function enableSomeEffect() {
+ if (id === activeModal) {
+ /* ... */
+ }
+ }, [id, activeModal];
+
+ return (
+
+
+
+ );
+};
+
+const App = () => {
+ return (
+
+
+ {/* или */}
+
+
+
+
+ );
+};
+```
+
+> ⚠️ У `ModalPage` и `ModalCard` есть параметр `keepMounted`, при передаче этого параметра следует учитывать, что компонент будет
+> рендериться всегда, поэтому бизнес-логика будет срабатывать в любом случае.
diff --git a/styleguide/pages/migration_v7.md b/styleguide/pages/migration_v7.md
index b80dbdea46..66ab7aebdb 100644
--- a/styleguide/pages/migration_v7.md
+++ b/styleguide/pages/migration_v7.md
@@ -1033,6 +1033,49 @@ const SomeWrapper = ({ id }) => (
+
+Миграция (бизнес-логика в обёртках)
+
+```diff
++ const FetchData = () => {
++ const [data, setData] = useState({});
++ useEffect(() => {
++ fetch('...').then((r) => r.json()).then(setData);
++ }, []);
++ return {data}
;
++ };
+
+const SomeWrapper = ({ id, ...restProps }) => {
+- const [data, setData] = useState({});
+- useEffect(() => {
+- fetch('...').then((r) => r.json()).then(setData);
+- }, []);
+
++ const { activeModal } = useModalRootContext();
+ useEffect(function enableSomeEffect() {
++ if (id === activeModal) {
+ /* ... */
++ }
+ }, [id, activeModal];
+
+ return (
+
+- {data}
++
+
+ );
+};
+
+
+
+
+```
+
+
+
### [OnboardingTooltip](https://vkcom.github.io/VKUI/7.0.0/#/OnboardingTooltip)