この議論はしばらくの間行われており、@ Alexander T.の回答は、私のようなReactの新しい人がフォローするための良いガイドを提供してくれました。そして、コンポーネントを更新するために同じAPIを複数回呼び出すことに関するいくつかの追加のノウハウを共有します。これは、初心者が最初に直面する可能性のある一般的な問題だと思います。
componentWillReceiveProps(nextProps)
、公式ドキュメントから:
プロップの変更に応じて状態を更新する必要がある場合(たとえば、状態をリセットする場合)、this.propsとnextPropsを比較し、このメソッドでthis.setState()を使用して状態遷移を実行できます。
ここが親コンポーネントからの小道具を処理し、API呼び出しを行い、状態を更新する場所であると結論付けることができます。
@Alexander T.の例に基づく:
export default class UserList extends React.Component {
constructor(props) {
super(props);
this.state = {person: []};
}
componentDidMount() {
//For our first load.
this.UserList(this.props.group); //maybe something like "groupOne"
}
componentWillReceiveProps(nextProps) {
// Assuming parameter comes from url.
// let group = window.location.toString().split("/")[*indexParameterLocated*];
// this.UserList(group);
// Assuming parameter comes from props that from parent component.
let group = nextProps.group; // Maybe something like "groupTwo"
this.UserList(group);
}
UserList(group) {
$.getJSON('https://randomuser.me/api/' + group)
.then(({ results }) => this.setState({ person: results }));
}
render() {
return (...)
}
}
更新
componentWillReceiveProps()
廃止されるでしょう。
以下は、一般的なケースでAPIのデプロイに関連すると思われるライフサイクルの一部のメソッド(すべてDoc内のメソッド)です。
上の図を参照してください。
にAPIをデプロイ componentDidMount()
ここでAPI呼び出しを行う適切なシナリオは、このコンポーネントの(APIの応答からの)コンテンツが静的でcomponentDidMount()
あり、コンポーネントのマウント中に一度だけ発生し、新しいプロップが親コンポーネントから渡されるか、アクションをリードすることre-rendering
です。
コンポーネントは違いをチェックして再レンダリングしますが、再マウントはしません。ドキュメント
からの引用:
リモートエンドポイントからデータをロードする必要がある場合、これはネットワーク要求をインスタンス化するのに適した場所です。
- にAPIをデプロイ
static getDerivedStateFromProps(nextProps, prevState)
私たちは、二種類のがあることに気づくべきでコンポーネントの更新、setState()
現在のコンポーネントでなりませんトリガにこの方法を導くが、しかしからの再レンダリングするか、新しい小道具親コンポーネントを行います。このメソッドはマウント中にも実行されることがわかりました。
テンプレートのような現在のコンポーネントを使用したい場合、これはAPIをデプロイするのに適切な場所であり、APIの新しいパラメーターは親コンポーネントからのプロップです。
APIから別の応答を受け取り、state
ここに新しい応答を返し、このコンポーネントのコンテンツを変更します。
例:
親コンポーネントに異なる車のドロップダウンリストがあります。このコンポーネントは、選択された車の詳細を表示する必要があります。
- にAPIをデプロイ
componentDidUpdate(prevProps, prevState)
とは異なりstatic getDerivedStateFromProps()
、このメソッドは、初期レンダリングを除くすべてのレンダリングの直後に呼び出されます。API呼び出しを使用して、1つのコンポーネントで差異をレンダリングできます。
前の例を拡張
します。車の詳細を表示するコンポーネントには、この車のシリーズのリストが含まれている可能性があります。2013年の生産を確認したい場合は、リストアイテムをクリックまたは選択するか...最初setState()
にリードしてこれを反映しますこのコンポーネントの動作(リストアイテムの強調表示など)、および以下でcomponentDidUpdate()
は新しいパラメーター(状態)を使用してリクエストを送信します。応答を受け取った後setState()
、車の詳細のさまざまなコンテンツをレンダリングするために再び。以下componentDidUpdate()
が無限ループを引き起こさないようにするにはprevState
、このメソッドの最初に利用して状態を比較し、APIを送信して新しいコンテンツをレンダリングするかどうかを決定する必要があります。
この方法は実際にはstatic getDerivedStateFromProps()
小道具と同じように利用できますが、props
を利用しての変更を処理する必要がありprevProps
ます。またcomponentDidMount()
、最初のAPI呼び出しを処理するために連携する必要があります。
ドキュメントからの引用:
...これは、現在の小道具を以前の小道具と比較している限り、ネットワーク要求を行うのにも良い場所です...
componentDidMount
コールバックで呼び出すことができます。