64 votes

Comment envoyer une demande en cliquant sur React Hooks ?

Comment envoyer une requête http sur un clic de bouton avec react hooks ? Ou, d'ailleurs, comment faire n'importe quel effet secondaire sur un clic de bouton ?

Ce que je vois jusqu'à présent, c'est d'avoir quelque chose d'"indirect" comme.. :

export default = () => {
  const [sendRequest, setSendRequest] = useState(false);

  useEffect(() => {
    if(sendRequest){
       //send the request
       setSendRequest(false);
    }
  },
  [sendRequest]);

  return (
    <input type="button" disabled={sendRequest} onClick={() => setSendRequest(true)}
  );
}

Est-ce la bonne méthode ou existe-t-il un autre modèle ?

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.

0voto

JerryGoyal Points 9110

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>
);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X