2017-10-13 2 views
2

Ich habe React-Komponente, was Redux Store verwenden. In componentDidMount sollte diese Komponente auch eine andere Komponente zu iframe hinzufügen. Dieser Iframe ist unabhängig und wird nicht im Komponentencode erstellt.Append Reagieren mit Redux-Komponente in iframe

<iframe src="empty.html"></iframe> 

componentDidMount(){ 
    let iframe = document.querySelector('iframe'); 
    let iframeBody = iframe.contentWindow.document.body; 
    let el = iframe.contentWindow.document.createElement('div'); 
    iframeBody.appendChild(el); 
    ReactDOM.render(<ReactRedux.Provider store={store}><SkCanvas /></ReactRedux.Provider>,iframeBody.querySelector('div')); 
    } 

Dieser Code wirft keine Fehler. In der neuen Komponente SkCanvas ist console.log mit Requisiten und dieses Protokoll wird in meiner Konsole angezeigt. Nur HTML-Code ist es in Iframe sichtbar. Natürlich, wenn ich versuche, diese Komponente zu einem Element außerhalb iframe hinzuzufügen, funktioniert es.

Irgendein Hinweis, wie kann ich es dort hinzufügen?

Es ist auch möglich, diese Komponente manuell in ifrmae (on init) zu setzen, aber ich muss Speicher zwischen diesen Komponenten freigeben.

Vielen Dank im Voraus für Hinweise.

+0

_Dieser Code wirft keine Fehler. In der neuen Komponente SkCanvas ist console.log mit Requisiten und dieses Protokoll wird in meiner Konsole angezeigt. Nur HTML-Code ist es sichtbar in iframe._ Können Sie genauer sein? Welche Komponenten möchten Sie anhängen? Was ist das O/P von console.log? – Dane

+0

'' in iframe durch andere Komponente anhängen. In SkCanvas ist 'console.log (reps)' und dieses Protokoll ist sichtbar. Aber html ist nicht sichtbar in iframe. Im Allgemeinen nur eine Sache, die ich brauche, ist getrennte CSS-Stile für Code-ID iframe und außerhalb verwenden. – jaroApp

+0

Welches ist die _andere Komponente_? Zu welcher Komponente gehört dieser 'componentDidMount'? – Dane

Antwort

1

React behält nicht context über ReactDOM.render(). So wird die store nicht zwischen den Komponenten außerhalb iframe und innerhalb geteilt, wenn Sie 2 separate ReactDOM.render() s verwenden.
Wenn Sie eine Komponente in einem beliebigen HTML-Element rendern möchten, können Sie das folgende Muster verwenden.

Ihr HTML-Element:

<iframe id='iframe1'></iframe> 

Dann js-Datei:

import React, { Component } from 'react'; 
import ReactDOM from 'react-dom'; 
import {Provider} from 'react-redux'; 

const store = configureStore(); 

class SkCanvas extends Component { 
    render() { 
    . 
    . 
    . 
    } 
} 

class FrameApp extends Component { 
    render() { 
    return (
     <Provider store={store}> 
     <SkCanvas/> 
     </Provider> 
    ); 
    } 
} 

ReactDOM.render(
    <FrameApp/>, 
    document.getElementById('iframe1') 
); 

Edit: Für App in und iframe Reagieren Rendering, können Sie react-frame-component verwenden. Diese Bibliothek stellt sicher, dass der Redux-Speicher auch innerhalb des Iframes verfügbar ist. Siehe auch https://github.com/ryanseddon/react-frame-component/issues/29

+0

Danke für deine Antwort. Verwenden Sie Ihr Beispiel. Ich muss ' 'im Standard' div' rendern. Und nur '' in iframe. Ich kann 'FrameApp''

some

'machen, aber es funktioniert nicht. Mein Ziel ist: Verwenden Sie einen Laden, was ich kann '' verwenden. Ein Teil der verschachtelten Elemente in 'FrameApp' sollte außerhalb von iframe liegen und ein' ' sollte innerhalb von iframe liegen, da ich Canvas von CSS-Stilen trennen muss, was ich für andere Elemente verwende. – jaroApp

+0

siehe meine aktualisierte Antwort und prüfen, ob diese Bibliothek das Problem löst – Dane

+0

es sieht aus, dass es funktioniert. Ich muss überprüfen, ob das Geschäft auch in der Elternkomponente nach der Aktion in iframe aktualisiert wird, aber jetzt funktioniert es gut. Vielen Dank. – jaroApp