Перейти к содержанию

Text

Text - компонент React для отображения текста.

Text поддерживает вложенность, стилизацию и обработку касаний.

В следующем примере вложенные заголовок и основной текст наследуют fontFamily от styles.baseText, но заголовок предоставляет свои собственные дополнительные стили. Заголовок и тело будут накладываться друг на друга из-за буквальных новых строк:

Вложенный текст

И Android, и iOS позволяют отображать форматированный текст путем аннотирования диапазонов строки с определенным форматированием, например, жирным или цветным текстом (NSAttributedString на iOS, SpannableString на Android). На практике это очень утомительно. В React Native мы решили использовать для этого веб-парадигму, где вы можете вложить текст для достижения того же эффекта.

За кулисами React Native преобразует это в плоскую NSAttributedString или SpannableString, которая содержит следующую информацию:

1
2
3
"I am bold and red"
0-9: bold
9-17: bold, red

Контейнеры

Элемент <Text> уникален с точки зрения компоновки: все, что находится внутри него, больше не использует компоновку Flexbox, а использует компоновку текста. Это означает, что элементы внутри <Text> больше не являются прямоугольниками, а заворачиваются, когда видят конец строки.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<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, например, такими:

1
2
3
4
5
6
html {
    font-family: 'lucida grande', tahoma, verdana, arial,
        sans-serif;
    font-size: 11px;
    color: #141823;
}

Все элементы в документе наследуют этот шрифт, если только они или один из их родителей не укажет новое правило.

В React Native мы более строги к этому: Вы должны обернуть все текстовые узлы внутри компонента <Text>. Вы не можете располагать текстовый узел непосредственно под <View>.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 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, для других видов текста.

1
2
3
4
5
6
7
8
9
<View>
    <MyAppText>
        Text styled with the default font for the entire
        application
    </MyAppText>
    <MyAppHeaderText>
        Text styled as a header
    </MyAppHeaderText>
</View>

Если предположить, что MyAppText — это компонент, который только рендерит свои дочерние элементы в компонент Text со стилизацией, то MyAppHeaderText можно определить следующим образом:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class MyAppHeaderText extends Component {
    render() {
        return (
            <MyAppText>
                <Text style={{ fontSize: 20 }}>
                    {this.props.children}
                </Text>
            </MyAppText>
        );
    }
}

Составление MyAppText таким образом гарантирует, что мы получим стили от компонента верхнего уровня, но оставляет нам возможность добавлять / переопределять их в конкретных случаях использования.

В React Native все еще существует концепция наследования стилей, но она ограничена текстовыми поддеревьями. В данном случае вторая часть будет и жирной, и красной.

1
2
3
4
<Text style={{ fontWeight: 'bold' }}>
    I am bold
    <Text style={{ color: 'red' }}>and red</Text>
</Text>

Мы считаем, что такой более ограниченный способ стилизации текста позволит создавать более качественные приложения:

  • (Разработчик) Компоненты React разработаны с учетом сильной изоляции: Вы должны иметь возможность поместить компонент в любое место вашего приложения, будучи уверенным, что до тех пор, пока пропсы одинаковы, он будет выглядеть и вести себя одинаково. Свойства текста, которые могут быть унаследованы от других пропсов, нарушат эту изоляцию.

  • (Реализатор) Реализация React Native также упрощена. Нам не нужно иметь поле fontFamily на каждом отдельном элементе, и нам не нужно потенциально обходить дерево до корня каждый раз, когда мы отображаем текстовый узел. Наследование стиля кодируется только в родном компоненте Text и не просачивается в другие компоненты или саму систему.

Свойства

accessibilityHint

Подсказка доступности помогает пользователям понять, что произойдет, когда они выполнят действие над элементом доступности, если результат не ясен из метки доступности.

Тип
string

accessibilityLanguage

