Я всегда считаю декларативную природу React одновременно и благословением, и болью. Когда вам нужно заботиться о том, как все должно выглядеть, у вас меньше времени, чтобы сосредоточиться на том, что важно: на том, что нужно делать.

Отображение / скрытие модального окна - одна из тех вещей, которые стали механическими для любого разработчика React, но могут извлечь большую пользу из другого подхода, который позволяет избежать распространения состояний и методов повсюду. Пришло время очистить наш код React.

Пример с React Vanilla 🍦

Вот очень простой пример, в котором мы открываем / закрываем случайное модальное окно:

Глядя на компонент App, мы видим, как все эти методы show / hide / handle занимают много места в нашем компоненте App, просто чтобы показать модальное окно!

Кроме того, мы всегда должны отслеживать видимость модального окна и сохранять его в состоянии. Что, если вам нужно 5 модальных окон на этом экране? В более крупном приложении вы бы хотели, чтобы ваши состояния были чистыми и были ориентированы на функциональную логику. Помните, что этим компонентам верхнего уровня, скорее всего, уже многое предстоит обработать.

Давайте посмотрим, как мы можем исправить этот беспорядок, используя волшебную библиотеку Recompose и создав компонент более высокого порядка, который будет обрабатывать все эти состояния и методы за нас.

Очистка с помощью Recompose ✨

Recompose - это библиотека, которая существенно улучшает компоненты, добавляя состояние, методы или свойства с помощью функций. Хотя наше приложение по-прежнему будет выполнять эти объявления и изменения состояния, объявлять их не нужно, поскольку наши функции будут делать это за нас за кулисами.

Начнем с npm install recompose --save

Теперь нам нужно сделать то же самое, что и в Vanilla, но объявить это внутри нашего компонента более высокого порядка. Для этого мы используем метод withState(), который инкапсулирует для нас состояние, метод, который влияет на это состояние, и начальное значение.

Уже сейчас видно, что вся наша работа сделана. Нам больше не нужно объявлять this.state = { isVisible: false } внутри нашего компонента. Нам также не нужны эти методы отображения / скрытия. Это означает, что мы можем превратить наше приложение в компонент без сохранения состояния!

Теперь мы можем просто получить доступ к нашему недавно созданному переключателю и состояниям более высокого порядка из реквизита и аккуратно обработать нашу логику:

Мы устранили необходимость объявлять наше состояние и методы, которые загрязняли наш компонент, что оставляет нам красивый и намного более чистый код.

Бонус: прикрепите функцию высшего порядка к модальному файлу

Если вы объявляете свой модальный компонент в его собственном Modal.jsx файле, вы можете переместить с ним метод withModal и очистить его еще больше.

Теперь у вас остался функциональный код, который можно использовать повторно, который выглядит хорошо. Довольно круто, правда? 🤙