2016-09-04 7 views
1

を反応させ、私はコンポーネントを反応させていますコンポーネント

var Main = React.createClass({ 
    handleFoo: function() { 
    self.setState(...); 
    }, 
    ... 
}) 

私はそれをレンダリング:

var top = ReactDOM.Render(<Main />, document.getElementById("x")) 

そしてその後、私は外部ソースからのデータを受信し、私がしたいですトップレベルのコンポーネントと対話するので、私が試した:

top.handleFoo() 

をしかし、私は

を取得
TypeError: top.handleFoo is not a function 

コンポーネント階層の外部からトップレベルの反応コンポーネントとやりとりする正しい方法は何ですか?

+0

あなたの構文は正しいと思います。あなたが 'console.log(top .__ proto __)'を実行したときに何を得ますか? –

答えて

0

あなたは正確に何をしようとしていますか?反応するようにデータを渡すと、通常propsを使用して行われ

var data = /* get your data from this external source */ 
ReactDOM.Render(<Main mydata={data} />, document.getElementById("x")) 

ここでは、いくつかのデータを取得し、mydataという名前の小道具としての当社の主なコンポーネントに渡します。私たちのコンポーネントから

私たちは、このように受け取った小道具を使用することができます。

var Main = React.createClass({ 
    handleFoo: function() { 
    var mydata = this.props.mydata; 
    /* do what you want with data */ 
    self.setState(...); 
    }, 
    ... 
}) 

注意してください、あなたはMainに渡すデータを更新したい場合は、あなたがしたい場合は、もう一度それをレンダリングしなければならないことコンポーネントを使用してデータを取得したり、reduxおよびreact-reduxを使用してアプリケーションの状態を管理することを避けることができます。

コンポーネント自体からデータを取得しない理由はありますか?

+0

コンポーネント内からデータを取得しないのは、電子で作業しているため、ネイティブメニュー項目のイベントに応答しようとしていることです。反応要素のメソッドを呼び出す理由は、現時点で最上位レベルの要素を維持していて、小道具を使用するように移動すると、すべての状態をトップレベルから除外しなければならないため、過度の機能とみなされています。特定のユースケースは "handleNew"を呼び出しており、ルートコンポーネントstate.notesに新しいノートを作成します。 –

+0

私は参照してください。私が知る限りでは(そして私が間違っているかもしれない)、反応はそうするオプションを提供しません。親コンポーネントから子供への通信は、小道具を介して行うことができ、親から親への通信は、小道具を介して子どもに渡されます。 何か他の点では、通常、解決策は 'redux'です。これはアプリケーション状態を管理するための偉大でシンプルなjavascriptライブラリであり、ヘルパーライブラリ' react-redux'を使って反応することができます。私はこれがあなたにとって最高のソリューションだと思います。 –

0

コンポーネント内で状態を変更する必要があります。クラスと対話する外部コンポーネントには、親クラスとピアクラスの2つのタイプがあります。親コンポーネントは、新しい小道具を送信することによって状態を変更することができます。ピアコンポーネントは、イベントを使用して状態を変更する必要があります。

関連する問題