Компонентът 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 предоставя набор от props за управление на показването, поведението и достъпността. Ключови категории: стилови props (шрифт, размер, цвят, подравняване), props за показване (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 с различни props.
| Характеристика | 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също