reactjs - react native如何使用Effect清理功能?
问题描述
警告:无法对未安装的组件执行 React 状态更新。这是一个空操作,但它表明您的应用程序中存在内存泄漏。要修复,请取消 %s 中的所有订阅和异步任务。%s,一个 useEffect 清理函数,
const Drawer = createDrawerNavigator();
const App = () => {
const [isLoading, setIsLoading] = React.useState(true);
const [userToken, setUserToken] = React.useState(null);
const authContext = React.useMemo(() => ({
SignIn: () => {
setUserToken('qwertyuiop');
setIsLoading(false);
},
SignOut: () => {
setUserToken(null);
setIsLoading(false);
},
SignUp: () => {
setUserToken('qwe');
setIsLoading(false);
},
}));
useEffect(() => {
setTimeout(() => {
setIsLoading(false);
}, 1000);
}, []);
if (isLoading) {
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<ActivityIndicator size="large" />
</View>
);
}
console.log("userToken", userToken)
console.log("authContext", authContext)
return (
<AuthContext.Provider value={authContext}>
<NavigationContainer>
{userToken !== null ? (
<Drawer.Navigator drawerContent={props => <DrawerContent {...props} />}>
<Drawer.Screen name="HomeDrawer" component={MainTabScreen} />
<Drawer.Screen name="Support" component={SupportScreen} />
<Drawer.Screen name="Setting" component={SettingScreen} />
<Drawer.Screen name="Bookmark" component={BookmarkScreen} />
</Drawer.Navigator>
)
:
<RootStackScreen />
}
</NavigationContainer>
</AuthContext.Provider>
);
}
解决方案
您应该始终在卸载时清除setTimeout
s 。setInterval
useEffect(() => {
const timeout = setTimeout(() => {
setIsLoading(false);
}, 1000);
return () => clearTimeout(timeout);
}, []);
您收到此警告是因为setTimeout
即使组件已卸载,它仍在进行中。
推荐阅读
- python - 向 MongoDB 发送文档
- numbers - 转发 Twilio 号码
- react-native - 我可以使用 prop nativeID 在本机代码中定位视图吗
- sql - 需要帮助以获得最大时间
- plot - rangelimited x 轴 gnuplot 消失
- javascript - Handlebars.js:分配给模板时的空属性
- python - 我无法使用 Angular 6 将 img 上传到 DRF api
- hive - Hive - 如何将数组转换为字符串?
- google-chrome - 将 Chrome 扩展程序转换为 Edge 扩展程序,权限问题
- sql-server - 无法在 SQL Server 中创建登录