@exelenet

Инверсия зависимостей в React! Почему это анти-паттерн?

Всем доброго времени суток! Не даёт покоя давно этот вопрос: почему вызов методов из дочернего компонента в реакте является плохим тоном? Разве это не повышает переиспользуемость и слабую связь между родителем и ребёнком?
Вот, я даже схемку нарисовал
5e39da46cbc97456324939.png
Т.е. store - доменная модель приложения организованная через redux, mobx или даже хуки+контекст тут всё ясно,
с контейнером тоже всё ясно, является связующим звеном между моделью и компонентом (Виджетом).

Самое интересное дальше. Виджет - это инкапсулированная единица интерфейса, которая по идее должна работать независимо от приложения, и начинать сразу работать при переносе её куда-либо в другое место. У него самого есть как бы провода, которые как раз контейнерный компонент подключает к модели для связи с внешним миром. Он в свою очередь состоит из простых, но в то же время самостоятельных компонентов (кружки на схемке). Общение между ними протекает через интерфейсы, собственно квадраты на рисунке (спасибо useImperativeHandle и ref, которые не рекомендуют использовать).

Источник правды всегда 1. Только самих источников не один (что не является преступлением). Для бизнес логики в модели, для графического интерфейса - в компонентах. И да, я стрелочку забыл отобразить в обе стороны между контейнером и виджетом. Так вот почему так не рекомендуется делать?:)
  • Вопрос задан
  • 153 просмотра
Пригласить эксперта
Ответы на вопрос 1
Robur
@Robur
Знаю больше чем это необходимо
Поделитесь откуда вы взяли что это антипаттерн?
И где тут инверсия зависимостей?

В целом то что вы описали - не только "можно" но и распространенная схема.

Widget предоставляет интерфейс для работы с ним - такие то пропсы можно передать,
такие то методы он может принять.

Дальше container организует ему это все. И тут Widget является источником api - что у него в логике и в пропсах прописано - так и надо использовать.

Какой там Container уже все равно пока он использует Widget правильно.

Если вы хотите в Widget передавать компоненты которые этот Widget должен внутри себя рендерить - это тоже нормально, для Widget это просто еще один из пропсов.

классический пример (не считая уже встроенного в JSX children) - кнопка с иконкой, кнопка в пропсах объявляет что у нее есть возможность получить иконку, и предполагает что-то насчет нее (например она должна быть квадратной, не больше 40 пикс и тп)

А дальше вы в Container пишете <IconButton icon={<Icon/>}>Hello</IconButton>

Никакое знание о вашем контейнере в кнопке не нужно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы