Skip to content

Instantly share code, notes, and snippets.

@chriswitko
Forked from gunn/frame.tsx
Created October 18, 2020 17:16
Show Gist options
  • Save chriswitko/178915dedbea971aa2bb7079edaf61a5 to your computer and use it in GitHub Desktop.
Save chriswitko/178915dedbea971aa2bb7079edaf61a5 to your computer and use it in GitHub Desktop.
Render react content in an iframe
import * as React from 'react'
import { createPortal } from 'react-dom'
type FrameProps = React.IframeHTMLAttributes<HTMLIFrameElement> & {
head?: React.ComponentType<any>
children?: React.ReactNode
}
const Frame = React.memo(({head, children, ...iframeProps}: FrameProps)=> {
const node = React.useRef<HTMLIFrameElement>()
const [doc, setDoc] = React.useState<Document>()
React.useEffect(()=> {
setDoc(node.current.contentDocument)
}, [])
return (
<iframe {...iframeProps} ref={node}>
{ doc && createPortal(head, doc.head) }
{ doc && createPortal(children, doc.body) }
</iframe>
)
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment