Vous pouvez créer un crochet personnalisé useApi
et retourner une fonction execute
qui, lorsqu'il est appelé, fait appel à l'API (généralement par l'intermédiaire d'un système de gestion de la qualité). onClick
).
useApi
crochet :
export type ApiMethod = "GET" | "POST";
export type ApiState = "idle" | "loading" | "done";
const fetcher = async (
url: string,
method: ApiMethod,
payload?: string
): Promise<any> => {
const requestHeaders = new Headers();
requestHeaders.set("Content-Type", "application/json");
console.log("fetching data...");
const res = await fetch(url, {
body: payload ? JSON.stringify(payload) : undefined,
headers: requestHeaders,
method,
});
const resobj = await res.json();
return resobj;
};
export function useApi(
url: string,
method: ApiMethod,
payload?: any
): {
apiState: ApiState;
data: unknown;
execute: () => void;
} {
const [apiState, setApiState] = useState<ApiState>("idle");
const [data, setData] = useState<unknown>(null);
const [toCallApi, setApiExecution] = useState(false);
const execute = () => {
console.log("executing now");
setApiExecution(true);
};
const fetchApi = useCallback(() => {
console.log("fetchApi called");
fetcher(url, method, payload)
.then((res) => {
const data = res.data;
setData({ ...data });
return;
})
.catch((e: Error) => {
setData(null);
console.log(e.message);
})
.finally(() => {
setApiState("done");
});
}, [method, payload, url]);
// call api
useEffect(() => {
if (toCallApi && apiState === "idle") {
console.log("calling api");
setApiState("loading");
fetchApi();
}
}, [apiState, fetchApi, toCallApi]);
return {
apiState,
data,
execute,
};
}
en utilisant useApi
dans certains composants :
const SomeComponent = () =>{
const { apiState, data, execute } = useApi(
"api/url",
"POST",
{
foo: "bar",
}
);
}
if (apiState == "done") {
console.log("execution complete",data);
}
return (
<button
onClick={() => {
execute();
}}>
Click me
</button>
);
0 votes
Je pense qu'il n'y a pas d'intérêt à utiliser les react hooks pour faire cela, vous pouvez juste avoir une fonction normale dans votre composant et l'avoir comme gestionnaire d'événement d'entrée.
0 votes
Que pensez-vous du fait que
render
(donc sfc) ne devrait pas avoir d'effets secondaires ?0 votes
L'utilisation d'un hook rendrait le code beaucoup plus flexible, mais il s'agit d'une mesure temporaire car bientôt React gérera cela en utilisant Suspense, voir robinwieruch.de/react-hooks-fetch-data pour plus d'informations.
0 votes
@dorriz oui oui, avec le temps, du suspense sera ajouté à cette histoire. mais en attendant, faisons comme si suspendre n'existait pas ou n'allait pas exister.