Используйте Порталы из библиотеки react-dom
:
Порталы предоставляют первоклассный способ визуализации дочерних элементов в узле DOM, который существует вне иерархии DOM родительского компонента.
const HeaderPortal = ReactDOM.createPortal(<Header />, document.getElementById('header'))
const SideBarPortal = ReactDOM.createPortal(<SideBar />, document.getElementById('sidebar'))
const store = createStore(/* ... */)
ReactDOM.render(
<YourDataStoreProvider store={store}>
<HeaderPortal />
<SideBarPortal />
</YourDataStoreProvider>,
document.getElementById('root') // assuming you have an empty "dummy" node with that id
);
Просто визуализируйте свое приложение в контейнере в любом месте вашей модели DOM или создайте новый «фиктивный» узел. В моем примере я предполагаю, что есть пустой узел с идентификатором root
. Затем визуализируйте другие компоненты в портал.
Работает ли редукционное хранилище между разными ReactDOM?
Ваше приложение будет работать так, как если бы оно было полностью отрисовано в том же контейнере. Если вы используете порталы, ваши компоненты будут находиться в одном дереве компонентов с тем же контекстом, а визуализироваться где-то еще.
Стоит ли использовать порталы?
Использование порталов обычно предназначено для компонентов, которые визуально должны «вырваться» из своего контейнера, таких как модальные окна или диалоги. Но вы также можете использовать их для создания компонентов, похожих на виджеты, которые можно отображать где угодно.
Создание универсального компонента портала
Вы также можете создать общий компонент <Portal>
, который создает портал с контейнером id
:
import {createPortal} from 'react-dom';
const Portal = ({children, container}) => createPortal(
children,
document.getElementById(container),
);
export default Portal;
И используйте это следующим образом:
ReactDOM.render(
<YourDataStoreProvider store={store}>
<Portal container="header">
<Header />
</Portal>
<Portal container="sidebar">
<SideBar />
</Portal>
</YourDataStoreProvider>,
document.getElementById('root')
);
ИЗМЕНИТЬ:
Вам нужен один узел в DOM, где вы можете отображать свое приложение. Это может быть новый элемент DOM, который вы создаете, или один из уже имеющихся у вас контейнеров. Если вы используете компонент <Portal>
сверху, это также может выглядеть так:
ReactDOM.render(
<YourDataStoreProvider store={store}>
<Header /> // this will be visible in your header container
<Portal container="sidebar">
<SideBar /> // this will be rendered to the sidebar container
</Portal>
</YourDataStoreProvider>,
document.getElementById('header')
);
Это отобразит ваше приложение в контейнере header
. Но только ваш компонент <Header>
будет фактически иметь представление DOM в этом контейнере. Боковая панель будет отображаться порталом в контейнере sidebar
. Но все же они будут иметь одно и то же дерево компонентов реакции и одного и того же поставщика хранилища.
person
trixn
schedule
25.04.2018