Reactjs: Модальные окна на хуках без контекста

Reactjs: Модальные окна на хуках без контекста

@ychebotaev

Мне нравится подход к модальным окнам, когда я могу из разных мест приложения управлять одним и тем же модальным окном:

Пример использования модального окна

Из данного кода очевидно, что paymentModal регистрируется где-то выше.

Идея использовать контекст для модальных окон в корне приложения мне не нравится, поскольку это влечет за собой муки выбора в таком случае:

Приложение с аутентификацией
Я бы выбрал первый вариант

Поэтому, я решил попробовать реализовать модальные окна иначе, делая вид, будто бы это HOC:

Регистрация модального окна

Я не нахожу существенных недостатков в том, что модальные окна рисуются в стороне от основного приложения.

public/index.html (CRA)

Такое решение влечет за собой необходимость регистрации #modals как точку монтирования модальных окон, параллельно с ReactDOM.render:

Регистрация точки монтирования модальных окон

В итоге, получается возможность обращаться к модальному окну из нескольких независимых компонентов без использования общего контекста:

Одно и то же модальное окно управляется из двух разных мест

Внутри это работает предельно просто: modal(() => ...) создает контекст модального окна, а useModal подхватывает его и делает ему render():

modal() (Демонстрация идеи, финальный код сложнее)
useModal() (Демонстрация идеи, финальный код сложнее)

На этом, собственно, и все.

Благодаря такой нехитрой конструкции одним и тем же модальным окном удается управлять из разных мест:

Пример управления окном

С полной реализацией и примером можно ознакомиться в CodeSandbox-е.

Мнение по поводу решения можно выразить в группе @react_ru в Telegram.

Report Page