2015-11-25 2 views
7

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

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

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

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

ответ

13

Вы можете использовать свойство 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>

также, вы можете скопировать все атрибуты из строки (на основе вопроса, вы получите IFRAME как строка с сервера), которая содержит тег и передает его на новый тег, например

/** 
 
* getAttrs 
 
* returns all attributes from TAG string 
 
* @return Object 
 
*/ 
 
const getAttrs = (iframeTag) => { 
 
    var doc = document.createElement('div'); 
 
    doc.innerHTML = iframeTag; 
 

 
    const iframe = doc.getElementsByTagName('iframe')[0]; 
 
    return [].slice 
 
    .call(iframe.attributes) 
 
    .reduce((attrs, element) => { 
 
     attrs[element.name] = element.value; 
 
     return attrs; 
 
    }, {}); 
 
} 
 

 
const Component = React.createClass({ 
 
    render: function() { 
 
    return (
 
     <div> 
 
     <iframe {...getAttrs(this.props.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>

18

Если вы не хотите использовать 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') 
); 

здесь демо доступно Demo

+0

это не то, что я не хочу его использовать. Я не уверен на 100%, как это может пойти не так. Ваше решение чистое, я просто потребовал бы, чтобы я разбирал строку, чтобы извлечь значения. – Kocur4d

+0

в соответствии с моим пониманием в Реаге использовать опасноSetInnerHTML не является хорошей практикой, и если вы считаете, что мое решение будет ответом, тогда примите его –

+2

спасибо за этот код .. это лучше, чем использование dangersoulySetHtml – John

Смежные вопросы