Currently createPortal only works within the current renderer.
This means that if you want to embed one renderer into another (e.g. react-art in react-dom), your only option is to do an imperative render in a commit-time hook like componentDidMount or componentDidUpdate of the outer renderer's component. In fact that's exactly how react-art works today.
With this approach, nested renderers like react-art can't read the context of the outer renderers (#12796). Similarly, we can't time-slice updates in inner renderers because we only update the inner container at the host renderer's commit time.
At the time we originally discussed portals we wanted to make them work across renderers. So that you could do something like
<div>
<Portal to={ReactART}>
<surface>
<rect />
</surface>
</Portal>
</div>
But it's not super clear how this should work because renderers can bundle incompatible Fiber implementations. Whose implementation takes charge?
We'll want to figure something out eventually. For now I'm filing this for future reference.
Currently
createPortalonly works within the current renderer.This means that if you want to embed one renderer into another (e.g.
react-artinreact-dom), your only option is to do an imperative render in a commit-time hook likecomponentDidMountorcomponentDidUpdateof the outer renderer's component. In fact that's exactly howreact-artworks today.With this approach, nested renderers like
react-artcan't read the context of the outer renderers (#12796). Similarly, we can't time-slice updates in inner renderers because we only update the inner container at the host renderer's commit time.At the time we originally discussed portals we wanted to make them work across renderers. So that you could do something like
But it's not super clear how this should work because renderers can bundle incompatible Fiber implementations. Whose implementation takes charge?
We'll want to figure something out eventually. For now I'm filing this for future reference.