React Navigation TabNavigator:在选项卡更改时重置上一个选项卡
React Navigation TabNavigator: Reset previous tab on tab change
我有以下路由结构:
StackNavigator
-StackNavigator
-TabNavigator
--Tab1
---Route 1 (Stack) (initial)
---Route 2 (Stack)
--Tab2
---Route 3 (Stack) (initial)
---Route 4 (Stack)
当我访问 Tab1 -> Route 1 -> Route 2 -> Tab2
并返回 Tab1
时,活动路线是 2 而不是 initialRoute
1。
我正在执行以下操作:
tabBarOnPress: ({ scene }) => {
const { route } = scene;
const tabRoute = route.routeName;
const { routeName } = route.routes[0];
navigation.dispatch(NavigationActions.navigate({ routeName: tabRoute }));
navigation.dispatch(NavigationActions.reset({
index: 0,
actions: [
NavigationActions.navigate({ routeName }),
],
}));
},
但问题是它首先显示 Route 2
然后导航到 Route 1
。
如何重置之前的tab/screens,所以当我切换标签时总是直接显示初始路线。
你可以试试这样的重置道具:
tabBarOnPress: ({ scene }) => {
const { route } = scene;
const tabRoute = route.routeName;
const { routeName } = route.routes[0];
navigation.dispatch(NavigationActions.reset({
index: 1,
actions: [
NavigationActions.navigate({ routeName }),
NavigationActions.navigate({ routeName: tabRoute })
],
}));
},
编辑:如果这不能解决问题,您可以查看 this github issue with some workarounds
版本5.x.x的解决方案:
将侦听器传递给屏幕组件:
<Tab.Screen
name="homeTab"
component={HomeStackScreen}
listeners={tabBarListeners}
/>
然后在这个侦听器上,每次用户按下选项卡时导航用户:
const tabBarListeners = ({ navigation, route }) => ({
tabPress: () => navigation.navigate(route.name),
});
学分:https://github.com/react-navigation/react-navigation/issues/8583
版本4.x.x的解决方案:
tabBarOnPress: ({ navigation }) => {
navigation.popToTop();
navigation.navigate(navigation.state.routeName);
}
学分:https://github.com/react-navigation/react-navigation/issues/1557
版本 2.x.x 和 3.x.x 的解决方案:
问题是当我重置路线时,我需要传递前一个路线名称(离开标签)的导航动作并为下一个路线派发新的导航动作:
tabBarOnPress: ({ previousScene, scene }) => {
const tabRoute = scene.route.routeName;
const prevRouteName = previousScene.routes[0].routeName;
navigation.dispatch(NavigationActions.reset({
index: 0,
actions: [
NavigationActions.navigate({
routeName: prevRouteName
}),
],
}));
navigation.dispatch(NavigationActions.navigate({
routeName: tabRoute
}));
}
使用 unmountOnBlur 选项,它适用于所有类型的导航器、堆栈导航器、抽屉导航器、bottomtab 导航器
在导航器屏幕的options属性中传入unmountOnBlur
我有以下路由结构:
StackNavigator
-StackNavigator
-TabNavigator
--Tab1
---Route 1 (Stack) (initial)
---Route 2 (Stack)
--Tab2
---Route 3 (Stack) (initial)
---Route 4 (Stack)
当我访问 Tab1 -> Route 1 -> Route 2 -> Tab2
并返回 Tab1
时,活动路线是 2 而不是 initialRoute
1。
我正在执行以下操作:
tabBarOnPress: ({ scene }) => {
const { route } = scene;
const tabRoute = route.routeName;
const { routeName } = route.routes[0];
navigation.dispatch(NavigationActions.navigate({ routeName: tabRoute }));
navigation.dispatch(NavigationActions.reset({
index: 0,
actions: [
NavigationActions.navigate({ routeName }),
],
}));
},
但问题是它首先显示 Route 2
然后导航到 Route 1
。
如何重置之前的tab/screens,所以当我切换标签时总是直接显示初始路线。
你可以试试这样的重置道具:
tabBarOnPress: ({ scene }) => {
const { route } = scene;
const tabRoute = route.routeName;
const { routeName } = route.routes[0];
navigation.dispatch(NavigationActions.reset({
index: 1,
actions: [
NavigationActions.navigate({ routeName }),
NavigationActions.navigate({ routeName: tabRoute })
],
}));
},
编辑:如果这不能解决问题,您可以查看 this github issue with some workarounds
版本5.x.x的解决方案:
将侦听器传递给屏幕组件:
<Tab.Screen
name="homeTab"
component={HomeStackScreen}
listeners={tabBarListeners}
/>
然后在这个侦听器上,每次用户按下选项卡时导航用户:
const tabBarListeners = ({ navigation, route }) => ({
tabPress: () => navigation.navigate(route.name),
});
学分:https://github.com/react-navigation/react-navigation/issues/8583
版本4.x.x的解决方案:
tabBarOnPress: ({ navigation }) => {
navigation.popToTop();
navigation.navigate(navigation.state.routeName);
}
学分:https://github.com/react-navigation/react-navigation/issues/1557
版本 2.x.x 和 3.x.x 的解决方案:
问题是当我重置路线时,我需要传递前一个路线名称(离开标签)的导航动作并为下一个路线派发新的导航动作:
tabBarOnPress: ({ previousScene, scene }) => {
const tabRoute = scene.route.routeName;
const prevRouteName = previousScene.routes[0].routeName;
navigation.dispatch(NavigationActions.reset({
index: 0,
actions: [
NavigationActions.navigate({
routeName: prevRouteName
}),
],
}));
navigation.dispatch(NavigationActions.navigate({
routeName: tabRoute
}));
}
使用 unmountOnBlur 选项,它适用于所有类型的导航器、堆栈导航器、抽屉导航器、bottomtab 导航器
在导航器屏幕的options属性中传入unmountOnBlur