2015-11-25 79 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

根據我的理解在React使用危險SetInnerHTML是不是一個好的做法和雅如果你認爲我的解決方案將是一個答案,然後接受它 –

+2

感謝您的代碼..這比使用dangersoulySetHtml – John