Reactjs Can';t更新反应状态,即使组件未卸载 描述
我有一个组件,它显示从服务器获取的数据,并使用state、tableData和在调度Redux操作时必须设置 我使用了action listener库,它使用了由63行代码组成的Reactjs Can';t更新反应状态,即使组件未卸载 描述,reactjs,redux,middleware,Reactjs,Redux,Middleware,我有一个组件,它显示从服务器获取的数据,并使用state、tableData和在调度Redux操作时必须设置 我使用了action listener库,它使用了由63行代码组成的Redux中间件 例如,当我在analysislistiready({})上注册一个函数时,键入ANALYSISLIST\u已准备就绪,然后在调度操作时调用该函数 问题 问题是react有时会抛出错误:无法更新react state…forsetTableData,因此将忽略要设置的响应数据。我想知道它什么时候发生 我假
Redux中间件
例如,当我在analysislistiready({})上注册一个函数时,键入ANALYSISLIST\u已准备就绪
,然后在调度操作时调用该函数
问题
问题是react有时会抛出错误:无法更新react state…
forsetTableData
,因此将忽略要设置的响应数据。我想知道它什么时候发生
我假设这是因为卸载了组件,所以我打印了一些日志,但没有打印任何日志,而且ComponentA也没有消失
当我删除getAnalysisJsonPathApi
和getResource
时,它没有出现任何错误,所以我尝试重新生成它,但失败了
当我删除listenMiddleware.addListener
see:#2时,它没有出现任何错误
#一,
嗯,正如你所说:
因为卸下了组件
在useffect()
函数中,您需要检查组件网是否已装入,换句话说,您需要执行componentDidMount
和componentdiddupdate
(如果需要)逻辑:
我没有详细介绍您的问题代码,但我的提示可能会对您有所帮助,通常此错误发生在fetchData函数中,
假设您有一个fetchData函数,如下所示:
fetchData(){
...
let call = await service.getData();
...
--->setState(newItems)//Here
}
所以当api调用结束和状态需要更新时,若组件已卸载,则无需设置状态,
当组件将卸载时,您可以使用bool变量并将其设置为false:
let stillActive= true;
fetchData(){
active = true;
...
let call = await service.getData();
...
if(stillActive)
setState(newItems)//Here
}
}
componentWillUnmount(){
active = false;
}
我发现这是因为redux侦听器qkreltms,redux中间件
当组件安装到侦听器中时,它保持功能,但即使组件卸载,也不会更改其功能
middleware.addListener=(类型,listener)=>{
for(设i=0;i
// ComponentA
const [tableData, setTableData] = useState([])
useEffect(() => {
return () => {
console.log("unmounted1")
}}, [])
useEffect(() => {
if (steps.step2a) {
try {
getAnalysisJsonPathApi().then((res) => {
//...
getResource(volumeUrl)
.then((data: any) => {
// ...
setTableData(data)
})
})
} catch (error) {
warn(error.message)
}
}
return () => {
console.log("unmounted2")
}
}, [steps.step2a])
const mounted = useRef();
useEffect(() => {
if (!mounted.current) {
// do componentDidMount logic
console.log('componentDidMount');
mounted.current = true;
} else {
// do componentDidUpdate logic
console.log('componentDidUpdate');
}
});
fetchData(){
...
let call = await service.getData();
...
--->setState(newItems)//Here
}
let stillActive= true;
fetchData(){
active = true;
...
let call = await service.getData();
...
if(stillActive)
setState(newItems)//Here
}
}
componentWillUnmount(){
active = false;
}