我正在使用React Navigation5。 我有一个标签导航器,想清除单击标签上的标签历史记录。 例如,我在选项卡1上,然后转到选项卡2。 在tab2中,我导航
screen1-> screen2-> screen3
现在,如果我单击选项卡,它将进入初始屏幕(screen1)。 但它不起作用,它以错误的方式起作用。 这是我的代码。
import React from 'react';
import { createStackNavigator } from '@react-navigation/stack';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { CommonActions, StackActions } from '@react-navigation/native';
// Custom imports:
import StartScreen from '../screens/start/StartScreen';
import ProductsScreen from '../screens/products/ProductsScreen';
import AddCustomerScreen from '../screens/customers/AddCustomerScreen';
import CustomersScreen from '../screens/customers/CustomersScreen';
import WebviewScreen from '../screens/webview/WebviewScreen';
// Menu Screen
import MenuScreen from '../screens/menu/MenuScreen';
import CurrentAccountScreen from '../screens/menu/CurrentAccountScreen';
import AccountDetailScreen from '../screens/menu/AccountDetailScreen';
import AppInfoScreen from '../screens/menu/AppInfoScreen';
import MessagesScreen from '../screens/menu/MessagesScreen';
import { Colors, GlobalStyles } from '../constants';
import { Badge, CustomIcon } from '../components/icons';
import {
iconStart,
iconProducts,
iconCustomers,
iconMenu
} from '../components/icons/TabBarIcons';
import {
IconLowbarAddOrder,
} from '../components/IconFiles';
const Stack = createStackNavigator();
// Initial Parameters for WebView
let initParamsForWebView = {
url: '',
screenName: '',
haveUser: false,
user: false
};
/**
* Start Stack Navigator
**/
const INIT_START_ROUTE = 'Start';
function StartStack() {
return (
<Stack.Navigator screenOptions={{ headerShown: false }} initialRouteName={INIT_START_ROUTE}>
<Stack.Screen name="Start" component={StartScreen} />
<Stack.Screen name="Webview"
component={WebviewScreen}
initialParams={initParamsForWebView}
/>
</Stack.Navigator>
);
}
/**
* Products Stack Navigator
**/
const INIT_PRODUCTS_ROUTE = 'Products';
function ProductsStack() {
return (
<Stack.Navigator screenOptions={{ headerShown: false }} initialRouteName={INIT_PRODUCTS_ROUTE}>
<Stack.Screen name="Products" component={ProductsScreen} />
<Stack.Screen name="Webview"
component={WebviewScreen}
initialParams={initParamsForWebView}
/>
</Stack.Navigator>
);
}
/**
* Menu Stack Navigator
**/
const INIT_MENU_ROUTE = 'Menu';
function MenuStack() {
return (
<Stack.Navigator screenOptions={{ headerShown: false }} initialRouteName={INIT_CUSTOMERS_ROUTE}>
<Stack.Screen name="Menu" component={MenuScreen} />
<Stack.Screen name="CurrentAccount" component={CurrentAccountScreen} />
<Stack.Screen name="AccountDetail" component={AccountDetailScreen} />
<Stack.Screen name="AppInfo" component={AppInfoScreen} />
<Stack.Screen name="Messages" component={MessagesScreen} />
<Stack.Screen name="Webview"
component={WebviewScreen}
initialParams={initParamsForWebView}
/>
</Stack.Navigator>
);
}
function resetStack(navigation, _route, _stack, _screen){
console.log(_route);
console.log(navigation);
console.log('ResetStack Called');
navigation.dispatch(
CommonActions.reset({
index: 0,
routes: [
{ name: _stack}
]
})
);
}
const BottomTab = createBottomTabNavigator();
const INITIAL_ROUTE_NAME = 'StartStack';
export default function ParticipantNavigator({ navigation, route }) {
// screenOptions={{ headerShown: false }}
return (
<BottomTab.Navigator
screenOptions={{ headerShown: false }}
initialRouteName={INITIAL_ROUTE_NAME}
lazy='false'
tabBarOptions={{}}>
<BottomTab.Screen
name="StartStack"
component={StartStack}
options={{
title: 'Start'
}}
listeners={{
tabPress: e => {
resetStack(navigation, route, 'StartStack', INIT_START_ROUTE);
}
}}
/>
<BottomTab.Screen
name="ProductsStack"
component={ProductsStack}
options={{
title: 'Products'
}}
listeners={{
tabPress: e => {
resetStack(navigation, route, 'ProductsStack', INIT_PRODUCTS_ROUTE);
}
}}
/>
<BottomTab.Screen
name="MenuStack"
component={MenuStack}
options={{
title: 'Menu'
}}
listeners={{
tabPress: e => {
resetStack(navigation, route, 'MenuStack', INIT_MENU_ROUTE);
}
}}
/>
</BottomTab.Navigator>
);
}
此代码面临两个问题。
任何人都可以帮助我,谢谢。
答案 0 :(得分:4)
如果您正在浏览标签页,然后想要重设标签页,请尝试此React Navigation 5,这里是链接see the documentation React Navigation 5
<BottomTab.Screen
name="Post"
component={PostStack}
options={{
unmountOnBlur: true,// set this props in your tab screen options
title: 'Post',
tabBarIcon: focused => <TabBarIcon focused={focused} name="Post" />,
}}
/>
答案 1 :(得分:2)
答案 2 :(得分:0)
这是 React Navigation 5.x 的解决方案
https://stackoverflow.com/a/66982007/10672805
下面的代码用于重置多个标签。
TabNavigator
Tab1: 'tab1_name'
StackNavigator
- ScreenA
- ScreenB
Tab2: 'tabs_name'
StackNavigator
- ScreenC
- ScreenD
Tab3: 'tab3_name'
StackNavigator
- ScreenE
- ScreenF
navigation.dispatch(
CommonActions.reset({
routes: [
{
name: 'tab1_name',
state: {
routes: [
{ name: 'ScreenA' },
{ name: 'ScreenB' },
]
}
},
{
name: 'tab2_name',
state: {
routes: [
{ name: 'ScreenC' },
]
}
},
{
name: 'tab3_name',
state: {
routes: [
{ name: 'ScreenE' },
{ name: 'ScreenF' },
]
}
},
]
})
)
使用此代码,您看到的第一页是 tab1_name
标签的 ScreenB
屏幕。
因此,如果您想在运行 dispatch 函数后首先看到 tab3_name
选项卡的 ScreenF
屏幕,代码应该类似于:
navigation.dispatch(
CommonActions.reset({
routes: [
{
name: 'tab3_name',
state: {
routes: [
{ name: 'ScreenE' },
{ name: 'ScreenF' },
]
}
},
{
name: 'tab1_name',
state: {
routes: [
{ name: 'ScreenA' },
{ name: 'ScreenB' },
]
}
},
{
name: 'tab2_name',
state: {
routes: [
{ name: 'ScreenC' },
]
}
},
]
})
)
顺便说一句,当你写下tab的routes
的{{1}}时,它应该遵循页面堆栈的顺序。这样它就会按您的预期工作。
state
如果省略上面的第一个堆栈页,navigation.dispatch(
CommonActions.reset({
routes: [
{
name: 'tab3_name',
state: {
routes: [
// { name: 'ScreenE' }, // removed
{ name: 'ScreenF' },
]
}
},
...
是不可访问的,只有在运行调度函数后才能访问 ScreenE
。
希望这对你有用。