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)