react-frame-component vs react-iframe
React Iframe Libraries
react-frame-componentreact-iframe
React Iframe Libraries

Both 'react-frame-component' and 'react-iframe' are libraries designed to facilitate the integration of iframes within React applications. They provide developers with tools to embed external content seamlessly while maintaining the React component lifecycle. 'react-frame-component' allows for the creation of iframes with a full document context, enabling the use of styles and scripts within the iframe, while 'react-iframe' offers a simpler approach to embedding content with basic customization options. Each package serves different needs based on the complexity of the iframe integration required in a React application.

Npm Package Weekly Downloads Trend
3 Years
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
react-frame-component231,6981,81222 kB282 years agoMIT
react-iframe97,647440331 kB24-ISC
Feature Comparison: react-frame-component vs react-iframe

Document Context

  • react-frame-component:

    The 'react-frame-component' creates a full document context for the iframe, allowing developers to include their own styles and scripts within the iframe. This means that any CSS or JavaScript included in the iframe will not interfere with the parent document and vice versa, providing a clean separation of concerns.

Customization Options

  • react-frame-component:

    This library offers extensive customization options, allowing developers to manipulate the iframe's content and styles directly. You can pass props to control the iframe's behavior, such as its height, width, and scrolling options, making it highly adaptable to various use cases.

Simplicity and Ease of Use

  • react-iframe:

    The 'react-iframe' library is straightforward to use, providing a simple API for embedding iframes. It requires minimal configuration and is ideal for developers who want to quickly integrate external content without the overhead of managing a full document context.

Performance

  • react-frame-component:

    While 'react-frame-component' provides powerful features, it can introduce performance overhead due to the complexity of managing a full document context. Developers should consider this when embedding multiple iframes or when performance is a critical factor.

Use Cases

  • react-iframe:

    'react-iframe' is best suited for scenarios where you need to display static content, such as videos, maps, or simple web pages. It is not ideal for applications that require interaction with the iframe's content or complex styling.

How to Choose: react-frame-component vs react-iframe
  • react-frame-component:

    Choose 'react-frame-component' if you need a full document context for your iframe, allowing for advanced styling and scripting capabilities. It is ideal for applications that require isolation of styles and scripts or when you need to embed complex content that needs its own document structure.

  • react-iframe:

    Choose 'react-iframe' for simpler use cases where you just need to embed external content without the need for a full document context. It is suitable for straightforward iframe integrations where customization and isolation are not primary concerns.

README for react-frame-component

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