Как стать автором
Обновить

Комментарии 17

В какой момент собственно вы проверяете overflow:hidden и заменяете this.node в компоненте? Ведь он должен быть document.body, а в нормальных условиях как обычно родитель где используется компонент. Тема довольно интересная.
Не уверен, что правильно понял — поправьте если что. Мы не проверяем есть ли overflow у родителей, но идея интересная, можно поисследовать.
немного вышел из контекста, в самом начале статьи была речь об overflow:hidden, собственно выходит портал должен динамично понимать куда ему вставляться ( в body, или в родителя ), также интересно что можно сделать с CSS классами, которые меняют отображения компонентов внутри себя, если в этом случае он встанет в body.
Портал просто рендерит в body, например. Захотите вы его открывать или нет — это уже другой вопрос. Как и условия, при которых он нужен. Мы сейчас всегда рендерим через порталы, т. к. это намного проще.
В целом понятно, идея хорошая, из минусов при таком подходе будет что контекст родителей (css стилей, Js) не будет накладываться на портал, но этого в данном случае и не требуется.
Из минусов можно добавить, что серверный рендеринг скорее всего не работает.
Да, точно. Но обычно такие элементы скрыты в итоге это не настолько критично (мы недавно завели серверный рендеринг и проблем пока не наблюдаем).
Такой подход противоречит идеологии ReactJS, лучше использовать возможности фреймворка, например брать модальные окна из стора.
Что конкретно в этой подходе противоречит идеологии реакта? Как по вашему должна решаться эта проблема в рамках вашего представления об идеологии реакта?

Сторы, экшены и прочий флакс к реакту имеют опосредованное отношение.
Что это, блин, вообще значит — «брать модальные окна из стора»?
Буквально один в один 3 дня назад статья была, писал там, что лучше не ReactDOM.render, а ReactDOM.unstable_renderComponentIntoSubtree, так как сохранится контекст.
Спасибо за замечание, обновим модуль.
Я не хотел показаться грубым, если что :)
Мы в команде, в итоге, чтобы не городить велосипедов, взяли реализацию на хорошей поддержке — react-overlays
Есть еще отличный https://github.com/tajo/react-portal, если нужен только «портал».
Впрочем, оба используют ReactDOM.unstable_renderComponentIntoSubtree, в целом похожи, а с react-overlays идут еще несколько ништяков в виде более высокоуровневых компонентов.
По хорошему наверное в componentWillUnmout нужен removeEventListener?
Да, и ноду удалить тоже нужно. Примеры на jsfiddle более подробные
Зарегистрируйтесь на Хабре, чтобы оставить комментарий