2016-07-18 6 views
0

は、私は、次のJSONファイルを持っていたと言います。私の最善の試みは以下の通りです。リアクションを使用してネストされたAPIを呼び出しますか?私が反応使用してそれらに呼び出しを行う方法を知っていただきたいと思い</p> <pre><code>{ "farmer": [ { "crops": "corn" } ], "activities":{ "hobbies": "swimming" }, "name: Todd" } </code></pre> <p>:

componentDidMount: function(){ 
var selfish = this; 
$.get('~~someurl~~', function(data){ 
selfish.setState(data); 
}); 
}, 

render: function(){ 
return (<div> 
<p>{this.state.name}</p> 
<p>{this.state.activities.hobbies}</p> 
<p>{this.state.farmer[0].crops}</p> 
</div>) 
} 

最初に{this.state.name}が書かれたとおりに実行されるようになります。しかし、React構文を使用して最後の2つを表現する方法については不明です。{this.state.activities.hobbies}{this.state.farmer[0].crops}

私は、それぞれの呼び出しで達成しようとしていることを表現してくれるよううまくそれらを書いています。

EDIT:後者の2つの結果に起因する特定のエラーは、それらが未定義であることを示します。

EDIT:空の初期状態を追加して2番目の作業を行いました。

getInitialState: function(){ 
return {activities: '', farmer: ''} 
} 

ただし、最後のものは残りますが、それでもエラーが返されます。

+1

{{}}の間のものは、通常のJavaScript(特定の「リアクション構文」はありません)です。 'this.state.activities.hobbies'などは、データが存在する限り動作します。初期レンダリングではデータが存在しないと仮定します。その場合、まず、データが存在しない場合のUIの外観を考える必要があります。データ/プロパティの存在のテストは、通常どおりに動作します。 'this.state.activities && this.state.activities.hobbies'です。それについて具体的なリアクションはありません。 –

+0

次に、私は '{this.state.name} 'と同じように、ページロード中にこれらの呼び出しをロードする方法を知っていると思います。 '{this.state.name} 'はレンダリングするとすぐにロードされるからです。 –

+1

初期レンダリング時に*実行されます。しかし、 'this.state.activities'は初めて存在しないので、エラーが発生します。したがって、値が存在するかどうかを事前にチェックする必要があります。また、チェックに応じて何かをレンダリングするか、コンポーネントにデフォルトの状態を指定する必要があります。空の 'this.state.activities'オブジェクトで置き換えます。発生している問題の簡単な例を以下に示します: 'var state = {}; console.log(state.activities.hobbies); '' state'にはプロパティがないので、これはエラーを投げます。今、初期値を追加するか、ログに記録する前にテストすることができます。 –

答えて

1

問題は、componentWillMountを使用する必要があるときにcomponentDidMountを使用していることです。これらのライフサイクルの方法についてはthe documentationをご覧ください。

これは、初期レンダリングが発生した後、ドキュメントが はすぐに、だけで(ないサーバー上の)クライアント上で、一度に呼び出されますcomponentDidMount

について言っていることです。

これは、getInitialState before(他のライフサイクルメソッド)を使用していない限り、状態を宣言していないことを意味します。

componentWillMount: function() { 
    this.setState({ 
     "farmer": [ 
      { 
      "crops": "corn" 
      } 
     ], 
     "activities":{ 
      "hobbies": "swimming" 
     }, 
     "name": "Todd" 
    }); 
}, 

と私は私のrenderメソッドで

EDIT this.state.farmer[0].cropsを使用することができました:

私は単にこれをしなかった

が明確にされることを。コンポーネントをレンダリングした後にデータを取得する必要がある場合、レンダリングで使用する状態のデフォルト値を指定する必要があります。これは、getInitialStateを使って実現できます。

+0

私は空の初期状態を配置しようとしています。私が「活動」を行った場所では、「農家[0] .crops」のためにどうすればよいでしょうか? –

+1

これは間違った解決策です。 OPがAjaxリクエストを行っているので、 'componentDidMount'を使うのは正しいです。 'componentWillMount'を使うことはここでは役に立ちません。 Ajaxは非同期であるため、使用することはできますが、役に立たないでしょう。初期状態を提供したい場合は、 'getInitialState'でそれを行います。 –

+1

答えには、getInitialStateを使用する前に宣言しておきます。私は何をすべきかを説明する広範なアプローチを取っています –

関連する問題

 関連する問題