React Native:React Navigation - 在每个屏幕中使用相同的 header 组件?
React Native: React Navigation - use the same header component in every screen?
所以,我正在尝试使用 React Navigation,并且我想在所有屏幕上使用相同的 Header 组件。
我使用了expo-cli
来创建项目。
在我的 MainTabNavigator.js
文件中,我有一个 HomeStack
和 SettingsStack
,它们看起来像这样:
const config = Platform.select({
web: { headerMode: "screen" },
default: {}
});
const HomeStack = createStackNavigator(
{
Home: HomeScreen
},
config
);
HomeStack.navigationOptions = {
tabBarIcon: ({ focused }) => (
<NavButton
focused={focused}
name={focused ? "star" : "create"}
label={focused ? "Save" : "New"}
/>
)
};
HomeStack.path = "";
在文件的底部,我有我的 tabNavigator
const tabNavigator = createBottomTabNavigator(
{
HomeStack,
SettingsStack
},
{
tabBarOptions: {
inactiveTintColor: "#fff",
labelStyle: {
fontSize: 14
},
showLabel: false,
style: {
backgroundColor: "#fff",
borderTopColor: "#fff",
height: 70,
paddingBottom: 10,
paddingTop: 10
}
}
}
);
tabNavigator.path = "";
export default tabNavigator;
我尝试在 createBottomTabNavigator
函数的 tabBarOptions
上方的 navigatorOptions
和 defaultNavigationOption
中添加一个 <Header />
组件。
与此类似:
...
{
navigationOptions: {
header: <Header />
},
tabBarOptions: {
inactiveTintColor: "#fff",
labelStyle: {
fontSize: 14
},
...
但这只是让我一片空白 header...没有使用我的组件。
我目前拥有我想要的功能,但我必须进入每个 Screen
文件并添加:
HomeScreen.navigationOptions = {
header: <Header />
};
目前正在使用 "react-navigation": "^3.11.0"
感谢任何帮助!
在每个屏幕中将 header
设置为 null
并在每个屏幕上加载您的组件
class HomeScreen extends Component {
static navigationOptions = {
header: null,
};
render(){
return(
<View style={{flex:1}}>
<Header />
</View>
)
}
}
因此,react-navigation
的默认 header
将是 null
,您可以将自定义组件加载为 header
或
class HomeScreen extends React.Component {
static navigationOptions = {
// headerTitle instead of title
headerTitle: <Header />,
};
/* render function, etc */
}
使用 headerTitle
而不是 title
加载自定义组件
将您的 StackNavigator 设置为 BottomTabNavigator 的 parent,这样您就可以为所有 bottomTab 设置一个 header。
如果您使用这种方法,并且出于某种原因需要在 header 上添加 backButton
,您必须自己手动更改它。
const bottomTabNavigator = createBottomTabNavigator(bottomRoutesConfig, bottomNavigatorConfigs)
createStackNavigator:({ tabNavigator : bottomTabNavigator },{ defaultNavigationOptions :{ header : <Header/> }})
这样做你可以对所有屏幕使用一个全局 header,但如前所述,要根据屏幕更改 header 上的某些内容,你必须自己更改它,使 header 知道用户当前所在的位置。
我就是这样实现的。
像这样创建一个 CustomHeader 组件:
const MyHeader = (navigation) => {
return {
header: props => <MyCustomHeader {...props} />,
headerStyle: { backgroundColor: '#fff' },
headerTintColor: '#000',
};
}
然后将其包含在堆栈导航器的defaultNavigationOptions
中
const AppNavigator = createStackNavigator(
{
Launch: {
screen: LaunchComponent,
}
},
{
initialRouteName: "Launch",
defaultNavigationOptions: ({ navigation }) => {
return MyHeader(navigation)
}
}
)
我想为 DrawerNavigator 实现类似的解决方案。唯一的方法是创建 HOC 组件。
import React, {Fragment} from 'react';
const NavHeader = props => {
// ... NavHeader code goes here
};
export const withHeader = Component => {
return props => {
return (
<Fragment>
<NavHeader {...props} />
<Component {...props} />
</Fragment>
);
};
};
然后在你的抽屉里做:
<Drawer.Navigator>
<Drawer.Screen
name={ROUTES.DASHBOARD}
component={withHeader(DashboardContainer)} // <--- Wrap it around component here.
/>
</Drawer.Navigator>
所以,我正在尝试使用 React Navigation,并且我想在所有屏幕上使用相同的 Header 组件。
我使用了expo-cli
来创建项目。
在我的 MainTabNavigator.js
文件中,我有一个 HomeStack
和 SettingsStack
,它们看起来像这样:
const config = Platform.select({
web: { headerMode: "screen" },
default: {}
});
const HomeStack = createStackNavigator(
{
Home: HomeScreen
},
config
);
HomeStack.navigationOptions = {
tabBarIcon: ({ focused }) => (
<NavButton
focused={focused}
name={focused ? "star" : "create"}
label={focused ? "Save" : "New"}
/>
)
};
HomeStack.path = "";
在文件的底部,我有我的 tabNavigator
const tabNavigator = createBottomTabNavigator(
{
HomeStack,
SettingsStack
},
{
tabBarOptions: {
inactiveTintColor: "#fff",
labelStyle: {
fontSize: 14
},
showLabel: false,
style: {
backgroundColor: "#fff",
borderTopColor: "#fff",
height: 70,
paddingBottom: 10,
paddingTop: 10
}
}
}
);
tabNavigator.path = "";
export default tabNavigator;
我尝试在 createBottomTabNavigator
函数的 tabBarOptions
上方的 navigatorOptions
和 defaultNavigationOption
中添加一个 <Header />
组件。
与此类似:
...
{
navigationOptions: {
header: <Header />
},
tabBarOptions: {
inactiveTintColor: "#fff",
labelStyle: {
fontSize: 14
},
...
但这只是让我一片空白 header...没有使用我的组件。
我目前拥有我想要的功能,但我必须进入每个 Screen
文件并添加:
HomeScreen.navigationOptions = {
header: <Header />
};
目前正在使用 "react-navigation": "^3.11.0"
感谢任何帮助!
在每个屏幕中将 header
设置为 null
并在每个屏幕上加载您的组件
class HomeScreen extends Component {
static navigationOptions = {
header: null,
};
render(){
return(
<View style={{flex:1}}>
<Header />
</View>
)
}
}
因此,react-navigation
的默认 header
将是 null
,您可以将自定义组件加载为 header
或
class HomeScreen extends React.Component {
static navigationOptions = {
// headerTitle instead of title
headerTitle: <Header />,
};
/* render function, etc */
}
使用 headerTitle
而不是 title
加载自定义组件
将您的 StackNavigator 设置为 BottomTabNavigator 的 parent,这样您就可以为所有 bottomTab 设置一个 header。
如果您使用这种方法,并且出于某种原因需要在 header 上添加 backButton
,您必须自己手动更改它。
const bottomTabNavigator = createBottomTabNavigator(bottomRoutesConfig, bottomNavigatorConfigs)
createStackNavigator:({ tabNavigator : bottomTabNavigator },{ defaultNavigationOptions :{ header : <Header/> }})
这样做你可以对所有屏幕使用一个全局 header,但如前所述,要根据屏幕更改 header 上的某些内容,你必须自己更改它,使 header 知道用户当前所在的位置。
我就是这样实现的。 像这样创建一个 CustomHeader 组件:
const MyHeader = (navigation) => {
return {
header: props => <MyCustomHeader {...props} />,
headerStyle: { backgroundColor: '#fff' },
headerTintColor: '#000',
};
}
然后将其包含在堆栈导航器的defaultNavigationOptions
中
const AppNavigator = createStackNavigator(
{
Launch: {
screen: LaunchComponent,
}
},
{
initialRouteName: "Launch",
defaultNavigationOptions: ({ navigation }) => {
return MyHeader(navigation)
}
}
)
我想为 DrawerNavigator 实现类似的解决方案。唯一的方法是创建 HOC 组件。
import React, {Fragment} from 'react';
const NavHeader = props => {
// ... NavHeader code goes here
};
export const withHeader = Component => {
return props => {
return (
<Fragment>
<NavHeader {...props} />
<Component {...props} />
</Fragment>
);
};
};
然后在你的抽屉里做:
<Drawer.Navigator>
<Drawer.Screen
name={ROUTES.DASHBOARD}
component={withHeader(DashboardContainer)} // <--- Wrap it around component here.
/>
</Drawer.Navigator>