私はFlaskサーバーでReactを使用しており、ユーザーが情報を入力できるテーブルを持っています。この子テーブルは、ユーザーがセルを編集したり、行を追加したり、行を削除したりすると、MainAppのtableData
状態を更新します。React to setStateを使用して再帰を避けるには?
私の問題は、MainApp内でimage
状態を使用してイメージURL (このURLにはハッシュも含まれているので、クライアントが情報を要求するたびに変更されます)。しかし、私はまた、MainAppのtableData
状態を使用して、ユーザーがテーブルを更新するときに変更されるテーブル情報を格納します。これにより、componentWillUpdate
が呼び出され、イメージのBLOBが取得され、URLに変換されて状態image
が更新されます。これは順番に再帰呼び出しにつながると想像するようにcomponentWillUpdate
を呼び出します。 React documentationはsetState
をcomponentWillUpdate
の中に呼んではいけないと言います。私はこれを行うための推奨される方法について何か興味があります。
私の意図する動作は、テーブルのセルを編集し、MainAppがテーブル情報を持つサーバーに要求を送信し、MainAppが画像を受信し、それに応じてページを更新するということです。 URLを保存するのにimage
状態を使用しないでください。これを行うには
一つの方法は、componentWillUpdate
でsetState
を使用して、グローバル変数に基づいてロジックとshouldComponentUpdate
を使用することです(shouldComponentUpdate
が複数回呼ばれます)が、私はそれはおそらく、推奨されるアプローチではないかなり確信しています。
var globalVariable = true
var MainApp = React.createClass({
shouldComponentUpdate : function() {
// logic here using globalVariable
}
componentWillUpdate : function() {
console.log("Get image from server")
fetch('/api/data', {
method: 'POST',
body: JSON.stringify({
tableData: this.state.tableData,
})
})
.then(function(response) {
return response.blob();
}.bind(this))
.then(function(imageBlob) {
this.setState({
image: URL.createObjectURL(imageBlob),
tableData: this.state.tableData
})
}.bind(this))
},
handleTableUpdate : function(newState) {
this.setState({
image: this.state.image,
tableData: newState
});
console.log("Table updated")
},
render : function() {
return (
<div>
<div id="inverter-table" className="col-sm-6">
<MyReactBootstrapTable
onTableUpdate={this.handleTableUpdate}
data={this.state.tableData} />
</div>
<div id="img" className="col-sm-6">
<MyPlot url={this.state.image}></MyPlot>
</div>
</div>
);
}
})
'handleTableUpdate'の中で' fetch'呼び出しをしないのはなぜですか? – FaureHu
それはうまくいく!私は、最良の反応実践に不思議に思っていました。あなたはすばらしいと思う提案があれば。 – kdheepak