React NativeのTextコンポーネントは、画面上にテキストを表示する唯一の方法であり、ウェブのように異なるタグ(p, span, h1-h6)が使われるのとは異なります。Textはカスケードスタイルの継承、タッチイベント処理、自動改行のためのネスティングをサポートしています。React Native Docs(2024年)によると、TextはViewに次いで2番目に頻繁に使用されるコンポーネントです。このコンポーネントはiOSではネイティブのUILabel、AndroidではTextViewとしてレンダリングされ、フォントとアクセシビリティの正確な動作を保証します。
重要なポイント
Textはテキストコンテンツを表示するためのReact Nativeコンポーネントです。ウェブ開発にはテキスト用の多くのセマンティックタグが存在しますが、React Nativeではすべてのテキスト要素がTextを通じて作成されます。このコンポーネントは単純なテキストだけでなく、ネストされたTextやスタイル化された断片を含む複雑な構造も表示できます。
Textは自動的に改行を処理し、フォントファミリー、サイズ、色、配置を管理します。このコンポーネントはタッチイベント(onPress)をサポートしており、追加のラッパーなしでクリック可能なリンクを作成できます。重要な制限事項:TextはView内に直接ネストすることはできません — 他のTextコンポーネント内、または直接の子としてのみ配置できます。
React Native Nested Text(2024年)によると、ネストされたTextコンポーネントは親からスタイルを継承します。これにより、最上位でベーススタイルを設定し、特定の断片に対して個別のプロパティを上書きできます — ウェブでspanがCSSと連携するのと同様です。
Textコンポーネントは、表示、動作、アクセシビリティを制御するためのプロパティセットを提供します。主なカテゴリ:スタイルプロパティ(フォント、サイズ、色、配置)、表示プロパティ(numberOfLines、lineBreakMode)、インタラクティブプロパティ(onPress、onLongPress)。
numberOfLinesは表示行数を制限し、末尾に省略記号を追加します。ellipsizeModeは省略記号の位置を制御します(head、middle、tail、clip)。adjustsFontSizeToFitは設定された枠内にテキストを収めるためにフォントサイズを自動的に縮小します。lineBreakModeはnumberOfLinesを超えたテキストの切り詰め方法を決定します。
Textはタッチ処理のためにonPressとonLongPressをサポートしています。これにより、TouchableOpacityを使用せずにテキストリンクを作成できます。onTextLayoutはレンダリング後のテキストレイアウト情報を返します — アニメーションや位置決めに便利です。
iOSでは、disabled(テキスト無効化)、selectable(選択有効化)、dataDetectorTypes(リンク、電話番号、住所の自動検出)が利用できます。Androidでは、selectable(textSelectable経由)とincludeFontPadding(余分なパディングを削除)が利用できます。
Textは見た目がHTMLタグのpやspanに似ていますが、アーキテクチャ上の違いは重要です。React Nativeにはセマンティックなテキスト要素を持つDOMモデルがなく、すべてのテキストノードは様々なプロパティを持つ単一のTextコンポーネントで処理されます。
| 特性 | Text(React Native) | p / span(HTML) |
|---|---|---|
| ネスティング | Text内のText — スタイル継承 | pはpを含めない。spanはpの内部 |
| デフォルトマージン | デフォルトマージンなし | pにはmargin-block-start/endあり |
| 改行 | コンテナ内で自動 | p — ブロック、span — インライン |
| onPress処理 | 組み込みサポート | 追加のラッパーが必要 |
| スタイル継承 | はい、親Textから | はい、CSSカスケード |
主な違いは、Textのネスティングによるスタイル継承です。外側のTextがfontSize: 18とcolor: blueを持つ場合、ネストされたすべてのTextコンポーネントがこれらのスタイルを継承します。任意のプロパティは、内部のTextで特定の値を設定して上書きできます。これによりコードが節約され、構造がよりクリーンになります。
TextはタイポグラフィのためのほとんどのCSSプロパティをサポートしています:fontFamily、fontSize、fontWeight、fontStyle、color、letterSpacing、lineHeight、textAlign、textDecorationLine、textTransform。React Nativeでは、フォントは@font-faceではなくプラットフォームレベルで接続されます。
カスタムフォントを使用するには、assets/fontsフォルダに追加し、react-native.config.jsで指定する必要があります。アプリケーションの再ビルド後、fontFamilyを通じてフォントが利用可能になります。React Nativeはウェブフォント(Google Fonts)を直接サポートしておらず、.ttfまたは.otfファイルのダウンロードが必要です。
Textの継承メカニズムはCSSとは異なります。スタイルはTextからネストされたTextにのみ渡され、ViewからTextには渡されません。アプリケーション全体にフォントを設定するには、TextコンポーネントのdefaultPropsまたはカスタムラッパーコンポーネントを使用します。
<Text style={{ fontSize: 18, color: '#333' }}>
This text is 18px and color #333
<Text style={{ fontWeight: 'bold', color: '#007AFF' }}>
bold and blue
</Text>
back to #333 color
</Text>
この例では、外側のTextがfontSize: 18とcolor: #333を設定しています。内側のTextはfontSize(18)を継承しますが、fontWeightをboldに、colorを#007AFFに上書きします。外側のTextは自身のスタイルのみを継承します。これはHTMLでネストされたspanが動作するのと正確に類似しています。
React NativeにおけるTextの2つの典型的な使用例を見てみましょう:ネスティングを使ったテキストの書式設定と、行数制限付きのクリック可能なコンポーネントの作成です。
この例では、Textを使用してハイライトされた要素(タイトル、日付、リンク付きコンテンツ)を含む複数行テキストを表示しています。
const NewsCard = ({ title, date, content }) => (
<View style={styles.card}>
<Text style={styles.title}>{title}</Text>
<Text style={styles.date}>{date}</Text>
<Text style={styles.content}>
{content}
{' ' }
<Text
style={styles.link}
onPress={() => Linking.openURL(url)}
>
Read more
</Text>
</Text>
</View>
);
この構造には3つの独立したTextコンポーネント(タイトル、日付、コンテンツ)があり、それぞれ独自のスタイルを持っています。コンテンツTextの中には、リンク用のonPressを持つ別のTextがネストされています。このパターンはニュースフィード、ブログ、コメントで使用されます。
省略記号付きのテキストプレビューを表示するには、numberOfLinesを使用します。これは商品カードや記事リストの標準的なパターンです。
<Text
numberOfLines={2}
ellipsizeMode="tail"
style={styles.preview}
>
{longDescription}
</Text>
numberOfLines = 2プロパティはテキストを2行に制限します。テキストが長い場合、React Nativeは自動的に2行目の末尾に省略記号を追加します。ellipsizeMode: 'tail'パラメータは省略記号が末尾にあるべきことを指定します(head、middle、clipも利用可能です)。
よくある質問
React Nativeはクロスプラットフォーム互換性のために最小限のコンポーネントセットを使用しています。複数のセマンティックHTMLタグの代わりに、様々なスタイルを持つ単一のTextが使用されます。これにより、単一のコードベースから両方のプラットフォームでのレンダリングが簡素化されます。
はい、Textはタッチ処理のためにonPressとonLongPressをサポートしています。ただし、視覚的なフィードバック(押下ハイライト)付きのボタンには、Text内でTouchableOpacityまたはPressableを使用することをお勧めします。Text.onPressはデフォルトでは視覚的な押下表示を提供しません。
Textはコンテナ内の長い行のみを自動的に折り返します。テキストが折り返されない場合は、親Viewに幅の制限があるか、スタイルにnowrapが設定されていないか、numberOfLinesが利用可能な行数を超えていないかを確認してください。
fontWeight: 'bold'を指定したネストされたTextを使用するか、テキストをこのスタイルのコンポーネントでラップします。より太い表示にはfontWeight: '700'または'800'を使用することもできます。太さはデバイス上の対応するフォントファミリーの利用可能性に依存します。
いいえ、Textは他のTextコンポーネントまたは文字列のみを含めることができます。ImageはTextの子になることはできません。アイコン付きのテキストを表示するには、TextとImageを兄弟要素として持つViewを使用するか、インライン画像サポートのあるコンポーネントを使用します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。