【React Native】React Navigationでコンポーネント内でヘッダーにボタンを追加する

ちょっと躓いたので備忘録としてまとめ。
React Navigation で、ヘッダーにボタンを追加する方法についてです。

まず、React Navigation の公式サイトに掲載されているサンプルコードはこちら。

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>
  );
}

これでもボタンは追加できるのですが、問題はボタンをクリックした時に実行する処理の指定方法についてです。
たとえば、ヘッダーのボタンをタップした時にデータを保存する処理を行わせたい時、その処理はコンポーネントに記述していたのでそれを呼び出したかったのですが…上記の方法ではそれをどこに書くべきかが分かりませんでした。

 

で、それを実現する方法について、参考にさせていただいた記事はこちら。

React Navigation で、StackNavigator のイベントを現在の Screen 上でハンドルする – Qiita
https://qiita.com/acro5piano/items/616650ad431229dc6097

正に私がやりたいことがそのまま紹介されていました…!

実際に記述した処理はこちら。

componentDidMount() {
  this.props.navigation.setOptions({
    headerRight: () => (
      <TouchableOpacity onPress={() => this.props.navigation.push('edit')}>
        <FontAwesome5 name="pen" size={18} color="#F08300" />
      </TouchableOpacity>
    ),
  });
}

コンポーネントの componentDidMount() でヘッダー右に表示するボタンと、そのボタンをタップした時の処理を指定しています。
今回は、ボタンタップ時の処理にページ遷移する処理を指定しましたが、データの保存だったり、ダイアログを表示させたりだったり、他の処理を指定することも可能です。

また、今回はヘッダー右のボタンの追加を行いましたが、ヘッダータイトルを変更したり、ヘッダー左にボタンを追加したりすることもできます。
なお、ヘッダーを変更したい場合は下記のように記述します。

this.props.navigation.setOptions({
  title: 'ヘッダータイトル'
});

やり方としては以上です。
私はちょっと古い書き方をしているので、サンプルコードを読み解くのに少し苦労してしまいましたが、何とか実装できてよかったです。

 

以上、React Navigation で、コンポーネント内でヘッダーにボタンを追加する方法についてでした。
ご参考になれば幸いです。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG