0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ReactNativeでアプリ内のWebViewを表示する時に、ヘッダータイトルを動的に変更する方法

Last updated at Posted at 2021-10-29

アプリ内でWebViewを表示する時、WebView内で画面遷移してもも動的にヘッダータイトルを変更したい

header.png

アプリを実装していく中で、ほぼ間違いなくStackNavigationを使って画面遷移の制御をすると思います。
アプリで表示するところは画面ごとにタイトルを決めれますが、webViewは一つタイトルを決めて、そこからwebView内で画面遷移しても同じタイトルが使われてしまいます。
webViewを使うときはタイトルを表示しないという選択肢もありますが、タイトルを動的に変更する方法を見つけたので共有します。

ライブラリをインストール

react-native-webview
cd ios && pod install

実装

WebViewのonNavigationStateChangeというメソッドを使ってWebViewのタイトルタグを取得します。

import React from 'react';
import {WebView} from 'react-native-webview';
import { SafeAreaView } from 'react-native';

export const WebViewTitle = () => {
    const onChangeState = (e) => {
        console.log(e);
      };
  return (
    <SafeAreaView style={{flex:1}}>
      <WebView
        source={{uri: 'https://reactnative.dev/'}}
        onNavigationStateChange={e => onChangeState(e)}
      />
    </SafeAreaView>
  );
};

するとWebView内で画面遷移するたびにonNavigationStateChangeが発火し、コンソールに情報が表示されます。

実際のlog↓
{"canGoBack": true, "canGoForward": false, "loading": false, "navigationType": "other", "target": 4383, "title": "React Native · Learn once, write anywhere", "url": "https://reactnative.dev/docs/getting-started"}

ここからタイトルタグを取得し、それをアプリ内で管理すればいいだけです。

ただ、画面のタイトルを制御するファイル(StackNavigation.js)とWebViewを表示するファイル(実際にwebViewを呼び出しているところ)は別々のディレクトリであり、階層的にwebViewの方が子要素になると思います。
ですのでpropsで渡すことは不可能なので、
1、Reduxを使って管理
2、useContextを使って管理
のどちらかを使う必要があります。

またwebViewのタイトルタグが英語だったり、違う表現をしている可能性もありますので、webViewを作るエンジニアと相談する必要があります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?