Skip to content

Instantly share code, notes, and snippets.

@ggrumbley
Forked from gunn/frame.tsx
Created May 4, 2023 15:47
Show Gist options
  • Save ggrumbley/43a118b9de07a18d65ae7985c32781db to your computer and use it in GitHub Desktop.
Save ggrumbley/43a118b9de07a18d65ae7985c32781db 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