reactjs - 在 useEffect 中使用自定义挂钩
问题描述
我正在尝试使用自定义 Axios 挂钩来获取一些数据,但我收到一条错误消息,提示“无效的挂钩调用。钩子只能在函数组件的主体内调用。我知道这听起来很明显,但对于一个新手来说,这没有多大意义。
这是钩子:
import { useState } from "react";
import axios from "axios";
export default useApi = () => {
const [data, setData] = useState([]);
const [error, setError] = useState(false);
const [loading, setLoading] = useState(false);
const request = async () => {
const source = axios.CancelToken.source();
setLoading(true);
try {
const response = await axios.get(url, { cancelToken: source.token });
setData(response.data);
setLoading(false);
} catch (error) {
if (axios.isCancel(error)) {
// don't update state in case component is dismounting
console.log("cancelled");
} else {
setLoading(false);
setError(error);
}
}
return () => {
source.cancel();
};
};
return { data, error, loading, request };
};
我希望能够像返回一样使用数据、错误、加载和请求,所以我尝试使用解构。
import React, { useEffect } from "react";
import useApi from "../hooks/http-hook";
const { request, data, error, loading } = useApi();
const SomeComponent = (props) => {
useEffect(() => {
const getUsers = async () => {
try {
const res = await request("http://localhost:8000/api/users");
console.log(res);
} catch (err) {
console.log(err);
}
};
getUsers();
}, [request]);
}
export default SomeComponent;
解决方案
你必须在组件中使用你的钩子。
我看到您正试图在导入之后调用它,我想这在任何类型的组件之外。尝试类似的东西
import useApi from "../hooks/http-hook";
const YourComponent = () => {
const { request, data, error, loading } = useApi();
console.log(request, data, error, loading);
return <Stuff/>
}
推荐阅读
- r - 使用 fileInput (R shiny) 之类的函数获取文件的原始名称
- docker - 对自反泊坞窗图像构建的健全性检查?
- amazon-web-services - 如何解决 tls 的问题:kubernetes 中的内部错误
- r - 创建时间箱并将数据分配给正确的箱
- visual-studio - Visual Studio 中的发布选项 - Web 与文件系统
- python - Django-Nginx 和 Gunicorn 在 POST 请求上超时
- python - 空 html 输入返回的值的 Flask-Python 特征
- c - 从头实现malloc函数的问题
- ios - 为什么 UIView 的 CALayer.speed 为零会阻止 UIAlertController 的按钮工作?
- angular - 如何在角度 4 中使用 ngFor 动态呈现 svg