Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs Can';t更新反应状态,即使组件未卸载 描述_Reactjs_Redux_Middleware - Fatal编程技术网

Reactjs Can';t更新反应状态,即使组件未卸载 描述

Reactjs Can';t更新反应状态,即使组件未卸载 描述,reactjs,redux,middleware,Reactjs,Redux,Middleware,我有一个组件,它显示从服务器获取的数据,并使用state、tableData和在调度Redux操作时必须设置 我使用了action listener库,它使用了由63行代码组成的Redux中间件 例如,当我在analysislistiready({})上注册一个函数时,键入ANALYSISLIST\u已准备就绪,然后在调度操作时调用该函数 问题 问题是react有时会抛出错误:无法更新react state…forsetTableData,因此将忽略要设置的响应数据。我想知道它什么时候发生 我假

我有一个组件,它显示从服务器获取的数据,并使用state、tableData和在调度Redux操作时必须设置

我使用了action listener库,它使用了由63行代码组成的
Redux中间件

例如,当我在
analysislistiready({})上注册一个函数时,键入
ANALYSISLIST\u已准备就绪
,然后在调度操作时调用该函数

问题 问题是react有时会抛出错误:
无法更新react state…
for
setTableData
,因此将忽略要设置的响应数据。我想知道它什么时候发生

我假设这是因为卸载了组件,所以我打印了一些日志,但没有打印任何日志,而且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;
    }