React native 嵌套选项卡导航器中的自定义标题
对于我正在开发的应用程序,我有一个相当复杂的导航流程要求 我有一个底部选项卡栏,对于每个选项卡,我将有一个顶部选项卡栏,用于其他相关视图 不过,在嵌套的“所有”选项卡中的“视频”选项卡上,我需要在标题中添加一个搜索栏,在“收藏夹”选项卡上,我将有另一个自定义标题,在右上角有一个“编辑”按钮 如何在允许React导航协调所有内容的同时实现此导航。见下图: 我不想做的是在MainNavigator级别禁用标头,并为特定路由启用它。甚至更糟糕的是,在单个容器上嵌入标题和选项卡栏 routes.jsReact native 嵌套选项卡导航器中的自定义标题,react-native,react-navigation,React Native,React Navigation,对于我正在开发的应用程序,我有一个相当复杂的导航流程要求 我有一个底部选项卡栏,对于每个选项卡,我将有一个顶部选项卡栏,用于其他相关视图 不过,在嵌套的“所有”选项卡中的“视频”选项卡上,我需要在标题中添加一个搜索栏,在“收藏夹”选项卡上,我将有另一个自定义标题,在右上角有一个“编辑”按钮 如何在允许React导航协调所有内容的同时实现此导航。见下图: 我不想做的是在MainNavigator级别禁用标头,并为特定路由启用它。甚至更糟糕的是,在单个容器上嵌入标题和选项卡栏 routes.js i
import {
StackNavigator,
TabNavigator,
DrawerNavigator
} from "react-navigation";
import Feed from "./containers/Feed";
import Auth from "./containers/Auth";
import News from "./containers/News";
import Videos from "./containers/Videos";
import FavouriteVideos from "./containers/FavouriteVideos";
const DashboardNavigator = TabNavigator(
{
Feed: {
screen: Feed
},
News: {
screen: News
}
},
{
tabBarPosition: "top"
}
);
const VideoNavigator = TabNavigator(
{
Videos: {
screen: Videos,
navigationOptions: {
title: "All"
}
},
Favourites: {
screen: FavouriteVideos
}
},
{
tabBarPosition: "top"
}
);
const MainNavigator = TabNavigator(
{
Dashboard: {
screen: DashboardNavigator,
navigationOptions: ({}) => ({
title: "Dashboard"
})
},
Video: {
screen: VideoNavigator,
navigationOptions: ({}) => ({
title: "Videos"
})
}
},
{
swipeEnabled: false,
animationEnabled: false,
tabBarPosition: "bottom"
}
);
const AuthenticatedNavigator = DrawerNavigator({
App: {
screen: MainNavigator
}
});
const RootNavigator = StackNavigator({
LoggedOut: {
screen: Auth
},
Authenticated: {
screen: AuthenticatedNavigator
}
});
export default RootNavigator;
零食
图像
import {
StackNavigator,
TabNavigator,
DrawerNavigator
} from "react-navigation";
import Feed from "./containers/Feed";
import Auth from "./containers/Auth";
import News from "./containers/News";
import Videos from "./containers/Videos";
import FavouriteVideos from "./containers/FavouriteVideos";
const DashboardNavigator = TabNavigator(
{
Feed: {
screen: Feed
},
News: {
screen: News
}
},
{
tabBarPosition: "top"
}
);
const VideoNavigator = TabNavigator(
{
Videos: {
screen: Videos,
navigationOptions: {
title: "All"
}
},
Favourites: {
screen: FavouriteVideos
}
},
{
tabBarPosition: "top"
}
);
const MainNavigator = TabNavigator(
{
Dashboard: {
screen: DashboardNavigator,
navigationOptions: ({}) => ({
title: "Dashboard"
})
},
Video: {
screen: VideoNavigator,
navigationOptions: ({}) => ({
title: "Videos"
})
}
},
{
swipeEnabled: false,
animationEnabled: false,
tabBarPosition: "bottom"
}
);
const AuthenticatedNavigator = DrawerNavigator({
App: {
screen: MainNavigator
}
});
const RootNavigator = StackNavigator({
LoggedOut: {
screen: Auth
},
Authenticated: {
screen: AuthenticatedNavigator
}
});
export default RootNavigator;
您可以结合使用react导航功能来实现所需的行为 您可以监听焦点和模糊事件,然后更改参数。然后在路由配置中,您可以查找此参数并决定要为标头呈现的内容。我想展示一个我所建议的工作示例 示例
const MainNavigator = TabNavigator(
{
Dashboard: {
screen: DashboardNavigator,
navigationOptions: ({}) => ({
title: "Dashboard"
})
},
Video: {
screen: VideoNavigator,
navigationOptions: ({navigation}) => {
let title = 'Videos';
navigation.state.routes.forEach((route) => {
if(route.routeName === 'Videos' && route.params) {
title = route.params.title;
}
});
// I set title here but you can set a custom Header component
return {
tabBarLabel: 'Video',
title
}
}
}
},
{
swipeEnabled: false,
animationEnabled: false,
tabBarPosition: "bottom"
}
);
导出默认类视频扩展组件{
建造师(道具){
超级(道具);
this.willFocusSubscription=props.navigation.addListener(
“willFocus”,
有效载荷=>{
this.props.navigation.setParams({title:'All Videos'});
}
);
this.willBlurSubscription=props.navigation.addListener(
“willBlur”,
有效载荷=>{
this.props.navigation.setParams({title:'Just Videos'});
}
);
}
组件将卸载(){
this.willFocusSubscription.remove();
此.willBlurSubscription.remove();
}
render(){
返回(
视频
);
}
}
Hi Benny,设置标题会传播到根堆栈导航器。提供更复杂的功能,如搜索栏(需要自定义标题组件)不会传播。我确实创建了一个特性请求:就是为了这个。显然,我必须使用setParams