アプリケーションでステータス取得コンポーネントを作成しようとしていますが、データフェッチやその他のネットワーク関連イベント中に更新されます。ここで私は(原因の依存関係に)ストア内のデータの別のセットに基づいていくつかのデータをロードするためにcomponentWillReceivePropsライフサイクルイベントを使用していますデータフェッチ中にステータスを表示するコンポーネントの状態を更新します。
componentWillReceiveProps(nextProps){
// This check is required otherwise setting state
// from here will end up in a rendering loop
if(!_.isEqual(this.props, nextProps)){
if(nextProps.services.length != 0){
if(nextProps.filters.length == 0){
nextProps.setStatus('Fetching filters...');
const { serviceId } = nextProps.params;
const serviceIndex = nextProps
.services
.findIndex(
(service) => service.id == serviceId
);
const serviceObj = nextProps.services[serviceIndex];
nextProps.getFilters(serviceObj);
}
}
}
} 。 setStatusメソッドは、ストアを新しいステータスメッセージで更新する役割を担い、ステータスコンポーネントが更新されるようにします。ここでは、フィルタが空であるかどうかを確認しています。ステータスを設定してデータを取得しようとしています。ステータスを設定しているときに、ストアを更新しているので、「レンダリング」プロセスが再開されます。これにより、ライフサイクルイベントが再度呼び出され、フィルタがまだ空であるため、データフェッチ要求が再度実行されます。現在、私はこれを停止しました
// Setting status will set the state and invoke data collection
// again as filters are still empty due to re-render
if(_.isEqual(this.props.status,nextProps.status) &&
_.isEqual(this.props.filters,nextProps.filters)) {
const { serviceId } = nextProps.params;
const serviceIndex = nextProps
.services
.findIndex(
(service) => service.id == serviceId
);
const serviceObj = nextProps.services[serviceIndex];
nextProps.getFilters(serviceObj);
}
しかし、このアプローチはハックに似ています。このステータスコンポーネントのより良い設計アプローチをお勧めしますか?規制対象のコンポーネントを保守することはできますか?
私はreduxストアだけで「ステータス」を把握していますが、それが私にとって問題となるものです。サーバーからデータを取得しようとしていることをユーザーに知らせようとしています。そのためには、ストアを更新してレンダリングプロセスを再度実行しています。この次のレンダリングは、フィルタセクション(この例では)がまだ空であるため、要求をサーバーに再送信しています。これは、データをフェッチしてそれを埋めるステップと見なされます。 –