Текст
Компонент React для отображения текста.
Text поддерживает вложенность, стилирование и обработку касаний.
В следующем примере, вложенный заголовок и текст тела будут унаследовать fontFamily от styles.baseText, но заголовок предоставляет собственные дополнительные стили. Заголовок и тело будут расположены друг над другом из-за явных переводов строк:
- Компонент функциональный
- Компонент класса
Вложенный текст
Как Android, так и iOS позволяют отображать форматированный текст, аннотируя диапазоны строки определенным форматированием, например, жирным шрифтом или цветным текстом (NSAttributedString в iOS, SpannableString в Android). На практике это очень утомительно. Для React Native мы решили использовать веб-парадигму, где вы можете вкладывать текст для достижения того же эффекта.
За кулисами React Native преобразует это в плоский NSAttributedString или SpannableString, который содержит следующую информацию:
"I am bold and red" 0-9: bold 9-17: bold, red
Контейнеры
Элемент <Text> уникален относительно макета: все внутри больше не использует макет Flexbox, а использует макет текста. Это означает, что элементы внутри <Text> больше не являются прямоугольниками, а перетекают, когда видят конец строки.
<Text> <Text>First part and </Text> <Text>second part</Text> </Text> // Text container: the text will be inline if the space allowed it // |First part and second part| // otherwise, the text will flow as if it was one // |First part | // |and second | // |part | <View> <Text>First part and </Text> <Text>second part</Text> </View> // View container: each text is its own block // |First part and| // |second part | // otherwise, the text will flow in its own block // |First part | // |and | // |second part|
Ограниченное наследование стилей
В веб-разработке обычный способ установить семейство и размер шрифта для всего документа — воспользоваться унаследованными свойствами CSS, как показано ниже:
html {
font-family: 'lucida grande', tahoma, verdana, arial, sans-serif;
font-size: 11px;
color: #141823;
}
Все элементы в документе унаследуют этот шрифт, если они или один из их родителей не задают новое правило.
В React Native мы более строги в этом отношении: вы должны обернуть все узлы текста внутри компонента <Text>. Вы не можете иметь узел текста непосредственно под <View>.
// BAD: will raise exception, can't have a text node as child of a <View>
<View>
Some text
</View>
// GOOD
<View>
<Text>
Some text
</Text>
</View>
Вы также теряете возможность настроить шрифт по умолчанию для всего поддерева. Между тем, fontFamily принимает только одно имя шрифта, что отличается от font-family в CSS. Рекомендуемый способ использования согласованных шрифтов и размеров по всему приложению — создать компонент MyAppText, включающий их, и использовать этот компонент во всем приложении. Вы также можете использовать этот компонент для создания более специфичных компонентов, таких как MyAppHeaderText для других типов текста.
<View>
<MyAppText>
Text styled with the default font for the entire application
</MyAppText>
<MyAppHeaderText>Text styled as a header</MyAppHeaderText>
</View>
Предполагая, что MyAppText — это компонент, который отображает только своих дочерних элементов в компонент Text со стилизацией, то MyAppHeaderText может быть определен следующим образом:
class MyAppHeaderText extends Component {
render() {
return (
<MyAppText>
<Text style={{ fontSize: 20 }}>
{this.props.children}
</Text>
</MyAppText>
);
}
}
Компоновка MyAppText таким образом гарантирует, что мы получим стили из компонента верхнего уровня, но предоставляет нам возможность добавить/переопределить их в конкретных случаях.
React Native всё ещё имеет концепцию наследования стилей, но ограниченную поддеревьями текста. В этом случае вторая часть будет и жирной, и красной.
<Text style={{ fontWeight: 'bold' }}>
I am bold
<Text style={{ color: 'red' }}>and red</Text>
</Text>
Мы считаем, что этот более ограниченный способ стилизации текста приведёт к более качественным приложениям:
(Разработчик) Компоненты React разработаны с учётом сильной изоляции: Вы должны иметь возможность поместить компонент в любом месте вашего приложения, полагаясь на то, что, если свойства одинаковые, он будет выглядеть и вести себя одинаково. Свойства текста, которые могли бы наследовать извне свойств, нарушили бы эту изоляцию.
(Реализатор) Реализация React Native также упрощается. Нам не нужно иметь поле
fontFamilyв каждом элементе, и нам не нужно потенциально проходить по дереву до корня каждый раз, когда мы отображаем узел текста. Наследование стилей закодировано только внутри нативного компонента Text и не просачивается в другие компоненты или систему.
Справочник
Свойства
accessibilityHint
Подсказка доступности помогает пользователям понять, что произойдет, когда они выполнят действие над элементом доступности, если этот результат не ясен из метки доступности.
| Тип |
|---|
| строка |
accessibilityLanguage iOS
Значение, указывающее, какой язык должен использовать экранный диктор, когда пользователь взаимодействует с элементом. Оно должно соответствовать спецификации BCP 47.
См. документацию iOS accessibilityLanguage для получения дополнительной информации.
| Тип |
|---|
| строка |
accessibilityLabel
Заменяет текст, который считывает экранный диктор, когда пользователь взаимодействует с элементом. По умолчанию метка формируется путём обхода всех дочерних элементов и накопления всех узлов Text разделённых пробелами.
| Тип |
|---|
| строка |
accessibilityRole
Сообщает экранному диктору рассматривать текущий фокусируемый элемент как имеющий определённую роль.
В iOS эти роли сопоставляются с соответствующими атрибутами доступности. Кнопка изображения имеет ту же функциональность, что и если атрибут был задан как 'изображение' и 'кнопка'. Для получения дополнительной информации см. руководство по доступности.
В Android эти роли имеют аналогичную функциональность в TalkBack, как добавление атрибутов доступности в Voiceover в iOS
| Тип |
|---|
| AccessibilityRole |
accessibilityState
Сообщает экранному диктору рассматривать текущий фокусируемый элемент как находящийся в определённом состоянии.
Вы можете предоставить одно состояние, отсутствие состояния или несколько состояний. Состояния должны передаваться через объект. Пример: {selected: true, disabled: true}.
| Тип |
|---|
| AccessibilityState |
accessibilityActions
Действия доступности позволяют вспомогательной технологии программно вызывать действия компонента. Свойство accessibilityActions должно содержать список объектов действия. Каждый объект действия должен содержать имя поля и метку.
Для получения дополнительной информации см. руководство по доступности.
| Тип | Обязательно |
|---|---|
| массив | Нет |
onAccessibilityAction
Вызывается, когда пользователь выполняет действия доступности. Единственным аргументом этой функции является событие, содержащее имя действия для выполнения.
Для получения дополнительной информации см. руководство по доступности.
| Тип | Обязательно |
|---|---|
| функция | Нет |
accessible
При установке в true, указывает, что представление является элементом доступности.
Для получения дополнительной информации см. руководство по доступности.
| Тип | Значение по умолчанию |
|---|---|
| логическое значение | true |
adjustsFontSizeToFit
Указывает, должны ли шрифты автоматически уменьшаться для соответствия заданным ограничениям стилей.
| Тип | Значение по умолчанию |
|---|---|
| логическое значение | false |
allowFontScaling
Указывает, должны ли шрифты масштабироваться, чтобы учитывать настройки доступности размера текста.
| Тип | Значение по умолчанию |
|---|---|
| логическое значение | true |
android_hyphenationFrequency Android
Задает частоту автоматической дефисации для определения разрывов слов в Android API Level 23+.
| Тип | Значение по умолчанию |
|---|---|
перечисление('none', 'normal','full') |
'none' |
dataDetectorType Android
Определяет типы данных, преобразуемых в нажаваемые URL в текстовом элементе. По умолчанию типы данных не обнаруживаются.
Вы можете указать только один тип.
| Тип | Значение по умолчанию |
|---|---|
перечисление('phoneNumber', 'link', 'email', 'none', 'all') |
'none' |
disabled Android
Устанавливает состояние отключения текстового представления для целей тестирования.
| Тип | Значение по умолчанию |
|---|---|
| булево | false |
ellipsizeMode
Когда numberOfLines установлено, это свойство определяет, как текст будет усечён. numberOfLines должно быть установлено совместно с этим свойством.
Это может быть одно из следующих значений:
-
head— Строка отображается так, что конец помещается в контейнер, а отсутствующий текст в начале строки обозначается эллипсом. например, "...wxyz" -
middle— Строка отображается так, что начало и конец помещаются в контейнер, а отсутствующий текст посередине обозначается эллипсом. "ab...yz" -
tail— Строка отображается так, что начало помещается в контейнер, а отсутствующий текст в конце строки обозначается эллипсом. например, "abcd..." -
clip— Строки не выводятся за пределы контейнера текста.
В Android, когда
numberOfLinesустановлено значение, большее, чем1, только значениеtailбудет работать корректно.
| Тип | Значение по умолчанию |
|---|---|
перечисление('head', 'middle', 'tail', 'clip') |
tail |
maxFontSizeMultiplier
Указывает максимальный возможный масштаб шрифта, когда allowFontScaling включено. Возможные значения:
-
null/undefined: наследовать от родительского узла или глобального значения по умолчанию (0) -
0: нет максимума, игнорировать родительское/глобальное значение по умолчанию -
>= 1: устанавливаетmaxFontSizeMultiplierэтого узла в это значение
| Тип | Значение по умолчанию |
|---|---|
| число | undefined |
minimumFontScale iOS
Указывает наименьший возможный масштаб шрифта, когда adjustsFontSizeToFit включен. (значения 0.01-1.0).
| Тип |
|---|
| число |
nativeID
Используется для поиска этого элемента из нативного кода.
| Тип |
|---|
| строка |
numberOfLines
Используется для обрезки текста с помощью многоточия после вычисления макета текста, включая перенос строк, таким образом, что общее количество строк не превышает это число. Установка этого свойства в 0 приведет к сбросу этого значения, что означает, что ограничение по строкам не будет применено.
Этот параметр обычно используется с ellipsizeMode.
| Тип | Значение по умолчанию |
|---|---|
| число | 0 |
onLayout
Вызывается при монтировании и при изменении макета.
| Тип |
|---|
| ({ nativeEvent: LayoutEvent }) => void |
onLongPress
Эта функция вызывается при длительном нажатии.
| Тип |
|---|
| ({ nativeEvent: PressEvent }) => void |
onMoveShouldSetResponder
Хочет ли этот элемент «захватить» реакцию на касания? Это вызывается при каждом движении касания на View , когда он не является обработчиком.
| Тип |
|---|
| ({ nativeEvent: PressEvent }) => boolean |
onPress
Эта функция вызывается при нажатии.
| Тип |
|---|
| ({ nativeEvent: PressEvent }) => void |
onResponderGrant
Элемент теперь реагирует на события касания. Сейчас самое время выделить и показать пользователю, что происходит.
| Тип |
|---|
| ({ nativeEvent: PressEvent }) => void |
onResponderMove
Пользователь перемещает палец.
| Тип |
|---|
| ({ nativeEvent: PressEvent }) => void |
onResponderRelease
Вызывается в конце касания.
| Тип |
|---|
| ({ nativeEvent: PressEvent }) => void |
onResponderTerminate
Обработчик был взят из View. Может быть взят другими элементами после вызова onResponderTerminationRequest, или может быть взят ОС без запроса (например, происходит в центре управления/центре уведомлений на iOS).
| Тип |
|---|
| ({ nativeEvent: PressEvent }) => void |
onResponderTerminationRequest
Другой View хочет стать обработчиком и просит этот View освободить его. Возврат true позволяет освободить его.
| Тип |
|---|
| ({ nativeEvent: PressEvent }) => boolean |
onStartShouldSetResponderCapture
Если родительский View хочет предотвратить, чтобы дочерний View стал обработчиком при начале касания, он должен иметь этот обработчик, который возвращает true.
| Тип |
|---|
| ({ nativeEvent: PressEvent }) => boolean |
onTextLayout
Вызывается при изменении макета текста.
| Тип |
|---|
(TextLayoutEvent) => mixed |
pressRetentionOffset
Когда прокрутка отключена, это определяет, насколько далеко ваш палец может сместиться от кнопки, прежде чем кнопка будет деактивирована. После деактивации, попробуйте переместить его обратно, и вы увидите, что кнопка снова активирована! Перемещайте его вперёд и назад несколько раз, пока прокрутка отключена. Убедитесь, что передаёте константу, чтобы уменьшить выделение памяти.
| Тип |
|---|
| Прямоугольник, число |
selectable
Позволяет пользователю выделять текст для использования нативных функций копирования и вставки.
| Тип | Значение по умолчанию |
|---|---|
| логическое | false |
selectionColor Android
Цвет выделения текста.
| Тип |
|---|
| цвет |
style
| Тип |
|---|
| Стиль текста, Свойства стиля элемента |
suppressHighlighting iOS
Когда true, визуальных изменений не происходит при нажатии на текст. По умолчанию при нажатии на текст выделяется серая область.
| Тип | Значение по умолчанию |
|---|---|
| логическое | false |
testID
Используется для поиска этого элемента в тестах конечных пользователей.
| Тип |
|---|
| строка |
textBreakStrategy Android
Установка стратегии разрыва текста на Android API Level 23+, возможные значения simple, highQuality, balanced.
| Тип | Значение по умолчанию |
|---|---|
перечисление('simple', 'highQuality', 'balanced') |
highQuality |
Определения типов
TextLayout
Объект TextLayout является частью обратного вызова TextLayoutEvent и содержит данные измерения для Text строки.
Пример
{
capHeight: 10.496,
ascender: 14.624,
descender: 4,
width: 28.224,
height: 18.624,
xHeight: 6.048,
x: 0,
y: 0
}
Свойства
| Имя | Тип | Необязательно | Описание |
|---|---|---|---|
| ascender | число | Нет | Высота подъема строки после изменения макета текста. |
| capHeight | число | Нет | Высота заглавной буквы над базовой линией. |
| descender | число | Нет | Высота опускания строки после изменения макета текста. |
| height | число | Нет | Высота строки после изменения макета текста. |
| width | число | Нет | Ширина строки после изменения макета текста. |
| x | число | Нет | Координата X строки внутри компонента Text. |
| xHeight | число | Нет | Расстояние между базовой линией и серединой строки (размер шрифта). |
| y | число | Нет | Координата Y строки внутри компонента Text. |
TextLayoutEvent
Объект TextLayoutEvent возвращается в обратном вызове в результате изменения макета компонента. Он содержит ключ lines со значением, которое представляет собой массив, содержащий объект TextLayout , соответствующий каждой отображаемой строке текста.
Пример
{
lines: [
TextLayout,
TextLayout
// ...
];
target: 1127;
}
Свойства
| Имя | Тип | Необязательно | Описание |
|---|---|---|---|
| lines | массив TextLayout | Нет | Предоставляет данные TextLayout для каждой отображаемой строки. |
| target | число | Нет | Идентификатор узла элемента. |
© 2022 Facebook Inc.
Licensed under the Creative Commons Attribution 4.0 International Public License.
https://reactnative.dev/docs/text