2017-10-13 17 views
2

Reduxストアを使用するReactコンポーネントがあります。 componentDidMountでは、このコンポーネントはiframeに他のコンポーネントも追加する必要があります。このiframeは、コンポーネントコードでは作成されていない独立したものです。追加Reduxコンポーネントと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')); 
    } 

このコードではエラーは発生しません。新しいコンポーネントでは、SkCanvasconsole.logであり、このログはコンソールに表示されます。ちょうどhtmlのコードは、iframeの内側に表示されます。 もちろん、このコンポーネントをiframe以外の要素に追加しようとすると動作します。

どのようにすればいいですか?

ifrmae(init)にこのコンポーネントを手動で設定することもできますが、このコンポーネント間でストアを共有する必要があります。

ありがとうございました。

+0

_このコードはエラーを投げません。新しいコンポーネントSkCanvasでは、console.logにpropsがあり、このログはコンソールに表示されます。ちょうどhtmlコードでiframeの内部に表示されます._より正確なことができますか?どのコンポーネントを追加しますか? console.logのo/pとは何ですか? – Dane

+0

''は、他のコンポーネントによってiframeに追加されます。 SkCanvasでは 'console.log(props)'があり、このログは可視です。しかし、htmlはiframe内では表示されません。 一般的に私が必要とするのは、iframeとifindexのコードを区別するCSSスタイルを使用することだけです。 – jaroApp

+0

これは他のコンポーネントですか?どのコンポーネントにこの 'componentDidMount'が属していますか? – Dane

答えて

1

リアクトはcontextを超えてReactDOM.render()を保持しません。したがって、storeは、iframeの外部のコンポーネントと2つの別のReactDOM.render()を使用する場合は内部のコンポーネントの間で共有されません。
一般的に、HTML要素内でコンポーネントをレンダリングする場合は、次のパターンを使用できます。

あなたのHTML要素:

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

その後のjsファイル:

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

編集:にアプリを反応させ、iframeのレンダリングのために、あなたは​​を使用することができます。このライブラリは、Reduxストアがiframe内でも使用可能であることを保証します。参照:https://github.com/ryanseddon/react-frame-component/issues/29

+0

あなたの答えをありがとう。あなたの例を使って。標準の 'div'で' 'をレンダリングする必要があります。 iframeの ''のみです。私は 'FrameApp'の'

some

'で作ることができますが動作しません。 私の目標は、「」を使用して1つの店を使うことです。 'FrameApp'のネストされた要素の一部はiframeの外側になければならず、' 'はiframeの内側になければなりません。なぜなら、他の要素に使用するCSSスタイルからキャンバスを分離する必要があるからです。 – jaroApp

+0

私の更新された答えを見て、そのライブラリが問題を解決するかどうか確認してください – Dane

+0

それは動作するように見えます。私はストアがiframeのアクションの後に親コンポーネントでも更新されているかどうかをチェックする必要がありますが、今はうまくいきます。ありがとう。 – jaroApp

関連する問題