Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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
Javascript 未安装组件的状态更新。要修复此问题,请取消useEffect清理函数中的所有订阅和异步任务_Javascript_Node.js_Reactjs_React Native - Fatal编程技术网

Javascript 未安装组件的状态更新。要修复此问题,请取消useEffect清理函数中的所有订阅和异步任务

Javascript 未安装组件的状态更新。要修复此问题,请取消useEffect清理函数中的所有订阅和异步任务,javascript,node.js,reactjs,react-native,Javascript,Node.js,Reactjs,React Native,我正在尝试在FlatList中使用ListEmptyComponent 如果我没有数据,我想显示ListEmptyComponent={} 但是,在LoadingSecond组件中,我使用useEffect在加载为true时进行渲染,并且在2秒后没有数据,即加载为false时尝试渲染。。但如果我使用此代码,则会发生此错误 state update on an unmounted component. This is a no-op, but it indicates a memory le

我正在尝试在FlatList中使用ListEmptyComponent

如果我没有数据,我想显示ListEmptyComponent={}

但是,在LoadingSecond组件中,我使用useEffect在加载为true时进行渲染,并且在2秒后没有数据,即加载为false时尝试渲染。。但如果我使用此代码,则会发生此错误

 state update on an unmounted component. This is a no-op, but it indicates a 
 memory leak in your application. To fix, cancel all subscriptions and 
 asynchronous tasks in a useEffect cleanup function.
我明白原因是什么。但我不知道我该如何修复

这是我的密码

(todoList.js)

返回(
字符串(item.id)}
initialNumToRender={50}
ListMPtyComponent={}
renderItem={({item})=>(
)}
/>
);
(Loadingsecond.js)

const loadingsecond=()=>{
const[loading,setLoading]=useState(false);
useffect(()=>{
设置加载(真);
设置超时(()=>{
设置加载(假);
},2000);
},[]);
返回(
装货(
)
:(
没有数据
)
);
};

如何解决此错误?

您应该在清除功能中清除计时器。由于某种原因,该组件在超时过期之前正在卸载,因此您正在尝试设置已卸载组件的状态。调用从
useffect
挂钩返回清理函数,以清理当前渲染周期中的任何效果。当与带有空依赖项的
useffect
挂钩一起使用时,它与
componentWillUnmount
同义,换句话说,它在组件卸载之前运行

useEffect(() => {
  setLoading(true);
  const timerId = setTimeout(() => {
    setLoading(false);
  }, 2000);

  return () => clearTimeout(timerId);
}, []);

非常感谢。我明白了!!!!!!
            const Loadingsecoend = () => {

            const [loading, setLoading] = useState(false);

            useEffect(() => {
                setLoading(true);
                setTimeout(() => {
                setLoading(false);
                },2000);
            },[]);

            
            return (
            
            loading ? (
                <Container>
                <ActivityIndicator color="#D3D3D3" size="large" />
                </Container>
            )
                :(<Container>
                <Label>no data</Label>
                </Container>)
            
            );
            };
useEffect(() => {
  setLoading(true);
  const timerId = setTimeout(() => {
    setLoading(false);
  }, 2000);

  return () => clearTimeout(timerId);
}, []);