-
-
Save robertgonzales/b1966af8d2a428a8299663b92fb2fe03 to your computer and use it in GitHub Desktop.
| class Frame extends Component { | |
| componentDidMount() { | |
| this.iframeHead = this.node.contentDocument.head | |
| this.iframeRoot = this.node.contentDocument.body | |
| this.forceUpdate() | |
| } | |
| render() { | |
| const { children, head, ...rest } = this.props | |
| return ( | |
| <iframe {...rest} ref={node => (this.node = node)}> | |
| {this.iframeHead && ReactDOM.createPortal(head, this.iframeHead)} | |
| {this.iframeRoot && ReactDOM.createPortal(children, this.iframeRoot)} | |
| </iframe> | |
| ) | |
| } | |
| } | |
| <Frame head={<title>Hello World</title>}> | |
| <h1>Hello World</h1> | |
| </Frame> |
| class Shadow extends Component { | |
| componentDidMount() { | |
| this.shadowRoot = this.node.attachShadow({ mode: this.props.mode }) | |
| this.forceUpdate() | |
| } | |
| render() { | |
| const { children, ...rest } = this.props | |
| return ( | |
| <div {...rest} ref={node => (this.node = node)}> | |
| {this.shadowRoot && ReactDOM.createPortal(children, this.shadowRoot)} | |
| </div> | |
| ) | |
| } | |
| } | |
| <Shadow mode="open"> | |
| <h1>Hello World</h1> | |
| </Shadow> |
I'm trying this in Firefox 59.0.2 and the content appears for a split second and then disappears: https://codesandbox.io/s/4j72vl564x
Does anyone know how to solve this?
UPDATE: Fixed https://codesandbox.io/s/4lr7oxxrl7 π
I think get correct <body> node in <iframe> must be at the onLoad event
Thank you so much π
Using React Hooks and createPortal:
https://codesandbox.io/s/iframe-demo-zd0b0
This one really helpful, Thanks
I'm trying this in Firefox 59.0.2 and the content appears for a split second and then disappears: https://codesandbox.io/s/4j72vl564x
Does anyone know how to solve this?
UPDATE: Fixed https://codesandbox.io/s/4lr7oxxrl7 πI think get correct
<body>node in<iframe>must be at theonLoadeventThank you so much π
This worked for me as well, thanks!
I used the shadow dom to isolate Styles here is the functional component version of it:
const ShadowWrapper = (props) => {
const { children, mode = "open", ...rest } = props;
const ref = useRef();
const [shadowRoot, setShadowRoot] = useState(null);
useEffect(() => {
setShadowRoot(ref.current.attachShadow({ mode }));
}, []);
return (
<div {...rest} ref={ref}>
{shadowRoot && ReactDOM.createPortal(children, shadowRoot)}
</div>
);
};
Add
this.shadowRoot.appendChild(this.props.style)after attaching the shadow. Pass a style element as a prop.