Вставка iframe в компонент реакции

У меня небольшая проблема. После запроса данных из службы я получил код iframe в ответ.

<iframe src="https://www.example.com/show?data..." width="540" height="450"></iframe>

Я хотел бы передать это как реквизит для моего модального компонента и отобразить его, но когда я просто {this.props.iframe} его в функции рендеринга, он явно отображает его как строку.

Каков базовый способ отображения его как html в реакции?

Ответ 1

Вы можете использовать свойство dangerouslySetInnerHTML, как это

const Component = React.createClass({
  iframe: function () {
    return {
      __html: this.props.iframe
    }
  },

  render: function() {
    return (
      <div>
        <div dangerouslySetInnerHTML={ this.iframe() } />
      </div>
    );
  }
});

const iframe = '<iframe src="https://www.example.com/show?data..." width="540" height="450"></iframe>'; 

ReactDOM.render(
  <Component iframe={iframe} />,
  document.getElementById('container')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="container"></div>

Ответ 2

Если вы не хотите использовать dangerouslySetInnerHTML, вы можете использовать приведенное ниже решение

var Iframe = React.createClass({     
  render: function() {
    return(         
      <div>          
        <iframe src={this.props.src} height={this.props.height} width={this.props.width}/>         
      </div>
    )
  }
});

ReactDOM.render(
  <Iframe src="http://plnkr.co/" height="500" width="500"/>,
  document.getElementById('example')
);

здесь доступна демо-версия Демо-версия

Ответ 3

С ES6 вы можете теперь делать это так

Пример Codepen URl для загрузки

const iframe = '<iframe height="265" style="width: 100%;" scrolling="no" title="fx." src="//codepen.io/ycw/embed/JqwbQw/?height=265&theme-id=0&default-tab=js,result" frameborder="no" allowtransparency="true" allowfullscreen="true">See the Pen <a href="#" onclick="location.href='https://codepen.io/ycw/pen/JqwbQw/'; return false;">fx.</a> by ycw(<a href="#" onclick="location.href='https://codepen.io/ycw'; return false;">@ycw</a>) on <a href="#" onclick="location.href='https://codepen.io'; return false;">CodePen</a>.</iframe>'; 

Функциональный компонент для загрузки Iframe

function Iframe(props) {
  return (<div dangerouslySetInnerHTML={ {__html:  props.iframe?props.iframe:""}} />);
}

Использование:

import React from "react";
import ReactDOM from "react-dom";
function App() {
  return (
    <div className="App">
      <h1>Iframe Demo</h1>
      <Iframe iframe={iframe} />,
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

Изменить на CodeSandbox:

https://codesandbox.io/s/react-iframe-demo-g3vst