RootTag
RootTag
は、React Nativeサーフェスのネイティブのルートビューに割り当てられる不透明な識別子です。つまり、Androidの場合はReactRootView
インスタンス、iOSの場合はRCTRootView
インスタンスです。要するに、サーフェス識別子です。
RootTagをいつ使うか?
ほとんどのReact Native開発者にとって、RootTag
を扱う必要はないでしょう。
RootTag
は、アプリが複数のReact Nativeルートビューをレンダリングし、サーフェスに応じてネイティブAPI呼び出しを異なる方法で処理する必要がある場合に役立ちます。その一例として、アプリがネイティブナビゲーションを使用しており、各画面が別々のReact Nativeルートビューである場合が挙げられます。
ネイティブナビゲーションでは、すべてのReact Nativeルートビューはプラットフォームのナビゲーションビュー(例:AndroidのActivity
、iOSのUINavigationViewController
)でレンダリングされます。これにより、ネイティブのルックアンドフィールやナビゲーション遷移など、プラットフォームのナビゲーションパラダイムを活用することができます。ネイティブナビゲーションAPIと対話する機能は、ネイティブモジュールを介してReact Nativeに公開できます。
たとえば、画面のタイトルバーを更新するには、ナビゲーションモジュールのAPI setTitle("Updated Title")
を呼び出しますが、スタック内のどの画面を更新するかを知る必要があります。ここで、ルートビューとそのホスティングコンテナを識別するためにRootTag
が必要になります。
RootTag
のもう1つのユースケースは、アプリが特定のJavaScript呼び出しを、その呼び出し元のルートビューに基づいてネイティブに関連付ける必要がある場合です。異なるサーフェスからの呼び出しのソースを区別するためにRootTag
が必要になります。
RootTagへのアクセス方法(必要な場合)
バージョン0.65以前では、RootTagはレガシーコンテキストを介してアクセスされていました。React NativeをReact 18以降で登場するConcurrent機能に対応させるため、0.66ではRootTagContext
を介して最新のContext APIに移行しています。バージョン0.65では、開発者が呼び出し箇所を移行する時間を持てるように、レガシーコンテキストと推奨されるRootTagContext
の両方をサポートしています。破壊的変更の概要を参照してください。
RootTagContext
を介してRootTag
にアクセスする方法。
import {RootTagContext} from 'react-native';
import NativeAnalytics from 'native-analytics';
import NativeNavigation from 'native-navigation';
function ScreenA() {
const rootTag = useContext(RootTagContext);
const updateTitle = title => {
NativeNavigation.setTitle(rootTag, title);
};
const handleOneEvent = () => {
NativeAnalytics.logEvent(rootTag, 'one_event');
};
// ...
}
class ScreenB extends React.Component {
static contextType: typeof RootTagContext = RootTagContext;
updateTitle(title) {
NativeNavigation.setTitle(this.context, title);
}
handleOneEvent() {
NativeAnalytics.logEvent(this.context, 'one_event');
}
// ...
}
クラスおよびフックのためのContext APIに関する詳細は、Reactのドキュメントで学んでください。
0.65での破壊的変更
RootTagContext
は以前はunstable_RootTagContext
という名前でしたが、0.65でRootTagContext
に変更されました。コードベース内のunstable_RootTagContext
の使用箇所を更新してください。
0.66での破壊的変更
RootTag
へのレガシーコンテキストアクセスは削除され、RootTagContext
に置き換えられます。0.65以降、開発者はRootTag
へのアクセスを積極的にRootTagContext
に移行することをお勧めします。
今後の計画
新しいReact Nativeアーキテクチャの進展に伴い、RootTag
にも将来的なイテレーションが行われます。その意図は、RootTag
の型を不透明に保ち、React Nativeのコードベースでのスラッシングを防ぐことです。現在RootTagが数値のエイリアスであるという事実に依存しないでください!もしあなたのアプリがRootTagに依存している場合は、こちらにあるバージョンの変更ログに注意を払ってください。