Reactでデータを取得する3つの方法と長所短所
読める性を保証するために、本文は直訳ではなく意訳を採用する。
I/O動作(例えばデータ抽出)を実行する場合は、まずネットワーク要求を送信し、その後、応答を待って、その後、応答データをコンポーネントの状態に保存し、最後にレンダリングする。
Reactでライフサイクル方法、Hooks、Suspenseはデータを取得する方法です。次に、事例を使って、それらをどのように使って、各方法の長所と短所を説明します。
1.ライフサイクル方法でデータを要求する
アプリケーション
1.プログラムに入ると
2.フィルタ条件によって従業員を選別することができます。
これらの2つの需要を達成する前に、まずReactクラスのコンポーネントの
コンポーネント
私たちのキーワードがフィルタリングされると
ライフサイクル法は比較的把握しやすいですが、クラスベースの方法にはサンプルコードがあり、再利用性が難しくなります。
長所
この方法は、
欠点
サンプルコード
クラスベースのコンポーネントは、
this
コードの重複
重用はむずかしい
従業員が論理を得るのは難しいです。他のコンポーネントで再利用します。
2.Hooksでデータを取得する
Hooksはクラスに基づいてデータを取得する方式がより良い選択です。簡単な関数として、Hooksはクラスのコンポーネントのように継承されていないし、再利用も容易です。
簡単に
Hooksを使用する
。
しかし、最適化の余地はまだあります。Hooksは
より良いのは、従業員を取得する必要がある他の任意のコンポーネントで
長所
分かりやすくて簡単です
Hooksにはサンプルコードがありません。普通の関数です。
再利用可能性
Hooksで実現される取得データロジックは再利用しやすいです。
欠点は前置きの知識が必要です。
Hooksは直感に反していますので、使う前には理解しておかなければなりません。Hooksはクローズドに依存していますので、よく知っておいてください。
必要性
Hooksを使用しても、コマンド方式でデータ取得を実行しなければなりません。
3.suspenseでデータを取得する
注意:2019年11月現在、Suspenseは試験段階にあります。
最大の利点は、非同期動作を宣言的かつ同期的に処理することである。コンポーネントは複雑なデータ取得ロジックではなく、ステートメント方式でリソースを使用してコンテンツをレンダリングする。コンポーネントの内部にライフサイクルがなく、Hooksがなく、
長所
宣言式
シンプル
これらのコンポーネントは複雑なデータ取得ロジックを持っていません。
松カップリングと獲得実現
標準状態
複数の取得動作が要求された場合、
https://dmitripavlutin.com/react-fetch-lifecycle-methods-hooks-suspense/
4.まとめ
長い間、ライフサイクルの方法はずっとデータ方式の唯一の解決策です。しかし、それらを使ってデータを取得すると、多くのサンプルコード、繰り返し、再利用可能性の問題があります。
Hooksを使ってデータを取得するのはより良い選択です。より少ないサンプルコードです。
https://dmitripavlutin.com/react-fetch-lifecycle-methods-hooks-suspense/
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
I/O動作(例えばデータ抽出)を実行する場合は、まずネットワーク要求を送信し、その後、応答を待って、その後、応答データをコンポーネントの状態に保存し、最後にレンダリングする。
Reactでライフサイクル方法、Hooks、Suspenseはデータを取得する方法です。次に、事例を使って、それらをどのように使って、各方法の長所と短所を説明します。
1.ライフサイクル方法でデータを要求する
アプリケーション
Employees.org
は2つのことをする。1.プログラムに入ると
20
人の従業員を取得する。2.フィルタ条件によって従業員を選別することができます。
これらの2つの需要を達成する前に、まずReactクラスのコンポーネントの
2
ライフサイクル方法を振り返ってみよう。componentDidMount()
:コンポーネントをマウントして実行するcomponentDidUpdate(prevProps)
:props
またはstate
が変更されたときに実行される。コンポーネント
<EmployeesPage>
は、上記の2つのライフサイクル方法を用いて取得ロジックを実現する。
import EmployeesList from "./EmployeesList";
import { fetchEmployees } from "./fake-fetch";
class EmployeesPage extends Component {
constructor(props) {
super(props);
this.state = { employees: [], isFetching: true };
}
componentDidMount() {
this.fetch();
}
componentDidUpdate(prevProps) {
if (prevProps.query !== this.props.query) {
this.fetch();
}
}
async fetch() {
this.setState({ isFetching: true });
const employees = await fetchEmployees(this.props.query);
this.setState({ employees, isFetching: false });
}
render() {
const { isFetching, employees } = this.state;
if (isFetching) {
return <div> ...</div>;
}
return <EmployeesList employees={employees} />;
}
}
codesadboxを開くと、<EmployeesPage>
取得プロセスを見ることができる。<EmployeesPage>
には、データを取得する非同期方法fetch()
がある。取得要求が完了した後、setState
方法を用いてemployees
を更新する。this.fetch()
は、コンポーネントの初期レンダリング時に従業員データを取得するcomponentDidMount()
ライフサイクル方法で実行される。私たちのキーワードがフィルタリングされると
props.query
が更新されます。props.query
が更新されるたびに、componentDidUpdate()
はthis.fetch()
を再実行する。ライフサイクル法は比較的把握しやすいですが、クラスベースの方法にはサンプルコードがあり、再利用性が難しくなります。
長所
この方法は、
componentDidMount()
が第1レンダリング時にデータを取得し、componentDidUpdate()
がprops
更新時にデータを再取得することを容易に理解できる。欠点
サンプルコード
クラスベースのコンポーネントは、
React.Component
を継承し、構造関数でsuper(props)
などを実行する必要がある。this
this
のキーワードを使うのは面倒くさいです。コードの重複
componentDidMount()
およびcomponentDidUpdate()
のコードの多くは重複している。重用はむずかしい
従業員が論理を得るのは難しいです。他のコンポーネントで再利用します。
2.Hooksでデータを取得する
Hooksはクラスに基づいてデータを取得する方式がより良い選択です。簡単な関数として、Hooksはクラスのコンポーネントのように継承されていないし、再利用も容易です。
簡単に
useEffect(callback[, deps])
Hookを思い出してください。このHookは、アップロード後にcallback
を実行し、依存項deps
が変化したときに再レンダリングする。<EmployeesPage>
を使用して、以下の例に示すように、従業員データを取得する。
import EmployeesList from "./EmployeesList";
import { fetchEmployees } from "./fake-fetch";
function EmployeesPage({ query }) {
const [isFetching, setFetching] = useState(false);
const [employees, setEmployees] = useState([]);
useEffect(function fetch() {
(async function() {
setFetching(true);
setEmployees(await fetchEmployees(query));
setFetching(false);
})();
}, [query]);
if (isFetching) {
return <div>Fetching employees....</div>;
}
return <EmployeesList employees={employees} />;
}
codesadboxを開くと、useEffect()
がデータをどうやって取得するかを確認することができる。Hooksを使用する
useEffect()
は、クラス構成要素を使用するよりもはるかに簡単であることが見られます。<EmployeesPage>
関数構成要素の<EmployeesPage>
において、初期レンダリングの後にuseEffect(fetch, [query])
コールが実行される。また、依存項fetch
が更新されると、query
方法が再実行される。。
しかし、最適化の余地はまだあります。Hooksは
fetch
コンポーネントから従業員を抽出して論理を得ることができます。
import React, { useState } from 'react';
import EmployeesList from "./EmployeesList";
import { fetchEmployees } from "./fake-fetch";
function useEmployeesFetch(query) { //
const [isFetching, setFetching] = useState(false);
const [employees, setEmployees] = useState([]);
useEffect(function fetch {
(async function() {
setFetching(true);
setEmployees(await fetchEmployees(query));
setFetching(false);
})();
}, [query]);
return [isFetching, employees];
}
function EmployeesPage({ query }) {
const [employees, isFetching] = useEmployeesFetch(query); //
if (isFetching) {
return <div>Fetching employees....</div>;
}
return <EmployeesList employees={employees} />;
}
必要な値は<EmployeesPage>
から言及される。コンポーネントuseEmployeesFetch()
は、対応する取得ロジックがなく、レンダリングインターフェースの動作のみを担当する。より良いのは、従業員を取得する必要がある他の任意のコンポーネントで
<EmployeesPage>
を再利用することができる。長所
分かりやすくて簡単です
Hooksにはサンプルコードがありません。普通の関数です。
再利用可能性
Hooksで実現される取得データロジックは再利用しやすいです。
欠点は前置きの知識が必要です。
Hooksは直感に反していますので、使う前には理解しておかなければなりません。Hooksはクローズドに依存していますので、よく知っておいてください。
必要性
Hooksを使用しても、コマンド方式でデータ取得を実行しなければなりません。
3.suspenseでデータを取得する
useEmployeesFetch()
は、React中のデータを非同期的に取得するための声明的な方法を提供する。注意:2019年11月現在、Suspenseは試験段階にあります。
Suspense
包装は非同期動作を実行するコンポーネント:
<Suspense fallback={<span>Fetch in progress...</span>}>
<FetchSomething />
</Suspense>
データ取得時、<Suspense>
はSuspense
の内容を表示し、データ取得後、fallback
はデータレンダリングSuspense
に使用する。<FetchSomething />
はどうやって使いますか?
import React, { Suspense } from "react";
import EmployeesList from "./EmployeesList";
function EmployeesPage({ resource }) {
return (
<Suspense fallback={<h1>Fetching employees....</h1>}>
<EmployeesFetch resource={resource} />
</Suspense>
);
}
function EmployeesFetch({ resource }) {
const employees = resource.employees.read();
return <EmployeesList employees={employees} />;
}
codesadboxを開くと、Suspense
がデータをどうやって取得するかを確認することができる。Suspense
は、<EmployeesPage>
処理コンポーネントを使用して、取得したデータをSuspense
コンポーネントに渡す。<EmployeesFetch>
の<EmployeesFetch>
は、resource.employees
と背後で通信する特殊な包装promise
である。このように、Suspense
は、「起」Suspense
のレンダリングにどれぐらいの時間がかかるかを知り、リソースの準備が整い次第、レンダリング作業を開始する。最大の利点は、非同期動作を宣言的かつ同期的に処理することである。コンポーネントは複雑なデータ取得ロジックではなく、ステートメント方式でリソースを使用してコンテンツをレンダリングする。コンポーネントの内部にライフサイクルがなく、Hooksがなく、
<EmployeesFetch>
がありません。インターフェースのみを表示します。長所
宣言式
Suspense
は、ステートメントとしてReactで非同期動作を実行する。シンプル
これらのコンポーネントは複雑なデータ取得ロジックを持っていません。
松カップリングと獲得実現
async/await
のコンポーネントを使用すると、データの取得方法が分かりません。RESTまたはGraphQLを使用します。Suspense
は、取得の詳細がコンポーネントにリークされることを保護する境界を設定する。標準状態
複数の取得動作が要求された場合、
Suspense
は最新の取得要求を使用する。https://dmitripavlutin.com/react-fetch-lifecycle-methods-hooks-suspense/
4.まとめ
長い間、ライフサイクルの方法はずっとデータ方式の唯一の解決策です。しかし、それらを使ってデータを取得すると、多くのサンプルコード、繰り返し、再利用可能性の問題があります。
Hooksを使ってデータを取得するのはより良い選択です。より少ないサンプルコードです。
Suspense
の利点は、ステートメント取得である。私たちのコンポーネントは獲得されません。実現の細部がめちゃくちゃになります。Suspense
は、React自体の宣言的な本質により近い。https://dmitripavlutin.com/react-fetch-lifecycle-methods-hooks-suspense/
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。