私が見る限り、componentWillMount
ができることとconstructor
ができないことは、setState
を呼び出すことだけです。
_componentWillMount() {
setState({ isLoaded: false });
}
_
まだrender
を呼び出していないので、setState
のcomponentWillMount
は、最初のrender()
パスに入る前に状態オブジェクトを準備します。これは、本質的にconstructor
と同じことです:
_constructor(props) {
super(props);
this.state = { isLoaded: false };
}
_
しかし、(サーバー側で)componentWillMount
が便利な別のユースケースがあります。
非同期のものを考えてみましょう:
_componentWillMount() {
myAsyncMethod(params, (result) => {
this.setState({ data: result });
})
}
_
ここで、constructor
を_this.state
_への割り当てとして使用することはできません。render()
はトリガーされません。
setState
のcomponentWillMount
はどうですか? React docs :によると
componentWillMount()
は、マウントが発生する直前に呼び出されます。 _render(
_)の前に呼び出されるため、このメソッドで状態を設定しても再レンダリングはトリガーされません。このメソッドに副作用やサブスクリプションを導入しないでください。
したがって、ここではReactは最初のレンダリングに新しい状態値を使用し、再レンダリングを回避します。
質問1:これは、componentWillMount
内で、非同期メソッドのコールバックでsetState
を呼び出す場合promiseコールバック)、React)コールバックが実行されるまで初期レンダリングをブロックします?
この設定をclient-side(はい、サーバーサイドレンダリングでのユースケースを見る)、上記が当てはまる場合、私はしません私の非同期メソッドが完了するまで何でも見ることができます。
コンセプトがありませんか?
質問2:componentWillMount
のみで達成できる他のユースケースはありますが、constructor
は使用しませんおよびcomponentDidMount
?
これは、componentWillMount内で、非同期メソッドのコールバックでsetStateを呼び出す(promiseコールバックにすることができる)場合、Reactはコールバックが実行されるまで初期レンダリングをブロックしますか?
いいえ、ここ を参照してください。
次のコードはレンダリングをブロックしません(これはsetStateを呼び出すアンチパターンであることに注意してください)
_componentWillMount: function() {
new Promise((resolve, reject) => {
setTimeout(()=> {
resolve();
}, 2000)
}).then(() => this.setState({ promiseResult: 'World' }));
},
_
質問2:componentWillMountでのみ達成できるその他のユースケースはありますが、コンストラクターとcomponentDidMountは使用しませんか?
いいえ、ES6クラスの場合、componentWillMountを破棄できます。 React.createClass({... })
を使用する場合にのみ必要です
編集:どうやら、私は間違っています。これを指摘してくれた@ Swapnil に感謝します。 discussion です。
Reactは、constructor
に副作用があり、別のコンポーネントの状態を変更すると警告をスローします。これは、setState
自体のconstructor
と、潜在的にrender()
が呼び出されています。したがって、constructor
に副作用はありません。
これは、componentWillMount
で行う場合には当てはまりません。エラーはスローされません。一方、facebookの人たちもcomponentWillMount
の副作用を思いとどまらせています。したがって、副作用がない場合は、constructor
の代わりにcomponentWillMount
を使用できます。副作用については、componentDidMount
の代わりにcomponentWillMount
を使用することをお勧めします。いずれにしても、componentWillMount
は必要ありません。