2017-03-02 9 views
1

私は状態の私の理解で、おそらくReactの小道具を正しく取得していません。これはReact、Reduxベースのアプリを使用しています。リアクションライフサイクルイベント - 子コンポーネントは古い状態の小道具を継承します

シナリオ:

IはcomponentDidMountメソッド内アプリからビューポートの寸法を取得するグローバルSVG成分を有します。 stateSVG

(アプリの初期化時に)デフォルトの小道具は、次のとおり

dimension : { 
width : 0, 
height : 0 
} 

componentDidMountはDOM からwidth & height値を取得し、状態に値をディスパッチします。

今私は&高さの値が再びデフォルトビューボックス&更新に状態を計算するように更新SVG幅を必要とするSVGコンポーネントの子コンポーネントを持っています。これは、実装時に(重要な点)の1度だけ実行する必要があるため、viewboxの計算は子コンポーネントのcomponentDidMountにあります。いただきましたハプニング

しかし、DOMを更新バッチに反応するので、私は推測する、子コンポーネントに渡された小道具はSVGコンポーネントのcomponentDidMount後にデフォルトの初期幅&高さの値ではなく、更新された状態です。

質問:

はどのように子コンポーネントのcomponentDidMountに更新された状態を渡すことができます。注:私は意味しますcomponentDidUpdate、コンポーネントが更新されるたびに使用することはできません

  • 、それが過剰に乗っユーザーの位置を、それによって、デフォルト値は再びビューを更新&計算します。
+1

* componentDidMount()*で状態を設定すると、コンポーネントが再描画されます。親コンポーネントからの小道具を使用する場合は、* componentWillReceiveProps(nextProps)*で作業する必要があります。これは、親コンポーネントから小道具を受け取るたびに呼び出されます。 –

+0

コードを表示できますか? –

+0

@MarioSantiniありがとうございました。私はそのライフサイクルイベントを完全に忘れていました:!それを回答として投稿したい場合は、それを最初のものとして受け入れます。 – Kayote

答えて

1

componentDidMount()に状態を設定すると、コンポーネントが再描画されます。

あなたは小道具を使用したい場合は、あなたがcomponentWillReceiveProps(nextProps)で動作するはずです、リアクトライフサイクルに小道具は親コンポーネントからコンポーネントreceaveたびに呼び出されていること。

これはあなたがこれまで達成しようとしているようです。

0

あなたのケースでは、親コンポーネントのcomponentDidMountが実行される前に、子コンポーネントがレンダリングされ、defaultの小道具を受け取ります。したがって、親のcomponentDidMountで更新される小道具は、子どもに更新された小道具として反映されます

componentWillReceiveProps機能を子コンポーネントで使用すると、更新された小道具に基づいて状態を設定できます。 しかし、これは親から更新されるたびに実行されるので、親のcomponentDidMountの特定の値で設定されている親からいくつかの小道具を渡し、後で別の値を持ちます。 componentWillReceivePropのこの小道具に基づいて、子コンポーネントの初期状態を設定できます。

+0

ご不明な点がありましたら教えてください –

+0

Shubhamの説明をありがとうございます。私は信じていません、最初のパラは正しいです。私が間違っている場合は私を訂正してください。しかし、両方ともDOMに一度にプッシュされるので、状態値は同じです。 – Kayote

+1

はい両方ともDOMにプッシュされます。しかし、あなたがcomponentDidMountが状態を更新してそれを小道具として渡すと言うと、この動作には時間がかかります。したがって、初期状態は子コンポーネントに渡されるだけです。その状態が更新され、再レンダリングが発生し、更新された小道具が渡されたときのみ –

関連する問題