• Stars
    star
    1,684
  • Rank 26,579 (Top 0.6 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created almost 10 years ago
  • Updated 6 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Render your React app to an iFrame

React <Frame /> component

NPM version Build Status Dependency Status

This component allows you to encapsulate your entire React application or per component in an iFrame.

npm install --save react-frame-component

How to use:

import Frame from 'react-frame-component';

Go check out the demo.

const Header = ({ children }) => (
  <Frame>
    <h1>{children}</h1>
  </Frame>
);

ReactDOM.render(<Header>Hello</Header>, document.body);

Or you can wrap it at the render call.

ReactDOM.render(
  <Frame>
    <Header>Hello</Header>
  </Frame>,
  document.body
);
Props:
head

head: PropTypes.node

The head prop is a dom node that gets inserted before the children of the frame. Note that this is injected into the body of frame (see the blog post for why). This has the benefit of being able to update and works for stylesheets.

initialContent

initialContent: PropTypes.string

Defaults to '<!DOCTYPE html><html><head></head><body><div></div></body></html>'

The initialContent props is the initial html injected into frame. It is only injected once, but allows you to insert any html into the frame (e.g. a head tag, script tags, etc). Note that it does not update if you change the prop. Also at least one div is required in the body of the html, which we use to render the react dom into.

mountTarget

mountTarget: PropTypes.string

The mountTarget props is a css selector (#target/.target) that specifies where in the initialContent of the iframe, children will be mounted.

<Frame
  initialContent='<!DOCTYPE html><html><head></head><body><h1>i wont be changed</h1><div id="mountHere"></div></body></html>'
  mountTarget='#mountHere'
  >
</Frame>
contentDidMount and contentDidUpdate

contentDidMount: PropTypes.func contentDidUpdate: PropTypes.func

contentDidMount and contentDidUpdate are conceptually equivalent to componentDidMount and componentDidUpdate, respectively. The reason these are needed is because internally we call ReactDOM.render which starts a new set of lifecycle calls. This set of lifecycle calls are sometimes triggered after the lifecycle of the parent component, so these callbacks provide a hook to know when the frame contents are mounted and updated.

ref

ref: PropTypes.oneOfType([ PropTypes.func, PropTypes.shape({ current: PropTypes.instanceOf(Element) }) ])

The ref prop provides a way to access inner iframe DOM node. To utilitize this prop use, for example, one of the React's built-in methods to create a ref: React.createRef() or React.useRef().

const MyComponent = (props) => {
  const iframeRef = React.useRef();

  React.useEffect(() => {
    // Use iframeRef for:
    // - focus managing
    // - triggering imperative animations
    // - integrating with third-party DOM libraries
    iframeRef.current.focus()
  }, [])

  return (
    <Frame ref={iframeRef}>
      <InnerComponent />
    </Frame>
  );
}
Accessing the iframe's window and document

The iframe's window and document may be accessed via the FrameContextConsumer or the useFrame hook.

The example with FrameContextConsumer:

import Frame, { FrameContextConsumer } from 'react-frame-component'

const MyComponent = (props, context) => (
  <Frame>
    <FrameContextConsumer>
      {
        // Callback is invoked with iframe's window and document instances
        ({document, window}) => {
          // Render Children
        }
      }
    </FrameContextConsumer>
  </Frame>
);

The example with useFrame hook:

import Frame, { useFrame } from 'react-frame-component';

const InnerComponent = () => {
  // Hook returns iframe's window and document instances from Frame context
  const { document, window } = useFrame();

  return null;
};

const OuterComponent = () => (
  <Frame>
    <InnerComponent />
  </Frame>
);

More info

I wrote a blog post about building this component.

License

Copyright 2014, Ryan Seddon. This content is released under the MIT license http://ryanseddon.mit-license.org

More Repositories

1

H5F

Deprecated, please use hyperform instead https://github.com/hyperform/hyperform
JavaScript
743
star
2

bunyip

Automate client-side unit testing in real browsers using the CLI
JavaScript
383
star
3

source-map

This is an unconnected fork of Mozilla's source-map library
JavaScript
224
star
4

60fps-scroll

Deprecated - A little library that *could* make your site scroll faster
JavaScript
213
star
5

redux-debounced

Debounce middleware for Redux
JavaScript
166
star
6

slideshowbob

The evil, fumbling, JavaScript free, slide thingy
CSS
98
star
7

ScrollListView

Performant list view that re-uses cells to display large data sets
JavaScript
80
star
8

font-dragr

Drag and drop font testing
HTML
67
star
9

gulp-es6-module-transpiler

JavaScript
61
star
10

bootleg

Bootleg: Dodgy JavaScript free bootstrap plugins
HTML
60
star
11

earthin24

Source code for my twitter bot https://twitter.com/earthin24
Go
22
star
12

yeti-adaptors

Use Yeti with other client-side testing frameworks
JavaScript
18
star
13

sourcemap-onerror

Lookup original location from window.onerror by querying source map
JavaScript
18
star
14

web-components

A talk about web components. What they are and what they offer.
CSS
17
star
15

BrowserSocket

Create a socket server in the browser
JavaScript
15
star
16

sunrise-lifx

Simulate a sunrise effect using the Lifx ruby gem
Ruby
15
star
17

markdown-component

A Web Component to parse markdown to html
14
star
18

picture-component

<x-picture> element for responsive images
6
star
19

SUX

SUX.js a little JavaScript helper to expand short URLs
JavaScript
6
star
20

spaces-talk

Super serious talk on why spaces are the best and you're an idiot if you use tabs
JavaScript
6
star
21

FSA

JavaScript library to give you some helper methods to read and write files or directories using the new File API: Directories and System API
JavaScript
5
star
22

jemena-powershop

Jemena + powershop = almost realtime total power usage
JavaScript
4
star
23

solar-dashboard

A solar dashboard for the Adafruit MagTag
Python
4
star
24

slideshow-component

Every developer who does a talk on Web Components inevitably creates a slideshow component
4
star
25

flexbox-wds13

Flexbox talk for Web Diretions South 2013
JavaScript
3
star
26

travis-ci-templates

A series of templates to get you started with travis-ci integration in your repo
JavaScript
3
star
27

webcomponents-talk

The Composable Web with Web Components
CSS
2
star
28

es6-module-macro

ES6 Module macro that expands to commonjs
JavaScript
1
star
29

css-switch

A simple recreation of the iOS toggle switch using CSS
CSS
1
star
30

layouts

Demo jekyll templates for my projects
1
star
31

webpack-talk

A short look at webpack a module bundler for building web applications
CSS
1
star
32

dumplingsjs.com

Dumplings and JavaScript
1
star
33

bespoke-dir

Add a class to the slide parent element to let you know which direction the slides are going
JavaScript
1
star
34

source-map-workflows

A collection of workflows for client side apps that involve creating source maps
1
star