メインコンテンツへスキップ

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にアクセスする方法。

js
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に依存している場合は、こちらにあるバージョンの変更ログに注意を払ってください。