搜索
您的当前位置:首页正文

react-navigation在开发中的使用介绍

2020-11-27 来源:爱go旅游网

这篇文章给大家分享的内容是关于react-navigation在开发中的使用介绍,有一定的参考价值,有需要的朋友可以参考一下。

日常废话

react-navigation是一个来源于react社区的导航解决方案。 以我一个月资深的react开发经验来看,说是react-native开发app必备库之一毫不过分。

在开发过程中,不同页面因为不同的业务需求会有不同的头部(header),这篇文章针对几种常用我遇到过的各种header提供对应的react-navigation解决方案。

我是正文

底部tab对app来说是十分常见的需求。react-navigation也提供了相应的API来创建底部tab: createBottomTabNavigator

如何定制tab页的header呢? 我们分情况讨论:

所有tab页都要header

很简单,无需额外的配置。

所有tab页都不要header

第一时间可能会想到的是在createBottomTabNavigator中对每个页面的navigationOptions对象设置header为null。

createBottomTabNavigator(
 {
 Home: {
 screen: Home,
 navigationOptions: {
 header: null // 无效!!
 }
 }
 }
)

但实际上createBottomTabNavigator中的navigationOptions对象是不接受header参数的,至少文档中没写。官方文档

解决方式:在根级导航中设置。

const AppNavigator = createStackNavigator(
 {
 Main: {
 screen: TabNavigator, // TabNavigator就是通过createBottomTabNavigator创建的底部导航
 navigationOptions: {
 header: null
 }
 }
 // other pages
 }
)

只有某个tab要header

其实navigator是可以互相嵌套的。 就像上面的例子中,Main路由的页面是createBottomTabNavigator创建的底部导航。同理,底部导航中某个tab的页面也可以是导航页。有点绕,还是看代码

const bottomTabNavigator = createBottomTabNavigator(
 {
 Home: {
 screen: Home,
 navigationOptions: {
 // some options
 }
 },
 User: { // user页要"头"~
 screen: createStackNavigator(
 User: {
 screen: User,
 navigationOptions: {
 header: customHeader
 }
 }
 )
 }
 }
)

const appNavigator = createStackNavigator(
 {
 Main: {
 screen: bottomTabNavigator,
 navigationOptions: {
 header: null // 这里要将bottomTabNavigator的header设为null
 }
 },
 Other: {
 screen: Other
 }
 }
)

因为默认情况下bottomTabNavigator会有一个自己的header,而user我们又创建了一个带header的路由页面,所以我们将Main路由(bottomTabNavigato)的header设为null,如果不设置的,页面会有2个header哦,小伙伴可自行尝试。

某tab页不要header or 需要定制header

如果我只有某个tab页不要header,咋办?
还是从navigationOptions入手,navigationPptions属性可以是一个接受navigation对象,返回一个新对象的函数。

关于navigation对象,可以看官方文档

这里我们用到了该对象的state属性。

现在我们有如下导航配置:

const TabNavigator = createBottomTabNavigator(
 {
 Home: {
 screen: Home,
 navigationOptions: {
 title: '首页'
 }
 },
 Phone: {
 screen: createStackNavigator(
 {
 Phone: {
 screen: Phone,
 navigationOptions: ({ navigation }) => (
 { // phoneHeader为自定义React组件
 header: <PhoneHeader navigation={navigation}/>
 }
 )
 }
 }
 ),
 navigationOptions: {
 tabBarVisible: false,
 title: '机型'
 }
 },
 User: {
 screen: User,
 navigationOptions: {
 title: '我的'
 }
 }
 }
)

上面代码创建了包含3个tab的底部导航,其中phone的header是定制的。接下去我们要做的是配置在appNavigator中配置TabNavigatornavigation属性,根据不同的路由使用不同的header(即当处在home页或是user页时候,使用默认的header,当处在phone页面时,移除header

为什么是移除header?

因为phone页面已经自定义了header,我们只需移除外层TabNavigator的header即可。如果不然,会有2个header(TabNavigator和phone2个header)。这个上面已经提到。另外,也可以将定制的header配置在appNavigatorTabNavigatornavigation属性里。(未验证,可自行尝试。)

const AppNavigator = createStackNavigator(
 {
 Main: {
 screen: TabNavigator,
 navigationOptions: ({ navigation }) => {
 const titleMap = {
 Home: '首页',
 User: '我的'
 }
 // 根据路由的顺序以及路由名定义title
 const result = {
 title: titleMap[navigation.state.routes[navigation.state.index].routeName],
 headerTitleStyle: {
 fontWeight: '600',
 color: color.gray_1,
 fontSize: px2p(18)
 },
 headerBackTitle: null
 }
 // 在配置TabNavigator时,phone页面是第一个定义的(zero-indexed)。
 // 所以当index为1的时,header设为null
 // 或者将header设为自定义header,对应修改TabNavigator中phone。
 if (navigation.state.index === 1) { 
 result.header = null
 result.headerTransparent = true
 }
 return result
 }
 },
 ...pages // 其他页面
 },
 {
 initialRouteName: 'Main'
 }
)

相关推荐:

对React事件系统的解析

Top