Skip to content

Commit

Permalink
docs(ModalRoot): add info about wrappers of modals (#8100)
Browse files Browse the repository at this point in the history
h2. Описание

В #6759 пропустил момент про обёртки.

h2. Release notes
h2. Документация
- ModalRoot: добавлен **FAQ** с информацией как создавать обёртки над `ModalPage` и `ModalCard`
- В документе **Миграция с v6 на v7** дополнена секция `ModalRoot` информацией касаемой обёртки над `ModalPage` / `ModalCard`
  • Loading branch information
inomdzhon authored and actions-user committed Dec 18, 2024
1 parent d14a7d6 commit 20cb391
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 0 deletions.
57 changes: 57 additions & 0 deletions packages/vkui/src/components/ModalRoot/Readme.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
Менеджер модальных окон.

- <a href="{{anchor}}">Спецификация</a>
- <a href="{{anchor}}">FAQ</a>
- <a href="{{anchor}}">Могу ли я создавать обёртки для `ModalPage` / `ModalCard`?</a>

# Спецификация

В качестве `children` принимает коллекцию [`ModalPage`](#/ModalPage) и/или [`ModalCard`](#/ModalCard). У каждого модального окна
должен быть уникальный `id`.

Expand Down Expand Up @@ -538,3 +544,54 @@ const App = () => {

<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 <div>{data}</div>;
};

const ModalPageWrapper = ({ id, ...restProps }) => {
const { activeModal } = useModalRootContext();

useEffect(function enableSomeEffect() {
if (id === activeModal) {
/* ... */
}
}, [id, activeModal];

return (
<ModalPage id={id} {...restProps}>
<SomeAsyncEffect />
</ModalPage>
);
};

const App = () => {
return (
<ModalRoot activeModal="example-1">
<ModalPageWrapper id="example-1" />
{/* или */}
<ModalPage id="example-2">
<SomeAsyncEffect />
</ModalPage>
</ModalRoot>
);
};
```
> ⚠️ У `ModalPage` и `ModalCard` есть параметр `keepMounted`, при передаче этого параметра следует учитывать, что компонент будет
> рендериться всегда, поэтому бизнес-логика будет срабатывать в любом случае.
43 changes: 43 additions & 0 deletions styleguide/pages/migration_v7.md
Original file line number Diff line number Diff line change
Expand Up @@ -1033,6 +1033,49 @@ const SomeWrapper = ({ id }) => (
</details>
<details>
<summary>Миграция (бизнес-логика в обёртках)</summary>
```diff
+ const FetchData = () => {
+ const [data, setData] = useState({});
+ useEffect(() => {
+ fetch('...').then((r) => r.json()).then(setData);
+ }, []);
+ return <div>{data}</div>;
+ };
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 (
<ModalPage id={id} {...restProps}>
- <div>{data}</div>
+ <FetchData>
</ModalPage>
);
};
<ModalRoot activeModal="m">
<SomeWrapper
id="m"
settlingHeight={100} // или dynamicContentHeight
/>
</ModalRoot>
```
</details>
<hr/>
### [OnboardingTooltip](https://vkcom.github.io/VKUI/7.0.0/#/OnboardingTooltip)
Expand Down

0 comments on commit 20cb391

Please sign in to comment.