私は React でいくつかのチュートリアルに従ってきましたが、自分でアプリケーションを構築し始めています。コンポーネントに関する状況に遭遇しましたが、このシナリオのベスト プラクティスがあるかどうか疑問に思っています。注意してください、私は反応レールを使用しているだけです。今のところフラックスなどはありません。
ajax を介して値が設定される配列を使用して初期状態を設定し、その配列を初期レンダリングで表示する
これが私がやろうとしていることです:(簡単にするために取り除かれています)
var ShoutList = React.createClass({
getInitialState: function(){
return {shouts: []};
},
componentDidMount: function(){
var component = this;
$.get('/api/shouts.json', function(data){
component.setState({shouts: data});
});
},
render: function(){
return (
<div>
{this.state.shouts[0].shout}
</div>);
}
});
したがって、私がこの権利を持っている場合、物事が実行される順序は次のようになります。
- ロード時に、getInitialState は叫び声を空の配列に設定します
- 空の配列のshoutプロパティにアクセスしようとすると、Renderが呼び出されてエラーが発生します
- ComponentDidMount が呼び出され、Ajax 呼び出しから受信したデータにシャウトの状態を設定します。**ComponentWillMount でこれを実行しようとすると、エラーが発生します **
- 状態が変化したため、Render が再度呼び出されますが、今回はshouts[0].shout にデータが含まれます。
したがって、ステップ 2 でエラーが発生し、回避策は次のとおりです。
var ShoutList = React.createClass({
getInitialState: function(){
return {shouts: []};
},
componentDidMount: function(){
var component = this;
$.get('/api/shouts.json', function(data){
component.setState({shouts: data});
});
},
emptyShouts: function(){
return(<div>No Shouts Yet!</div>);
},
shoutsList: function(){
return(<div>{this.state.shouts[0].shout}</div>);
},
render: function(){
if(this.state.shouts.length > 0){
return this.shoutsList();
}else {
return this.emptyShouts();
}
}
});
これは私が必要とするのとまったく同じように機能しますが、初期状態の配列値を ajax で設定し、この if ステートメントを実行せずに初期レンダリングでロードするより良い方法はありますか?
ありがとう!