Значение, указывающее, какой язык должен использоваться программой чтения с экрана при взаимодействии пользователя с элементом. Оно должно соответствовать спецификации BCP 47.

Дополнительную информацию см. в iOS accessibilityLanguage doc.

Тип
string

accessibilityLabel

Переопределяет текст, который считывается программой чтения с экрана, когда пользователь взаимодействует с элементом. По умолчанию метка строится путем обхода всех дочерних элементов и накопления всех узлов Text, разделенных пробелом.

Тип
string

accessibilityRole

Указывает программе чтения экрана рассматривать текущий элемент, на котором сосредоточено внимание, как имеющий определенную роль.

В iOS эти роли отображаются на соответствующие черты доступности. Кнопка изображения имеет ту же функциональность, что и в случае, когда для трейта установлены значения 'image' и 'button'. Дополнительную информацию см. в Руководстве по доступности.

Тип
AccessibilityRole

accessibilityState

Указывает программе чтения экрана рассматривать элемент, на котором сфокусировано внимание, как находящийся в определенном состоянии.

Вы можете указать одно состояние, отсутствие состояния или несколько состояний. Состояния должны быть переданы через объект. Например: {selected: true, disabled: true}.

Тип
AccessibilityState

accessibilityActions

Действия доступности позволяют ассистивной технологии программно вызывать действия компонента. Свойство accessibilityActions должно содержать список объектов действий. Каждый объект действия должен содержать имя поля и метку.

Дополнительную информацию см. в Руководстве по доступности.

Тип Обязательно
array Нет

onAccessibilityAction

Вызывается, когда пользователь выполняет действия по обеспечению доступности. Единственным аргументом этой функции является событие, содержащее имя выполняемого действия.

Дополнительную информацию см. в Руководстве по доступности.

Тип Обязательно
function Нет

accessible

Если установлено значение true, указывает, что представление является элементом доступности.

Дополнительную информацию см. в Руководстве по доступности.

Тип По-умолчанию
boolean true

adjustsFontSizeToFit

Указывает, следует ли автоматически уменьшать масштаб шрифтов для соответствия заданным стилевым ограничениям.

Тип По-умолчанию
boolean false

allowFontScaling

Указывает, должны ли шрифты масштабироваться с учетом настроек доступности Text Size.

Тип По-умолчанию
boolean true

android_hyphenationFrequency

Устанавливает частоту использования автоматического дефиса при определении разрыва слов на Android API Level 23+.

Тип По-умолчанию
enum('none', 'normal', 'full') 'none'

aria-busy

Указывает на то, что элемент изменяется и что вспомогательные технологии могут захотеть подождать, пока изменения не будут завершены, прежде чем информировать пользователя об обновлении.

Тип По-умолчанию
boolean false

aria-checked

Указывает состояние элемента с флажком. Это поле может принимать либо булево значение, либо строку "mixed" для представления смешанных флажков.

Тип По-умолчанию
boolean, 'mixed' false

aria-disabled

Указывает, что элемент воспринимается, но отключен, поэтому его нельзя редактировать или использовать иным образом.

Тип По-умолчанию
boolean false

aria-expanded

Указывает, является ли расширяемый элемент в данный момент развернутым или свернутым.

Тип По-умолчанию
boolean false

aria-label

Определяет строковое значение, которое маркирует интерактивный элемент.

Тип
string

aria-selected

Указывает, выбран ли выбираемый элемент в данный момент или нет.

Тип
boolean

dataDetectorType

Определяет типы данных, преобразуемых в кликабельные URL-адреса в текстовом элементе. По умолчанию типы данных не определяются.

Вы можете указать только один тип.

Тип По-умолчанию
enum('phoneNumber', 'link', 'email', 'none', 'all') 'none'

disabled

Указывает отключенное состояние текстового представления для целей тестирования.

Тип По-умолчанию
bool false

dynamicTypeRamp

Рампа Dynamic Type, применяемая к этому элементу на iOS.

