データを取得するためのカスタムフックの作成
24719 ワード
カスタムフックを実装するための前提条件
このブログ記事のトピック
私たちのカスタムフックのアーキテクチャ.
useFetch
. によるとRules of Hook すべてのカスタムフックを持っている必要がありますuse
それの前にキーワードとしてフックとして認識する.useFetch
は以下のブロックから成ります:パラメータ
状態ブロック:
useState
有効ブロック:
axios
私たちがサーバにすることを呼び出します.useFetch
が設計されている:カスタムフックの実装
useFetch
const useFetchData = (url) => {
const [isLoading, setIsLoading] = useState(false);
const [apiData, setApiData] = useState(null);
const [serverError, setServerError] = useState(null);
};
上記の関数はuseStates
ASisLoading
APIがデータを取得したか、まだデータをフェッチしているかどうかを調べます.apiData
: データが正常にフェッチされた場合、データはapiData
変数serverError
: APIエンドポイントからデータを取得する際にエラーが発生した場合は、serverError
変数.useEffect
フックの反応.このフックはaxios.get(URL)
要求されたURLを呼び出します.const useFetch = (url) => {
const [isLoading, setIsLoading] = useState(false);
const [apiData, setApiData] = useState(null);
const [serverError, setServerError] = useState(null);
useEffect(() => {
setIsLoading(true);
const fetchData = async () => {
try {
const resp = await axios.get(url);
const data = await resp?.data;
setApiData(data);
setIsLoading(false);
} catch (error) {
setServerError(error);
setIsLoading(false);
}
};
fetchData();
}, [url]);
};
The axios
コールはAsync関数fetchedData
. It consists of try...catch
ブロック.一旦データが待たれるならば、我々はそれを保存しますapiData
使用setApiData
. あなたが観察したならば、私もセットしましたisLoading
to true
useeffectの開始時.これは、APIがサーバーへの呼び出しを開始したときにローダを表示したいので、意図的に行われます.一旦我々が200のステータスでレスポンスを得るならばisLoading
to false
使用setIsLoading
.何らかのエラーがあれば、我々は
serverError
state to error
一緒にisLoading
state to false
.const useFetch = (url) => {
const [isLoading, setIsLoading] = useState(false);
const [apiData, setApiData] = useState(null);
const [serverError, setServerError] = useState(null);
useEffect(() => {
setIsLoading(true);
const fetchData = async () => {
try {
const resp = await axios.get(url);
const data = await resp?.data;
setApiData(data);
setIsLoading(false);
} catch (error) {
setServerError(error);
setIsLoading(false);
}
};
fetchData();
}, [url]);
return { isLoading, apiData, serverError };
};
実際のコンポーネントでの使用
カスタムフックを使用できる例を見てみましょう
useFetch
. 以下はコードですindex.js
ファイル.import { StrictMode } from "react";
import ReactDOM from "react-dom";
import useFetch from "./useFetch";
const App = () => {
const { isLoading, serverError, apiData } = useFetch(
"https://jsonplaceholder.typicode.com/posts/1"
);
return (
<div>
<h2>API data</h2>
{isLoading && <span>Loading.....</span>}
{!isLoading && serverError ? (
<span>Error in fetching data ...</span>
) : (
<span>{JSON.stringify(apiData)}</span>
)}
</div>
);
};
const rootElement = document.getElementById("root");
ReactDOM.render(
<StrictMode>
<App />
</StrictMode>,
rootElement
);
今すぐ任意の反応フックのように直接我々のカスタムフックを使用してデータを取得することができます.ご覧の通り.isLoading
and serverError
niceエラーメッセージを表示するコンポーネントの条件付きレンダリングに使用できます.追加ユースケース
Adaptive Reduxのアクションを追加したり、APIメソッドを一般化したりするなどの追加ユースケースを使用することができます.
また、アプリケーションにReduxを統合することができますし、グローバル状態にAPIの応答を追加します.usefetchへの変更は以下のようになります.
const useFetchData = (url) => {
const dispatch = useDispatch();
const [isLoading, setIsLoading] = useState(false);
const [apiData, setApiData] = useState(null);
const [serverError, setServerError] = useState(null);
useEffect(() => {
setIsLoading(true);
const fetchData = async () => {
try {
dispatch(fetchApiData());
const resp = await axios.get(url);
const data = await resp?.data;
dispatch(fetchApiSuccess(data));
setApiData(data);
setIsLoading(false);
} catch (error) {
setServerError(error);
dispatch(fetchApiFailure());
setIsLoading(false);
}
};
fetchData();
}, [dispatch, url]);
return { isLoading, apiData, serverError };
};
fetchApiData
, fetchApiSuccess
, and fetchApiFailure
は、データをREDUXグローバル状態に格納すると共に、特定のreduxアクションを呼び出すthunksです.我々
useFetch
現在実行中GET
リクエスト.理想的なシナリオはuseFetch
リクエストのすべてのタイプを実行するにはPOST
, PUT
以下のコードは、一般的なaxios呼び出しを行います.const useFetch = (method, url, body) => {
const [isLoading, setIsLoading] = useState(false);
const [apiData, setApiData] = useState(null);
const [serverError, setServerError] = useState(null);
useEffect(() => {
setIsLoading(true);
const fetchData = async () => {
try {
const resp = await axios({
method: method,
url: url,
data: body
});
const data = await resp?.data;
setApiData(data);
setIsLoading(false);
} catch (error) {
setServerError(error);
setIsLoading(false);
}
};
fetchData();
}, [url, method, body]);
return { isLoading, apiData, serverError };
};
使用法はインデックスと同じです.js変更するものだけが関数定義です:const { isLoading, serverError, apiData } = useFetch(
"GET",
"https://jsonplaceholder.typicode.com/posts/1",
{}
);
これらは私が最も一般的に使用できると思う使用例のいくつかです.あなたはデータを取得し、我々のニーズごとにそれを強化する上記のカスタムフックをすることができます.このブログ記事で使用するコードは、次のサンドボックスURLで確認できます.
https://codesandbox.io/s/react-custom-hook-sample-dcuf4
私に手を伸ばす自由
Reference
この問題について(データを取得するためのカスタムフックの作成), 我々は、より多くの情報をここで見つけました https://dev.to/keyurparalkar/creating-custom-hook-for-fetching-data-in-react-3mo3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol