自定义hook请求的问题
刚开始接触hook,体会到了它的方便之处,但是也遇到不少问题。基于hook和fetch封装了一个自定义hook.
代码如下:
import React, { useState, useEffect, useRef } from "react";
import NavigationService from "@/navigation/NavigationService";
import store from "react-native-simple-store";
import getUrl from "@/utils/UrlUtil";
import ToastUtil from "@/utils/ToastUtil";
let newUrl = "";
/**
* @desc 数据请求公共方法
* @param {*} method 请求方式
*/
const useFetch = (method = "GET") => {
const [res, setRes] = useState({});
const [url, setUrl] = useState(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const firstUpdate = useRef(true);
const sendFetch = (url) => {
setUrl(getUrl(url));
};
useEffect(() => {
let disCancel = false;
(async () => {
if (firstUpdate.current) return (firstUpdate.current = false);
console.log("Not the first update");
try {
let access_token;
await store.get("loginData").then((data) => {
if (data && data.access_token) access_token = data.access_token;
return data;
});
const options = {
method,
headers: { "Content-Type": "application/json;charset=utf-8" },
};
if (access_token) {
newUrl = `${url}&access_token=${access_token}`;
} else {
newUrl = url;
}
!disCancel && setLoading(true);
const res = await fetch(newUrl, options);
const json = await res.json();
!disCancel && setLoading(false);
if (json.error) {
//* 请求成功,返回错误数据
if (json.error === "invalid_token") {
//* token过期
store.delete("loginData");
NavigationService.replace("Login");
return;
}
ToastUtil.showLong(json.error);
} else {
//* 请求成功,返回正确数据
!disCancel && setRes(json.data || json);
}
} catch (error) {
!disCancel && setLoading(false);
!disCancel && setError(error);
}
})();
return () => {
disCancel = true
}
}, [url]);
return { sendFetch, res, loading, error };
};
export default useFetch;
问题一:参数传递总是:看了不少别人写的,基本上都是把url作为useEffect依赖的变量,然后把sendFetch
export出去,在需要发送请求的地方调用。但是其它的关键参数怎么传递更好呢。像get
和post
方法,我是在useFetch
的时候传,还是sendFetch
的时候。看别人写的hook都是把initialUrl
和initailData
这两个参数在调用useFetch的时候传递的,我感觉没必要,我只在useFetch
的时候传了get
或者post
问题:如何添加统一的token:我们接口的token
是通过添加到url
后面传递的,也就是我不能把token
放到options
的header
里。现在的做法就是通过react-native-simple-store
先从本地缓存里读取,然后在判断有没有token
有就添加到url
里,但是这个库是异步执行的,所以我必须在前面加下await
确保先拿到token
再发请求,感觉这样写代码又不太好看。总感觉自己封装的hook
不简洁
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
确实 我开始用的时候也很纠结 总感觉哪哪都别扭
现在总结了一套做法感觉还行, 供你参考
首先实现一个
useLoadable
方法, 这是一个比较通用的方法,只接收一个异步方法,然后生成状态与结果。类型定义:
使用的例子:
然后对于确定的业务请求进行再次封装,比如: