Компонент Text у React Native — єдиний спосіб відображення тексту на екрані, на відміну від вебу, де використовуються різні теги (p, span, h1-h6). Text підтримує вкладеність для каскадного успадкування стилів, обробку подій дотику та автоматичний перенос рядків. За даними React Native Docs, 2024, Text є другим за частотою використання компонентом після View. Компонент рендериться в нативний UILabel на iOS та TextView на Android, забезпечуючи коректну роботу шрифтів і доступності.
Головне
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 |
| margin за замовчуванням | Немає відступів за замовчуванням | 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. Якщо потрібно задати шрифт для всього застосунку, використовується defaultProps компонента Text або кастомний компонент-обгортка.
<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 успадковує тільки свої стилі. Це точна аналогія роботи вкладених span у HTML.
Розглянемо два типові сценарії використання Text у React Native: форматування тексту з вкладеністю та створення клікабельного компонента з обмеженням рядків.
У цьому прикладі 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>
);
У цій структурі три незалежних Text-компоненти (заголовок, дата, контент), кожен зі своїм стилем. Усередині Text з контентом вкладено ще один Text з onPress для посилання. Такий патерн використовується для новинних стрічок, блогів і коментарів.
Для відображення прев'ю тексту з трикрапкою використовується numberOfLines. Це стандартний патерн для карток товарів і статей у списках.
<Text
numberOfLines={2}
ellipsizeMode="tail"
style={styles.preview}
>
{longDescription}
</Text>
Властивість numberOfLines = 2 обмежує текст двома рядками. Якщо текст довший, React Native автоматично додає три крапки в кінці другого рядка. Параметр ellipsizeMode: 'tail' вказує, що трикрапка має бути в кінці (доступні також head, middle, clip).
Часті запитання
React Native використовує мінімалістичний набір компонентів для крос-платформенної сумісності. Замість безлічі семантичних HTML-тегів застосовується один Text з різними стилями. Це спрощує рендеринг на обох платформах з однієї кодової бази.
Так, Text підтримує onPress і onLongPress для обробки дотиків. Однак для кнопок з візуальним зворотним зв'язком (підсвітка натискання) краще використовувати TouchableOpacity або Pressable з Text всередині. Text.onPress не надає візуальної індикації натискання за замовчуванням.
Text автоматично переносить тільки довгі рядки всередині свого контейнера. Якщо текст не переноситься, перевірте: чи є обмеження ширини у батьківського View, чи не задано nowrap у стилях, і чи не перевищує numberOfLines доступну кількість рядків.
Використовуйте вкладений Text з fontWeight: 'bold' або обгорніть текст у компонент із цим стилем. Також можна застосувати fontWeight: '700' або '800' для більш жирного накреслення. Товщина залежить від доступності відповідної гарнітури шрифту на пристрої.
Ні, Text може містити тільки інші Text-компоненти або рядки. Image не може бути нащадком Text. Для відображення тексту з іконками використовуйте View з Text та Image як сусідні елементи або компонент із підтримкою вбудовування зображень.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.