下一个JS:未捕获错误:无效的钩子调用

问题描述 投票:0回答:1

我在 Next js 应用程序中创建一个自定义挂钩,以使用 axios 发送请求。这是我的

useApiRequest
文件。

import { ErrorResponse, SuccessResponse } from "@/types/api";
import axios, { AxiosResponse } from "axios";
import { useState } from "react";

const useApiRequest = <T>(
  httpMethod: string,
  url: string,
  data?: any
): [boolean, T | string, string] => {
  const [response, setResponse] = useState<[boolean, T | string, string]>([
    false,
    "",
    "",
  ]);

  const fetchData = async () => {
    try {
      const apiResponse: AxiosResponse<SuccessResponse<T> | ErrorResponse> =
        await axios({
          method: httpMethod,
          url: url,
          data: data,
        });

      if ("result" in apiResponse.data && "message" in apiResponse.data) {
        const successData: SuccessResponse<T> = apiResponse.data;
        setResponse([true, successData.result, successData.message]);
      } else {
        const errorData: ErrorResponse = apiResponse.data;
        setResponse([false, errorData.error, errorData.error]);
      }
    } catch (error) {
      if (error instanceof Error) {
        setResponse([false, "", error.message]);
      } else {
        setResponse([false, "", "Terjadi kesalahan"]);
      }
    }
  };

  fetchData();

  return response;
};

export default useApiRequest;

我在我的页面之一中使用该钩子,如下所示

import Button from "@/components/elements/buttons/Button";
import useApiRequest from "@/hooks/useApiRequest";
import Head from "next/head";

const JadwalPage = () => {
  const handleLogin = () => {
    const [isSuccess, responseData, message] = useApiRequest(
      "post",
      "/auth/login",
      {
        username: "admin",
        password: "pratama-putra",
      }
    );

    if (isSuccess) {
      console.log("Data berhasil diperoleh:", responseData);
    } else {
      console.error("Gagal melakukan permintaan:", message);
    }
  };

  return (
    <div className="min-h-screen">
      <Head>
        <title>Jadwal Karyawan</title>
      </Head>
      <Button onClick={handleLogin}>Click me</Button>
    </div>
  );
};

export default JadwalPage;

为什么我总是收到错误

Uncaught Error: Invalid hook call. Hooks can only be called inside of the body of a function component.

我尝试将 useApiRequest 从 lambda 函数更改为常规函数,但它仍然产生相同的错误

next.js react-hooks axios react-custom-hooks
1个回答
0
投票

不要从常规 JavaScript 函数中调用 Hooks。相反,您可以:

✅ 从 React 函数组件调用 Hooks。 ✅ 从自定义调用 Hooks 挂钩

仅从 React 函数调用 Hooks

© www.soinside.com 2019 - 2024. All rights reserved.