2017-05-02 32 views
2

私が開発したReact/Reduxアプリケーションはiframe内に存在する必要があります。周囲のドキュメントには、内部からメッセージを送信してiframeのサイズを変更するように指示することができます。 DOMが変更されるたびにサイズ変更メッセージを送信したいと思います。React/Reduxアプリケーションの(再)レンダリング後にイベントをトリガーする方法

一般的なMutationObserverを使用すると、DOMが更新されてからiframeのサイズが変更されるまでにちらつきが発生します。アプリケーションは

render(
    <Provider store={store}> 
    ... 
    </Provider>, 
    document.querySelector("..."), 
    resizeIframe 
); 

を使用して設定されて

resizeIframeコールバック関数は、最初のレンダリングを解決するが、子コンポーネントのアップデートには役立ちません。

resizeIframeをどのように反応(再)レンダリングにトリガーできますか?

編集:私はすべてのレンダリングでサイズ変更が非効率的であることを知っています。しかし、DOMのサイズ変更とiframeのサイズ変更の間の遅延を取り除くことは、より大きな問題であるようです。

答えて

1

componentWillReceiveProps()を使用すると、小道具/状態が変更されたときに必要な操作を行うことができます。 反応についての詳細lifecycles

+0

は私が使用してコンポーネントを反応させるのひとつひとつにこれを実装する必要があります:その便利listenTo方法で遊んでhttps://github.com/wnr/element-resize-detector

スタート:良いアイデアは、まさにこれを行うライブラリを使用するだろうか?私はむしろそうしないだろう。 (また、サードパーティ製コンポーネントですか?) – jcassee

+0

'componentWillReceiveProps(){anyfunction()}'内の関数を使用できます –

+0

2つの質問:1)これを実装するコンポーネントはどれですか? componentWillReceivePropsを実装する1つのコンポーネントにアプリケーション全体をラップする必要がありますか? 2)レンダリング前にcomponentWillReceivePropsが発生するので、componentDidUpdateはサイズ変更する正しいフェーズではありませんか? – jcassee

1

反応の基本的なアイデアの1つは、要素のレンダリングメソッドを呼び出す呼び出しが必ずしもDOMを変更するとは限りません。

したがって、すべてのコンポーネントのrenderメソッドが呼び出されるのに応答するのは良い考えのようには聞こえません。

あなたも書いた:DOMへの変更は必ずしも変更されません。

を私はDOMが

を変更し、いつでもこれはどちらか、大きな音ではありませんリサイズメッセージを送りたいですドキュメントのサイズ

あなたのアプリが存在するiframeやアプリのルート要素のサイズ変更を検出する必要があるようです。

import elementResizeDetectorMaker from 'element-resize-detector'; 

const erd = elementResizeDetectorMaker(); 
erd.listenTo(document.getElementById("test"), function(element) { 
    resizeIframe(); // the function you implemented earlier 
}); 
+0

提案していただきありがとうございます。私はerdを実装し、 'body'要素を聞かせました。残念ながら、ドキュメントのサイズ変更とiframeのサイズ変更の間にはまだ若干の遅延があり、その結果フリッカーが発生します。 – jcassee

関連する問題