使用嵌套堆栈导航器时两个 headers
Two headers when using nested Stacknavigators
在我的 React 本机应用程序中,我在 StackNavigator 中使用 TabNavigator:
const AppTabs = createBottomTabNavigator(
{
Home: Tab1,
Create: Tab2,
Search: Tab3,
Ask: Tab4
}
);
const AppStack = createStackNavigator(
{
Tabs: AppTabs,
Screen2: SecondScreen,
Screen3: ThirdScreen,
},
{
initialRouteName: "Tabs"
}
);
这很好用,但是当我尝试为搜索选项卡使用另一个 StackNavigator 时,会显示两个 header,我发现的唯一解决方案是隐藏嵌套的 StackNavigator 的 header 和 headerMode: "none"
:
const SearchStack = createStackNavigator(
{
Search: SearchScreen,
Post: PostScreen,
},
{
headerMode: "none",
navigationOptions: {
headerShown: false
},
initialRouteName: "Search"
}
);
但是,此功能不是我的应用程序的最佳选择。我需要在搜索选项卡处于焦点时隐藏外部 StackNavigator 的 header,这样用户仍然可以在嵌套搜索堆栈中的屏幕之间来回切换。有人可以告诉我应该怎么做才能实现这一目标吗?
将您的 AppStack
导航器更改为以下内容:
const AppStack = createStackNavigator(
{
Tabs: AppTabs,
Screen2: SecondScreen,
Screen3: ThirdScreen,
},
{
defaultNavigationOptions: ({navigation}) => {
const currentRoute = navigation.state.routes[navigation.state.index];
const {routeName} = currentRoute;
let tabBarVisible = true;
if (routeName === 'Search') {
tabBarVisible = false;
}
return {
headerShown: tabBarVisible,
};
},
initialRouteName: 'Tabs',
},
);
如果应用正在渲染 Search
路由,最上面的 StackNavigator
(AppStack
) 的 headerShown
属性 将被设置为 false .这意味着应用程序在呈现 Search
路由时不会显示 AppStack
header。
SearchStack
导航器可以这样简单地定义:
const SearchStack = createStackNavigator(
{
Search: SearchScreen,
Post: PostScreen,
},
{
initialRouteName: 'Search',
},
);
Simply use below code in the page you want to hide the header
export default class SearchScreen extends Component {
static navigationOptions = {
header: null
}
}
我认为您以错误的方式使用了 react-navigation,您不应该为 SearchStack 制作单独的堆栈导航器,而应该只在 AppStack 中添加 SearchStack 的屏幕。
const AppTabs = createBottomTabNavigator(
{
Home: Tab1,
Create: Tab2,
Search: Tab3,
Ask: Tab4
}
);
const AppStack = createStackNavigator(
{
Tabs: AppTabs,
Post: PostScreen,
Screen2: SecondScreen,
Screen3: ThirdScreen,
},
{
initialRouteName: "Tabs"
}
);
在我的 React 本机应用程序中,我在 StackNavigator 中使用 TabNavigator:
const AppTabs = createBottomTabNavigator(
{
Home: Tab1,
Create: Tab2,
Search: Tab3,
Ask: Tab4
}
);
const AppStack = createStackNavigator(
{
Tabs: AppTabs,
Screen2: SecondScreen,
Screen3: ThirdScreen,
},
{
initialRouteName: "Tabs"
}
);
这很好用,但是当我尝试为搜索选项卡使用另一个 StackNavigator 时,会显示两个 header,我发现的唯一解决方案是隐藏嵌套的 StackNavigator 的 header 和 headerMode: "none"
:
const SearchStack = createStackNavigator(
{
Search: SearchScreen,
Post: PostScreen,
},
{
headerMode: "none",
navigationOptions: {
headerShown: false
},
initialRouteName: "Search"
}
);
但是,此功能不是我的应用程序的最佳选择。我需要在搜索选项卡处于焦点时隐藏外部 StackNavigator 的 header,这样用户仍然可以在嵌套搜索堆栈中的屏幕之间来回切换。有人可以告诉我应该怎么做才能实现这一目标吗?
将您的 AppStack
导航器更改为以下内容:
const AppStack = createStackNavigator(
{
Tabs: AppTabs,
Screen2: SecondScreen,
Screen3: ThirdScreen,
},
{
defaultNavigationOptions: ({navigation}) => {
const currentRoute = navigation.state.routes[navigation.state.index];
const {routeName} = currentRoute;
let tabBarVisible = true;
if (routeName === 'Search') {
tabBarVisible = false;
}
return {
headerShown: tabBarVisible,
};
},
initialRouteName: 'Tabs',
},
);
如果应用正在渲染 Search
路由,最上面的 StackNavigator
(AppStack
) 的 headerShown
属性 将被设置为 false .这意味着应用程序在呈现 Search
路由时不会显示 AppStack
header。
SearchStack
导航器可以这样简单地定义:
const SearchStack = createStackNavigator(
{
Search: SearchScreen,
Post: PostScreen,
},
{
initialRouteName: 'Search',
},
);
Simply use below code in the page you want to hide the header
export default class SearchScreen extends Component {
static navigationOptions = {
header: null
}
}
我认为您以错误的方式使用了 react-navigation,您不应该为 SearchStack 制作单独的堆栈导航器,而应该只在 AppStack 中添加 SearchStack 的屏幕。
const AppTabs = createBottomTabNavigator(
{
Home: Tab1,
Create: Tab2,
Search: Tab3,
Ask: Tab4
}
);
const AppStack = createStackNavigator(
{
Tabs: AppTabs,
Post: PostScreen,
Screen2: SecondScreen,
Screen3: ThirdScreen,
},
{
initialRouteName: "Tabs"
}
);