如何在reactjs挂钩中创建自定义挂钩?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在reactjs挂钩中创建自定义挂钩?相关的知识,希望对你有一定的参考价值。
我试图通过简单地调用useCustomHooks创建自定义的Hook来处理来自任何组件的输入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的初学者
useHttpReqHandler.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};
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请求的方法创建函数
以上是关于如何在reactjs挂钩中创建自定义挂钩?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Reactjs 中的 useEffect 挂钩访问道具
ReactJS:如何只调用一次 useEffect 挂钩来获取 API 数据