Тип По-умолчанию
enum('caption2', 'caption1', 'footnote', 'subheadline', 'callout', 'body', 'headline', 'title3', 'title2', 'title1', 'largeTitle') 'body'

ellipsizeMode

Когда задано numberOfLines, этот пропс определяет, как будет усечен текст. numberOfLines должен быть установлен в сочетании с этим пропсом.

Это может быть одно из следующих значений:

  • head — Строка отображается так, чтобы конец помещался в контейнер, а отсутствующий текст в начале строки обозначается глифом многоточия. например, "...wxyz".
  • middle — строка отображается так, что начало и конец помещаются в контейнер, а отсутствующий текст в середине обозначается глифом многоточия. "ab...yz"
  • tail — Строка отображается так, что начало помещается в контейнер, а пропущенный текст в конце строки обозначается многоточием. например, "abcd...".
  • clip — Линии не выводятся за край текстового контейнера.

На Android, когда numberOfLines установлено в значение больше, чем 1, корректно работает только значение tail.

Тип По-умолчанию
enum('head', 'middle', 'tail', 'clip') tail

id

Используется для определения местоположения этого представления из нативного кода. Имеет приоритет над пропсом nativeID.

Тип
string

maxFontSizeMultiplier

Определяет наибольший возможный масштаб, которого может достичь шрифт, если включено allowFontScaling. Возможные значения:

  • null/undefined: наследование от родительского узла или глобального значения по умолчанию (0)
  • 0: нет максимального значения, игнорировать родительское/глобальное значение по умолчанию
  • >= 1: устанавливает maxFontSizeMultiplier этого узла в данное значение
Тип По-умолчанию
number undefined

minimumFontScale

Определяет наименьший возможный масштаб, которого может достичь шрифт, когда включена функция adjustsFontSizeToFit. (значения 0.01 - 1.0).

Тип
number

nativeID

Используется для определения местоположения этого представления из нативного кода.

Тип
string

numberOfLines

Используется для усечения текста многоточием после вычисления расположения текста, включая обводку строк, таким образом, чтобы общее количество строк не превышало данного числа. Установка этого свойства в 0 приведет к снятию этого значения, что означает, что ограничение на количество строк применяться не будет.

Этот параметр обычно используется с ellipsizeMode.

Тип По-умолчанию
number 0

onLayout

Вызывается при монтировании и при смене раскладки.

Тип
({nativeEvent: LayoutEvent}) => void

onLongPress

Эта функция вызывается при длительном нажатии.

Тип
({nativeEvent: PressEvent}) => void

onMoveShouldSetResponder

Хочет ли это представление "претендовать" на отзывчивость на прикосновение? Это вызывается для каждого движения прикосновения к View, когда он не является ответчиком.

Тип
({nativeEvent: PressEvent}) => boolean

onPress

Функция, вызываемая при нажатии кнопки пользователем, срабатывает после onPressOut.

Тип
({nativeEvent: PressEvent}) => void

onPressIn

Вызывается сразу же при задействовании касания, перед onPressOut и onPress.

Тип
({nativeEvent: PressEvent}) => void

onPressOut

Вызывается, когда прикосновение отпускается.

Тип
({nativeEvent: PressEvent}) => void

onResponderGrant

Представление теперь реагирует на события прикосновения. Сейчас самое время выделить и показать пользователю, что происходит.

Тип
({nativeEvent: PressEvent}) => void

onResponderMove

Пользователь перемещает свой палец.

Тип
({nativeEvent: PressEvent}) => void

onResponderRelease

Уволен в конце касания.

Тип
({nativeEvent: PressEvent}) => void

Ответчик был забран из View. Может быть взят другими представлениями после вызова onResponderTerminationRequest, или может быть взят ОС без запроса (например, происходит с центром управления/центром уведомлений на iOS).

Тип
({nativeEvent: PressEvent}) => void

