2015-11-25 22 views
7

Tôi gặp sự cố nhỏ. Sau khi yêu cầu dữ liệu từ một dịch vụ, tôi nhận được mã iframe để phản hồi.Chèn khung nội tuyến vào thành phần phản ứng

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

Tôi muốn chuyển thông tin này như là một đạo cụ để phần modal của tôi và hiển thị nó nhưng khi tôi chỉ đơn giản {this.props.iframe} nó trong render chức năng nó được rõ ràng hiển thị nó như là một chuỗi.

Cách cơ bản để hiển thị dưới dạng html trong phản ứng là gì?

Trả lời

13

Bạn có thể sử dụng tài sản dangerouslySetInnerHTML, như thế này

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>

cũng có, bạn có thể sao chép tất cả các thuộc tính từ chuỗi (dựa trên các câu hỏi, bạn sẽ có được iframe như một chuỗi từ máy chủ) chứa thẻ và chuyển thẻ đó đến thẻ mới, như thế

/** 
 
* 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

Nếu bạn không muốn sử dụng dangerouslySetInnerHTML sau đó bạn có thể sử dụng các giải pháp dưới đây đề cập

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') 
); 

bản demo ở đây sống có sẵn Demo

+0

nó không phải là tôi không muốn sử dụng nó Tôi không chắc chắn 100% làm thế nào nó có thể đi sai. Giải pháp của bạn là sạch sẽ Tôi chỉ cần tôi phân tích chuỗi để trích xuất các giá trị. – Kocur4d

+0

theo hiểu biết của tôi trong React để sử dụng dangerouslySetInnerHTML không phải là một thực hành tốt và ya nếu bạn nghĩ rằng giải pháp của tôi sẽ là một câu trả lời thì chấp nhận nó –

+2

cảm ơn mã này .. điều này tốt hơn sử dụng dangersoulySetHtml – John

Các vấn đề liên quan