react-native - 抽屉内的 React Native 嵌套堆栈导航器导致导航上的无限 useEffect 循环
问题描述
我正在开发的应用程序包含一个抽屉导航器。我有一个嵌套在它下面的堆栈导航器。该堆栈由 2 个不同的堆栈导航器组成,向用户显示 2 个不同的流程,预订流程和退货流程。如果用户一次可以访问这些进程,则只有一个。因此,当用户完成预订流程时,我切换到 ReturnProcess。
我正在使用 react-native 0.63.2 和 react-navigation 5
// The stack containing the 2 other nested stacks
<BookingStack.Navigator initialRouteName="Booking" screenOptions={{ headerShown: false }} >
<BookingStack.Screen name="Booking" component={BookingProcess} />
<BookingStack.Screen name="Return" component={ReturnProcess} />
</BookingStack.Navigator>
// booking process stack
function BookingProcess() {
return (
<BookingProcessStack.Navigator initialRouteName="Map" screenOptions={{ headerShown: false }}>
<BookingProcessStack.Screen name="Map" component={MapScreen} />
<BookingProcessStack.Screen name="CardDetails" component={CreditCardDetailsScreen} />
... (rest of the screens)
</BookingProcessStack.Navigator>
);
}
//return process stack
const ReturnProcess = () => {
return (
<ReturnProcessStack.Navigator initialRouteName="MapDirections" screenOptions={{ headerShown: false }}>
<ReturnProcessStack.Screen name="MapDirections" component={MapDirectionsScreen} />
<ReturnProcessStack.Screen name="Queue" component={QueueScreen} />
...(rest of the screens)
</ReturnProcessStack.Navigator>
);
}
还有我的抽屉导航器,它持有结合其他两个的堆栈:
<UserDrawer.Screen name="Map" options={{
drawerLabel: () => <Text style={styles.menuItemText}>Map</Text>,
drawerIcon: () => <Icon type="entypo" name="location-pin" />,
}}
component={Booking} />
我在执行 api 请求的 MapScreen 上使用 useEffect 挂钩,并带有清理代码。但是,当我导航到 CreditCardScreen 时,CreditCardScreen 组件不断重新渲染并出现错误:无法找到带有标签 #17473 的阴影视图,这可能是由于本机视图和阴影视图之间的临时不一致造成的,然后超出了最大深度。页面闪烁,直到应用崩溃
我在 MapScreen 中的 useEffect 挂钩,我还尝试使用 react-navigation 库中的 useFocusEffect,但也有帮助:
useEffect(() => {
let isMounted = true;
getDeviceTypes().then(res => {
//cleanup
if (isMounted) {
setDeviceTypes(res.data.data)
getLocation();
};
})
return () => { isMounted = false }
}, []);
有人可以帮我解决这个问题,它已经完全阻止了我的进步 2 天。
谢谢
解决方案
我最终通过将 BookingProcess 和 ReturnProcess 移到 Booking 方法之外来修复它。
推荐阅读
- python - 人类可读的大小到一个字节范围
- java - 未调用 RetryLoadBalancerInterceptor
- python - 从 Python 串行输入解码 £ 符号的问题
- typescript - 在 vuex 中设置 firebase.User 会导致永恒循环
- sql - 如何在 Oracle 中获取表关系/结构图/实体关系图 (ERD) 或依赖关系?数据库?
- python - Twilio 函数:在函数调用中添加参数
- javascript - 如何使用 node.js 以 HTML 格式显示来自数据库的查询结果
- node.js - 使用 mongodb node express 使数据以形式持久化
- python - 如果在python中需要减少多个else
- angular - 如何在指令中获取 FormGroup?