useEffect中异步函数的React钩子警告:useEffect函数必须返回清理函数或不返回任何内容

我尝试了useffect示例,如下所示:

useffect(异步()=&gt{
试一试{
const response=等待获取(`https://www.reddit.com/r/${subreddit}.json`);
const json=await response.json();
setPosts(json.data.children.map(it=>it.data));
}捕获(e){
控制台错误(e);
}
}, []);

我在控制台里收到了这个警告。但我认为清理对于异步调用是可选的。我不知道为什么我会收到这个警告。链接沙盒以获取示例。https://codesandbox.io/s/24rj871r0p

我建议看看Dan Abramov(React core维护人员之一)的回答:

我觉得你把事情弄得比实际需要的更复杂了

函数示例(){
常量[数据,数据集]=useState<any>(空)
使用效果(()=&gt{
异步函数fetchMyAPI(){
let response=wait fetch('api/data')
response=wait response.json()
数据集(响应)
}
fetchMyAPI()
}, [])
return<div>{JSON.stringify(数据)}</div>
}

从长远来看,我们将不鼓励这种模式,因为它鼓励比赛条件。比如-在你的通话开始和结束之间,任何事情都可能发生,你可以得到新的道具。相反,我们将推荐暂挂用于数据获取,它看起来更像

const response=myapirource.read();

而且没有效果。但与此同时,您可以将异步内容移动到单独的函数并调用它

你可以在这里阅读更多关于实验悬念的内容


如果您想在eslint之外使用函数

函数在UsageExample({userId})之外{
常量[数据,数据集]=useState<any>(空)
const fetchMyAPI=useCallback(异步()=&gt{
let response=wait fetch('api/data/'+userId)
response=wait response.json()
数据集(响应)
},[userId])//如果userId更改,useffect将再次运行
//如果只想运行一次,只需将数组留空[]
使用效果(()=&gt{
fetchMyAPI()
},[fetchMyAPI])
返回(
<div>
<div>数据:{JSON.stringify(数据)}</div>
<div>
<button onClick={fetchMyAPI}>手动获取</button>
</div>
</div>
)
}

如果您要使用useCallback,请查看useCallback的工作原理示例。沙箱

import React,{useState,useffect,useCallback}from"“反应”;;
导出默认函数App(){
const[counter,setCounter]=useState(1);
//如果更改计数器,则fn将用新的计数器值更新
const fn=useCallback(()=&gt{
设置计数器(计数器+1);
},[柜台];
//若计数器已更改,则fn将不会更新,且fn内的计数器将始终为1
/*const fnBad=useCallback(()=&gt{
设置计数器(计数器+1);
}, []);*/
//如果fn或计数器已更改,则useEffect将重新运行
使用效果(()=&gt{
if(!(计数器%2))return;//如果计数器不是偶数,这将停止循环
fn();
},[fn,计数器];
//这将是无限循环,因为fn总是随着新的计数器值而变化
/*使用效果(()=&gt{
fn();
},[fn])*/
返回(
<div>
<div>计数器为{Counter}</div>
<button onClick={fn}>添加+1计数</button>
</div>
);
}

发表评论