【问题标题】:How to create a custom Hooks in reactjs hooks?如何在 reactjs 钩子中创建自定义钩子?
【发布时间】:2020-08-04 09:07:17
【问题描述】:

我试图通过简单地调用 useCustomHooks 来创建一个自定义 Hooks 来处理来自任何组件的输入 HTTP 请求,但是它失败并且错误是

不能在异步函数之外使用关键字 'await'

我所做的只是一个触发http请求自定义组件方法的处理程序

import { useState } from 'react';
import axios from "axios";

const useHttpReqHandler = () => {
    const [result, setResult] = useState();

    const apiMethod = async ({url , data , method}) => {
        let options = {
            method,
            url,
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json;charset=UTF-8'
            },
            data
        };
        let response = await axios(options);
        const UpdatedData = await response.data;
        console.log(UpdatedData)
        setResult(UpdatedData);
    }

    return [result, apiMethod];
};

export default useHttpReqHandler;

现在我可以在我的代码和任何事件处理程序上使用这个钩子,只需像这样调用从钩子返回的 callAPI

const MyFunc = () => {
    const [apiResult, apiMethod] = useHttpReqHandler();


    const captchValidation = () => {
        const x = result.toString();;
        const y = inputValue.toString();;
        if ( x === y) {
            apiMethod({url: 'some url here', data: {"email": email}, method: 'post'});
             alert("success")
        }
        else {
             alert("fail")
        }

    }

这是一个正确的方法吗?因为我是 Reactjs 的初学者

【问题讨论】:

  • 你在 useEffect 内部调用 await,但 useEffect 不是异步的
  • 嗨@HermitCrab这是一个正确的方法吗?我对我的帖子进行了编辑,但会运行无限次
  • 你的自定义钩子有很多错误,如果你愿意,我可以处理它并发布一个工作版本
  • 嗨@HermitCrab,如果可以的话,谢谢,如果你能为我做这件事,因为我只从过去两周开始做出反应
  • 嗨@HermitCrab,如果你能指导我,它将非常有帮助

标签: reactjs


【解决方案1】:

这是一个工作版本:

使用HttpReqHandler.jsx

import { useState } from 'react';
import axios from "axios";

const useHttpReqHandler = () => {
    const [apiResult, setApiResult] = useState();

    const apiMethod = async ({url , data , method}) => {
        let options = {
            method,
            url,
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json;charset=UTF-8'
            },
            data
        };
        let response = await axios(options);
        let responseOK = response && response.status === 200 && response.statusText === 'OK';
        if (responseOK) {
            const data = await response.data;
            console.log(data)
            setApiResult(data);
        }
    }

    return [apiResult, apiMethod];
};

export default useHttpReqHandler;

这里有什么重要的:

  • await 在异步函数 (apiMethod) 中调用

  • 结果存储在本地状态(apiResult)

  • 函数返回一个数组[apiResult, apiMethod]

如何使用:

const [apiResult, apiMethod] = useHttpReqHandler();
apiMethod({url: 'some url here', data: {"email": email}, method: 'post'});

渲染结果:

return {apiResult};

【讨论】:

  • 嗨@HermitCrab,我不知道如何使用它?我刚刚对我可以以这种方式使用的问题进行了编辑吗?请看
  • useHttpReqHandler 必须返回一个数组。第一个元素是状态变量(apiResult),它将在axios调用成功后更新,第二个元素是要调用的函数(apiMethod)
  • 正如我所做的有问题的编辑是正确的方法吗?
  • 嗨@HermitCrab 我怎样才能在你的代码中添加spiner?如果您有时间,请添加您的代码
【解决方案2】:

在我看来,最好将 .then 与 Axios 一起使用。并尝试为每个方法创建不同的函数“Get/Post...”,为什么因为在 GET 方法中您需要使用Effect,但在 POST 方法中不能相同。在 GET 方法中useHttpReqHandler.js

import { useEffect, useState } from "react";
import axios from "axios";

// GET DATA
const useHttpReqHandler = (url) => {
  const [httpData, setHttpData] = useState();

  useEffect(() => {
    axios
      .get(url)
      .then((axiosData) => {
        // Axios DATA object

        setHttpData(axiosData.data);
        // you can check what is in the object by console.log(axiosData);
        // also you can change the state, call functions...
      })
      .catch((error) => {
        console.log(error);
      });
  }, []);

  return httpData;
};
export default useHttpReqHandler;

在你的main file

import useHttpReqHandler from "...."
const MyFunc = () => {
       const getData = useHttpReqHandler("URL");

   return (
      <div>
...
</div>
   )
}

希望对你有帮助

对于 POST、PUT、DELETE 也是如此……您将为每个处理 Http req 的方法创建函数

【讨论】:

  • 你好@Ahmed for post request 我将如何以这种方式发送 post req 参数``` axios.post(url ,data)```
  • 你可以这样做 axios.post(https:api.com/${parameter},yourData);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 2020-08-27
  • 2019-12-18
  • 2013-05-01
  • 1970-01-01
  • 2020-12-05
  • 2021-09-29
相关资源
最近更新 更多