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に公開できます。
たとえば、画面のタイトルバーを更新するには、ナビゲーションモジュールのAPIsetTitle("Updated Title")
を呼び出しますが、スタック内のどの画面を更新する必要があるかを知る必要があります。ここで、ルートビューとそのホスティングコンテナを識別するためにRootTag
が必要です。
RootTag
のもう1つのユースケースは、アプリが特定のJavaScript呼び出しを、それが発信されたルートビューに基づいてネイティブに属性化する必要がある場合です。異なるサーフェスの呼び出し元を区別するために、RootTag
が必要です。
RootTagへのアクセス方法(必要な場合)
バージョン0.65以前では、RootTagはレガシーコンテキストを介してアクセスされます。React 18以降で導入されるConcurrent機能に向けてReact Nativeを準備するために、0.66では最新のContext APIであるRootTagContext
に移行しています。バージョン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');
}
// ...
}
Reactドキュメントから、クラスとフックのContext APIの詳細を学ぶことができます。
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に依存している場合は、こちらにあるバージョン変更ログを監視してください。