我正在使用 axios 和 React,所以我想为此编写一个自定义钩子,我这样做了,它工作正常,如下所示
const useAxios = () => {
const [response, setResponse] = useState([]);
const [error, setError] = useState("");
const [loading, setLoading] = useState(true); //different!
const [controller, setController] = useState();
const axiosFetch = async (configObj) => {
const { axiosInstance, method, url, requestConfig = {} } = configObj;
try {
const ctrl = new AbortController();
setController(ctrl);
const res = await axiosInstance[method.toLowerCase()](url, {
...requestConfig,
});
setResponse(res.data);
} catch (err) {
console.log(err.message);
setError(err.message);
} finally {
setLoading(false);
}
};
useEffect(() => {
console.log(controller);
// useEffect cleanup function
return () => controller && controller.abort();
}, [controller]);
return [response, error, loading, axiosFetch];
};
我还创建了一个 axiosInstance 来传递 BASE_URL 和标头。
现在调用 useAxios 从 api 获取数据,如下所示
const [data, error, loading, axiosFetch] = useAxios();
const getData = () => {
axiosFetch({
axiosInstance: axios,
method: "GET",
url: "/url",
});
};
useEffect(() => {
getData();
}, []);
我的问题是
- 当我需要调用一个 api 时,我正在执行上面的操作。
- 但是如果我必须在一个页面中调用三个或四个 API 该怎么办?
- 我可以像这样复制代码吗
const [data1, error1, loading1, axiosFetch]=useAxios();
- 或者有没有其他方法可以最小化代码。
编辑/更新
我运行上面的代码来获取数据/url
,如果我想打不同的怎么办route
要从服务器获取更多数据以进行其他工作,基本 url 保持不变
所以如果第二条路线是/users
const [data, error, loading, axiosFetch] = useAxios();
const getUsers = () => {
axiosFetch({
axiosInstance: axios,
method: "GET",
url: "/users",
});
};
useEffect(() => {
getUsers();
}, [on_BTN_Click]);
上面的代码我想在同一个文件中运行,一个用于获取数据,一个用于获取用户,我应该如何编写我的 axios,因为我认为这个const [data, error, loading, axiosFetch] = useAxios();
应该只被调用一次,不知道如何执行此操作或什么是正确的方法,我是否需要更改我的useAxios
hook?