だから、私は2を持って言わせては、以下のようにコンポーネントに反応:setStateを呼び出したり、componentWillUpdateをReactで実行したりせずにコンポーネントをレンダリングする方法は?
var Parent = React.createClass({
getInitialState: function(){
return ({
child: <Children state="someState" />
});
},
parentFunction: function() {
this.setState({
child: <Children state="otherState" />
});
},
render: function() {
return (
<div>
{this.state.child}
</div>
);
}
//...other methods
});
var Children = React.createClass({
componentWillMount: function() {
this.getData();
},
componentWillUpdate: function() {
this.getData();
}
getData: function() {
var that = this;
$.getJSON("https://some.url", function(result){
//Do something with result
that.setState();
});
}
//other methods ....
});
親が最初にレンダリングされるときに、子供があまりにも初めてレンダリングされます。したがって、ChildrenのcomponentWillMountが実行され、子のgetDataが呼び出されます。 getDataは非同期関数であるgetJSONを呼び出すため、最初にレンダリングされるChildrenの結果を「オンタイム」に戻すことはできません。したがって、私の解決策は、getJSONの結果が終了した後にsetState()を呼び出して、Childrenが再びレンダリングするようにすることです。これまでのところすべてが大丈夫です。
しかし、子を更新するparentFunctionを呼び出すと問題が発生します。 Childrenは更新されるので、そのcomponentWillUpdateが実行されるため、getData()が呼び出されます。しかし、getData()はsetState()を呼び出し、結果の処理が終わった後にそれを呼び出します。 setState()は、componentWillUpdateを実行させます。そしてそれが私が無限ループに入る方法です。
私は、setStateを呼び出さずに、またはcomponentWillUpdateを実行することなくコンポーネントをレンダリングする方法を発見しました。しかし私はそれをまだ見つけていない。 この問題を解決する方法がわかりません。どんな助けもありがとう。
ここでの中核的な問題は、コンポーネントの更新に応じてajaxリクエストを作成することは問題ではないということです。 1つのレンダリングと異なるレンダリングやユーザがボタンを押すなど、ajaxリクエストを実際にトリガする必要があるものを特定する必要があります。 – FakeRainBrigand
コンポーネントを使用すると、小道具が表示されます。 React documentationを確認してください。 –