跳至主要内容

Text

用于显示文本的 React 组件。

Text 支持嵌套、样式设置和触摸处理。

在以下示例中,嵌套的标题和正文文本将继承自 styles.baseTextfontFamily,但标题提供了自己的附加样式。由于文字换行符,标题和正文将彼此堆叠

嵌套文本

Android 和 iOS 都允许您通过使用特定格式(如粗体或彩色文本)注释字符串的范围来显示格式化文本(iOS 上为 NSAttributedString,Android 上为 SpannableString)。在实践中,这非常繁琐。对于 React Native,我们决定为此使用 Web 范式,您可以在其中嵌套文本以达到相同的效果。

在幕后,React Native 将其转换为包含以下信息的扁平化 NSAttributedStringSpannableString

"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 allows 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|

有限的样式继承

在 Web 上,设置整个文档的字体系列和大小的常用方法是利用继承的 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 仅接受单个字体名称,这与 CSS 中的 font-family 不同。在整个应用程序中使用一致的字体和大小的推荐方法是创建一个包含它们的组件 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 可以定义如下

const MyAppHeaderText = ({children}) => {
return (
<MyAppText>
<Text style={{fontSize: 20}}>{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 上的功能类似于在 iOS 上的 Voiceover 中添加辅助功能特征的功能

类型
辅助功能角色

accessibilityState

告诉屏幕阅读器将当前聚焦的元素视为处于特定状态。

您可以提供一个状态、无状态或多个状态。状态必须通过对象传递,例如 {selected: true, disabled: true}

类型
辅助功能状态

accessibilityActions

辅助功能操作允许辅助技术以编程方式调用组件的操作。accessibilityActions 属性应包含操作对象的列表。每个操作对象都应包含字段名称和标签。

有关更多信息,请参阅 辅助功能指南

类型必需
数组

onAccessibilityAction

当用户执行辅助功能操作时调用。此函数的唯一参数是一个包含要执行的操作名称的事件。

有关更多信息,请参阅 辅助功能指南

类型必需
函数

accessible

设置为 true 时,表示该视图是一个辅助功能元素。

有关更多信息,请参阅 辅助功能指南

类型默认
布尔值true

adjustsFontSizeToFit

指定是否应自动缩小字体以适应给定的样式约束。

类型默认
布尔值false

allowFontScaling

指定字体是否应按比例缩放以尊重文本大小辅助功能设置。

类型默认
布尔值true

android_hyphenationFrequency
Android

在确定 Android API 级别 23+ 上的单词换行符时,设置要使用的自动连字符的频率。

类型默认
枚举('none''normal''full''none'

aria-busy

指示元素正在修改,辅助技术可能希望等到更改完成后再向用户通知更新。

类型默认
布尔值false

aria-checked

指示可选中元素的状态。此字段可以采用布尔值或“mixed”字符串来表示混合复选框。

类型默认
布尔值,“mixed”false

aria-disabled

指示元素是可感知的但已禁用,因此无法编辑或操作。

类型默认
布尔值false

aria-expanded

指示可扩展元素当前是展开还是折叠。

类型默认
布尔值false

aria-label

定义一个字符串值,该值标记交互式元素。

类型
字符串

aria-selected

指示可选择元素当前是否已选中。

类型
布尔值

dataDetectorType
Android

确定文本元素中转换为可点击 URL 的数据类型。默认情况下,不检测任何数据类型。

您只能提供一种类型。

类型默认
枚举('phoneNumber''link''email''none''all''none'

disabled
Android

为测试目的指定文本视图的禁用状态。

类型默认
布尔值false

dynamicTypeRamp
iOS

在 iOS 上应用于此元素的 动态类型 斜坡。

类型默认
枚举('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 值才能正常工作。

类型默认
枚举 ('head', 'middle', 'tail', 'clip')tail

id

用于从原生代码中定位此视图。优先于 nativeID 属性。

类型
字符串

maxFontSizeMultiplier

指定启用 allowFontScaling 时字体可以达到的最大缩放比例。可能的值

  • null/undefined:从父节点或全局默认值 (0) 继承
  • 0:无最大值,忽略父级/全局默认值
  • >= 1:将此节点的 maxFontSizeMultiplier 设置为此值
类型默认
数字未定义

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

在用户按下时调用的函数,在 onPressOut 之后触发。

类型
({nativeEvent: PressEvent}) => void

onPressIn

在触摸开始时立即调用,在 onPressOutonPress 之前。

类型
({nativeEvent: PressEvent}) => void

onPressOut

在释放触摸时调用。

类型
({nativeEvent: PressEvent}) => void

onResponderGrant

视图现在正在响应触摸事件。这是突出显示并向用户显示正在发生的事情的时机。

在 Android 上,从此回调返回 true 以阻止任何其他原生组件成为响应者,直到此响应者终止。

类型
({nativeEvent: PressEvent}) => void | boolean

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

当滚动视图被禁用时,这定义了在禁用按钮之前,您的触摸可以偏离按钮多远。一旦禁用,尝试将其移回,您将看到按钮再次被激活!在滚动视图被禁用时,将其前后移动几次。确保传入一个常量以减少内存分配。

类型
Rect,数字

role

role 将组件的目的传达给辅助技术的使用者。优先于 accessibilityRole 属性。

类型
角色

selectable

允许用户选择文本,以使用本机复制粘贴功能。

类型默认
布尔值false

selectionColor
Android

文本的高亮颜色。

类型
颜色

style

类型
文本样式视图样式属性

suppressHighlighting
iOS

true 时,按下文本时不会进行任何视觉更改。默认情况下,按下时会用灰色椭圆形突出显示文本。

类型默认
布尔值false

testID

用于在端到端测试中定位此视图。

类型
字符串

textBreakStrategy
Android

在 Android API 级别 23+ 上设置文本断行策略,可能的值为 simplehighQualitybalanced

类型默认
枚举 ('simple', 'highQuality', 'balanced')highQuality

lineBreakStrategyIOS
iOS

在 iOS 14+ 上设置换行策略。可能的值为 nonestandardhangul-wordpush-out

类型默认
枚举 ('none', 'standard', 'hangul-word', 'push-out')'none'

类型定义

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 坐标。
xHeight数字基线和行中值(正文大小)之间的距离。
y数字文本组件内行的 Y 坐标。

TextLayoutEvent

TextLayoutEvent 对象作为组件布局更改的结果在回调中返回。它包含一个名为 lines 的键,其值为一个数组,其中包含对应于每个渲染文本行的 TextLayout 对象。

示例

{
lines: [
TextLayout,
TextLayout,
// ...
];
target: 1127;
}

属性

名称类型可选描述
linesTextLayout 数组提供每个渲染行的 TextLayout 数据。
target数字元素的节点 ID。