React Navigation 5.x 第六章 导航头的按钮

本文讲解了如何在React中自定义导航栏样式,并通过代码示例演示了如何响应触摸事件,包括添加按钮、与屏幕组件交互及重写返回按钮。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在我们知道了如何自定义我们导航头的样式,现在我们来让他能够响应我们的触摸事件。

在导航头上添加一个按钮

通常我们与导航头交互的方法就是点击位于标题左侧或者右侧的按钮。现在我们在导航头的右边添加一个按钮(这个地方也是你屏幕中最难触摸到的地方了)。

function StackScreen() {
  return (
    <Stack.Navigator>
      <Stack.Screen
        name="Home"
        component={HomeScreen}
        options={{
          headerTitle: props => <LogoTitle {...props} />,
          headerRight: () => (
            <Button
              onPress={() => alert('This is a button!')}
              title="Info"
              color="#fff"
            />
          ),
        }}
      />
    </Stack.Navigator>
  );
}

 当我们用这种方式定义好按钮之后,这个this变量并不是指代HomeScreen实例。所以你不能通过this调用HomeScreen实例的setState和其他实例方法。那么接下来我们如何让按钮与screen组件互动呢?

导航头与屏幕组件的交互

我们需要使用navigation.setOptions来实现按钮与屏幕组件的交互。通过navigation.setOptions我们可以访问screen组件的属性,state,以及context等等

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

function HomeScreen({ navigation }) {
  const [count, setCount] = React.useState(0);

  React.useLayoutEffect(() => {
    navigation.setOptions({
      headerRight: () => (
        <Button onPress={() => setCount(c => c + 1)} title="Update count" />
      ),
    });
  }, [navigation, setCount]);

  return <Text>Count: {count}</Text>;
}

自定义返回按钮

createStackNavigator提供了平台默认的返回按钮。在IOS平台上,在按钮的旁边会有一个标签,这个标签会显示上一页标题的缩写,否则就是一个Back字样。

你可以通过设置headerBackTitle和headerTruncatedBackTitle来改变标签的行为。详细内容参见

想要定义返回按钮图标你可以使用headerBackImage

重写返回按钮

在堆栈导航器中,无论用户是否从当前页面返回到上一页,返回按钮都会被自动渲染,也就是说,无论何时,堆栈导航器所有页面的返回按钮都会被渲染。

通常情况下上面的已经可以满足你的需求,但是在有些情况下,你可能并不想通过配置iptions来设置返回按钮而是想重写一个返回按钮。这时候,你就要为headerLeft设置为React Element。headerRight也是一样。或者,headerLeft也可以接收一个React组件,比如,为了重写返回按钮的onPress行为。更详细的介绍请阅读相关API

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值