React Navigation5.x第五章配置导航头

我们已经演示过如何设置导航头的标题,现在我们一起来探讨一下导航头的其他设置。

设置导航头的标题

Screen组件都有一个options属性,这个属性可能是一个js对象或者是一个返回js对象的方法。这个属性包含了很多可配置的选项。而其中的title就是最常用的之一。

function StackScreen() {
  return (
    <Stack.Navigator>
      <Stack.Screen
        name="Home"
        component={HomeScreen}
        options={{ title: 'My home' }}
      />
    </Stack.Navigator>
  );
}

在title中使用参数

为了在title中使用参数,我们需要把options属性定义为一个返回配置对象的方法。很多人尝试使用this.props来替代options。这个是错误的,因为这个定义是在组件被渲染之前,所以不能用this来指代当前组件。如果我们将options定义为一个方法,React Navigation就可以调用它并为其传入两个可供使用的参数{navigation,route}。在本章中我们重点关注这个route。这个route与你传入到路由页面route属性是同一个对象。这样,通过再次访问其route.params,我们就可以得到其中的参数了。

function StackScreen() {
  return (
    <Stack.Navigator>
      <Stack.Screen
        name="Home"
        component={HomeScreen}
        options={{ title: 'My home' }}
      />
      <Stack.Screen
        name="Profile"
        component={ProfileScreen}
        options={({ route }) => ({ title: route.params.name })}
      />
    </Stack.Navigator>
  );
}

传递到options方法中的形参是一个对象,该对象有两个属性

  • navigation  --  就是路由屏幕组件的navigation属性
  • route   --   屏幕组件的route属性

上面的例子我们只用到了route属性,但是在其他的场景中你可以根据需要使用navigation属性。

使用setOptions更新options

有一个很常见的需求就是我们要在一个已加载的屏幕组件上更新它的options配置。对于这样的需求我们可以使用navigation.setOptions来实现。

/* Inside of render() of React class */
<Button
  title="Update the title"
  onPress={() => navigation.setOptions({ title: 'Updated!' })}
/>

设置导航头的样式

关于自定义导航头的样式,有三个关键的属性需要知道 headerStyle,headerTintColor,和headerTitleStyle

headerStyle:这个样式对象可以设置包裹住导航头的view的样式。如果你为其设置了背景色,那么导航头的背景色就是你设置的颜色

headerTintColor:回退按钮和title都是使用这个属性来设置他们的颜色。在下面的例子中,我们设置tint colot为白色,所以回退按钮和title就显示的是白色。

headerTitleStyle:如果我们向自定义字体,字体粗细和其他文本样式,我们就可以设置这个属性。

function StackScreen() {
  return (
    <Stack.Navigator>
      <Stack.Screen
        name="Home"
        component={HomeScreen}
        options={{
          title: 'My home',
          headerStyle: {
            backgroundColor: '#f4511e',
          },
          headerTintColor: '#fff',
          headerTitleStyle: {
            fontWeight: 'bold',
          },
        }}
      />
    </Stack.Navigator>
  );
}

这里有几点需要注意:

在IOS上,状态栏文本和图标是黑色的,所以你将背景色设置为暗色的话可能看起来不是很好。我们不在这里探讨这个问题,但是你应该知道配置状态栏的背景色以便于跟你的导航头的颜色不冲突。

以上的设置仅仅只在home页面有效,当我们跳转到details页面的时候,依然会显示默认的颜色。接下来我们就探讨如何将iptions的设置共享给其他的屏幕组件。

与其他屏幕组件共享options

通常我们会用同样的方式来设置多个页面的导航头。比如,你的公司的主题色是红色,你想让导航头的背景色为橘红色,前景色为白色。就像上面那张图中所示的一样,你会注意到当你跳转到DetailsScreen页面的时候,导航头的颜色又变成了默认的。当然我们也可以将HomeScreen页面的options同样设置到DetailsScreen页面上来实现这个,这样实现是很糟糕的。幸运的是我们没必要这么做,我们可以使用堆栈导航器的screenOptions属性。

function StackScreen() {
  return (
    <Stack.Navigator
      screenOptions={{
        headerStyle: {
          backgroundColor: '#f4511e',
        },
        headerTintColor: '#fff',
        headerTitleStyle: {
          fontWeight: 'bold',
        },
      }}
    >
      <Stack.Screen
        name="Home"
        component={HomeScreen}
        options={{ title: 'My home' }}
      />
    </Stack.Navigator>
  );
}

在上面的例子中,任何属于StackScreen的页面都将会有相同样式的导航头了。

使用自定义的组件来替换title

有的时候你想对title做更多的设置,比如,你想在原title所在的位置渲染一张图片,或者将title放进一个按钮中,在这些场景中你完全可以使用自定义的组件来覆盖title。

function LogoTitle() {
  return (
    <Image
      style={{ width: 50, height: 50 }}
      source={require('@expo/snack-static/react-native-logo.png')}
    />
  );
}

function StackScreen() {
  return (
    <Stack.Navigator>
      <Stack.Screen
        name="Home"
        component={HomeScreen}
        options={{ headerTitle: props => <LogoTitle {...props} /> }}
      />
    </Stack.Navigator>
  );
}

你可能想要问为什么使用 headerTitle 这个组件来替代title。原因就是headerTitle其实是堆栈导航器的一个属性,默认情况下headerTtile是一个text组件,所以显示的就是title文本内容。

其他的一些配置

你可以查看页面的可用options列表来了解更多的配置选项。

总结

  • 阅读相关API的配置选项,通过设置这些options你可以自定义你的页面组件中的导航头。
  • options属性可以是一个对象或方法。当他是一个方法的时候他需要返回一个由navigation和route属性的对象。
  • 你可以通过设置screenOptions来为堆栈导航器设置相同的导航头,其优先级高于单独配置。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值