reactjs - 根据其他钩子的结果反应钩子
问题描述
我有一个自定义钩子useWebApi
,它可以调用 web api 并返回 api 结果。
function useWebApi(method, url) {
const [fetching, setFetching] = useState(true);
const [result, setResult] = useState(null);
useEffect(() => {
axios[method](url).then(res => {
setFetching(false);
setResult(res);
})
}, [url]);
return [fetching, result];
}
我想做一些事情,比如 fetch url1
,如果url1
是 fetch ,那么 fetch url2
。这两个api不是独立的,url2
只能在url1
抓取完成后调用。所以我编写如下代码
const url1 = '/login';
const url2 = '/getMyUserInfo';
function App() {
const [fetching1, result1] = useWebApi('get', url1);
if (result1) {
const [fetching2, result2] = useWebApi('get', url2);
}
return (
<div>
{result1}
{result2}
</div>
)
}
但是钩子不能在if
语句内部调用,所以我将其更改为,
const url1 = '/login';
const url2 = '/getMyUserInfo';
function App() {
const [fetching1, result1] = useWebApi('get', url1);
useEffect(() => {
if (result1) {
const [fetching2, result2] = useWebApi('get', url2);
}
}, [result1])
return (
<div>
{result1}
{result2}
</div>
)
}
但是,仍然存在问题,我无法渲染result2
,因为它在嵌套范围内,那么我该如何解决呢?
解决方案
您可以做的是公开一个doFetch
方法等,以便手动调用钩子。
function useWebApi(method, url) {
const [fetching, setFetching] = useState(true);
const [result, setResult] = useState(null);
const doFetch = useCallback((fetchUrl = url) => {
axios[method](fetchUrl).then(res => {
setFetching(false);
setResult(res);
})
}, [method, url])
useEffect(() => {
if (url) {
doFetch();
}
}, [doFetch]);
return [fetching, result, doFetch];
}
function App() {
const [fetching1, result1, doFetch1] = useWebApi('get', url1);
const [fetching2, result2, doFetch2] = useWebApi('get');
useEffect(() => {
if (result1) {
doFetch2(url2);
}
}, [result1])
return (
<div>
{result1}
{result2}
</div>
)
}
推荐阅读
- python - 我的硒程序找不到元素
- python - 从数据框列中提取异常
- python - 使用 Google Sheet 公式计算归一化分数
- java - 如何在Android中创建一个实例来调用一个活动的方法到一个服务类?
- php - 单个 MySQL 列中的首选项列表
- docker - 将环境变量添加到包含以下内容的 Docker 文件中:
- ansible - 有没有办法在 Ansible 中显示已注册的处理程序或侦听器?
- rendering - 我们可以根据到相机的距离来控制 Viewer 中的渐进式渲染吗?
- java - 线程在终止之前不会输出流
- c++ - 使用 g++ 编译包含根库的 c++