onResponderTerminationRequest

Какой-то другой View хочет стать отвечающим и просит этот View освободить его отвечающего. Возврат true позволяет освободить его.

Тип
({nativeEvent: PressEvent}) => boolean

onStartShouldSetResponderCapture

Если родительский View хочет предотвратить превращение дочернего View в ответчика при запуске касания, он должен иметь этот обработчик, который возвращает true.

Тип
({nativeEvent: PressEvent}) => boolean

onTextLayout

Вызывается при изменении макета текста.

Тип
(TextLayoutEvent) => mixed

pressRetentionOffset

Когда вид прокрутки отключен, этот параметр определяет, насколько далеко ваше прикосновение может отойти от кнопки, прежде чем кнопка будет деактивирована. После деактивации попробуйте переместить ее обратно, и вы увидите, что кнопка снова активирована! Переместите ее вперед-назад несколько раз, пока вид прокрутки отключен. Убедитесь, что вы передаете константу, чтобы уменьшить выделение памяти.

Тип
Rect, number

role

role передает назначение компонента пользователю вспомогательной технологии. Имеет приоритет над пропсом accessibilityRole.

Тип
Role

selectable

Позволяет пользователю выбрать текст, чтобы использовать встроенную функцию копирования и вставки.

Тип По-умолчанию
boolean false

selectionColor

Цвет выделения текста.

Тип
color

style

Тип
Text Style, View Style Props

suppressHighlighting

Если true, то при нажатии на текст не происходит никаких визуальных изменений. По умолчанию при нажатии на текст выделяется серый овал.

Тип По-умолчанию
boolean false

testID

Используется для размещения этого представления в сквозных тестах.

Тип
string

textBreakStrategy

Установка стратегии разбиения текста на Android API Level 23+, возможные значения simple, highQuality, balanced.

Тип По-умолчанию
enum('simple', 'highQuality', 'balanced') highQuality

userSelect

Позволяет пользователю выделять текст и использовать встроенные функции копирования и вставки. Имеет приоритет перед пропсом selectable.

Тип По-умолчанию
enum('auto', 'text', 'none', 'contain', 'all') none

lineBreakStrategyIOS

Установка стратегии перевода строки на iOS 14+. Возможные значения: none, standard, hangul-word и push-out.

Тип По-умолчанию
enum('none', 'standard', 'hangul-word', 'push-out') 'none'

Определения типа

TextLayout

Объект TextLayout является частью обратного вызова TextLayoutEvent и содержит данные измерения для строки Text.

Пример

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
    capHeight: 10.496,
    ascender: 14.624,
    descender: 4,
    width: 28.224,
    height: 18.624,
    xHeight: 6.048,
    x: 0,
    y: 0
}

Свойства

Имя Тип Обязательно Описание
ascender number Нет Высота подъема строки после изменения расположения текста.
capHeight number Нет Высота заглавной буквы над базовой линией.
descender number Нет Высота спуска строки после изменения расположения текста.
height number Нет Высота строки после изменения расположения текста.
width number Нет Ширина строки после изменения расположения текста.
x number Нет Координата линии X внутри компонента Text.
xHeight number Нет Расстояние между базовой линией и медианой линии (размер корпуса).
y number Нет Координата линии Y внутри компонента Text.

TextLayoutEvent

Объект TextLayoutEvent возвращается в обратном вызове в результате изменения компоновки компонента. Он содержит ключ lines со значением, которое представляет собой массив, содержащий объект TextLayout, соответствующий каждой отрисованной строке текста.

Пример

1
2
3
4
5
6
7
8
{
    lines: [
        TextLayout,
        TextLayout,
        // ...
    ];
    target: 1127;
}

Свойства

Имя Тип Обязательно Описание
lines array of TextLayouts Нет Предоставляет данные TextLayout для каждой отрисованной строки.
target number Нет Идентификатор узла элемента.

Комментарии