Text
一个用于显示文本的 React 组件,并且它也支持嵌套、样式,以及触摸处理。
在下面的例子里,嵌套的标题和正文文字会继承来自styles.baseText
的fontFamily
字体样式,不过标题上还附加了它自己额外的样式。标题和文本会在顶部依次堆叠,并且被代码中内嵌的换行符分隔开。
嵌套文本
在 iOS 和 Android 中显示格式化文本的方法类似,都是提供你想显示的文本内容,然后使用范围标注来指定一些格式(在 iOS 上是用NSAttributedString
,Android 上则是SpannableString
)。这种用法非常繁琐。在 React Native 中,我们决定采用和 Web 一致的设计,这样你可以把相同格式的文本嵌套包裹起来:
而实际上在框架内部,这会生成一个扁平结构的NSAttributedString
或是SpannableString
,包含以下信息:
"I am bold and red"
0-9: bold
9-17: bold, red
容器
<Text>
元素在布局上不同于其它组件:在 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 |
// the text will flow in its own block
// |First part |
// |and |
// |second part|
样式继承限制
在 Web 上,要想指定整个文档的字体和大小,我们只需要写:
/* 这段代码是CSS, *不是*React Native */
html {
font-family: 'lucida grande', tahoma, verdana, arial, sans-serif;
font-size: 11px;
color: #141823;
}
当浏览器尝试渲染一个文本节点的时候,它会在树中一路向上查询,直到根节点,来找到一个具备font-size
属性的元素。这个系统一个不好的地方在于任何节点都可能会有font-size
属性,包括<div>
标签。这个设计为了方便而设计,但实际上语义上并不太正确。
在 React Native 中,我们把这个问题设计的更加严谨:你必须把你的文本节点放在<Text>
组件内。你不能直接在<View>
下放置一段文本。
// 错误的做法:会导致一个错误。<View>下不能直接放一段文本。
<View>
一些文本
</View>
// 正确的做法
<View>
<Text>
一些文本
</Text>
</View>
并且你也不能直接设置一整颗子树的默认样式。此外,fontFamily
样式只接受一种字体名称,这一点和 CSS 也不一样。使用一个一致的文本和尺寸的推荐方式是创建一个包含相关样式的组件MyAppText
,然后在你的 App 中反复使用它。你还可以创建更多特殊的组件譬如MyAppHeaderText
来表达不同样式的文本。
<View>
<MyAppText>
这个组件包含了一个默认的字体样式,用于整个应用的文本
</MyAppText>
<MyAppHeaderText>这个组件包含了用于标题的样式</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>
我们相信这种看起来不太舒服的给文本添加样式的方法反而会帮助我们生产更好的 App:
-
(对开发者来说) React 组件在概念上被设计为强隔离性的:你应当可以在应用的任何位置放置一个组件,而且只要属性相同,其外观和表现都将完全相同。文本如果能够继承外面的样式属性,将会打破这种隔离性。
-
(对实现者来说) React Native 的实现也被简化了。我们不需要在每个元素上都添加一个
fontFamily
字段,并且我们也不需要隐含地在显示文本的时候向上遍历树。唯一的样式继承在原生 Text 组件中编码,也不会影响到其它组件或者系统本身。
文档
Props
accessibilityHint
无障碍提示有助于用户理解在执行辅助功能元素上的操作时将会发生什么,尤其当这个结果在辅助功能标签中不明确时。
Type |
---|
string |
accessibilityLanguage
iOS
指示当用户与元素交互时屏幕阅读器应该使用哪种语言。它应该遵循BCP 47 规范。
更多信息请参阅iOS accessibilityLanguage
文档。
Type |
---|
string |
accessibilityLabel
覆盖当用户与元素交互时屏幕阅读器读取的文本。默认情况下,标签是通过遍历所有子节点并累积所有的Text
节点(以空格分隔)来构建的。
Type |
---|
string |
accessibilityRole
告诉屏幕阅读器将当前聚焦的元素视为具有特定角色。
在 iOS 上,这些角色映射到相应的辅助功能特征。图像按钮的功能与将特征设置为“图像”和“按钮”相同。有关更多信息,请查看辅助功能指南。
在 Android 上,这些角色在 TalkBack 上的类似功能就像在 iOS 的 Voiceover 上添加辅助功能特征一样。
Type |
---|
AccessibilityRole |
accessibilityState
告诉屏幕阅读器将当前聚焦的元素视为处于特定状态。
您可以提供一个状态,没有状态,或者多个状态。这些状态必须通过一个对象传递进来。例如:{selected: true, disabled: true}
。
Type |
---|
AccessibilityState |
accessibilityActions
无障碍操作允许辅助技术以编程方式调用组件的动作。accessibilityActions
属性应包含动作对象的列表。每个动作对象都应包含字段名称和标签。
更多信息请参阅无障碍指南。
Type | Required |
---|---|
array | No |
onAccessibilityAction
当用户执行辅助功能操作时调用。此函数唯一的参数是一个包含要执行的操作名称的事件。
有关详细信息,请参阅 辅助功能指南。
Type | Required |
---|---|
function | No |
accessible
当设置为 true
时,表示该视图是一个辅助功能元素。
更多信息请参阅 辅助功能指南。
Type | Default |
---|---|
boolean | true |
adjustsFontSizeToFit
iOS
指定字体是否随着给定样式的限制而自动缩放。
类型 | 默认值 |
---|---|
boolean | false |
selectable
决定用户是否可以长按选择文本,以便复制和粘贴。
类型 | 必需 |
---|---|
bool | 否 |
ellipsizeMode
这个属性通常和下面的 numberOfLines
属性配合使用,表示当 Text 组件无法全部显示需要显示的字符串时如何用省略号进行修饰。
该属性有如下 4 种取值:
head
- 从文本内容头部截取显示省略号。例如: "...efg"middle
- 在文本内容中间截取显示省略号。例如: "ab...yz"tail
- 从文本内容尾部截取显示省略号。例如: "abcd..."clip
- 不显示省略号,直接从尾部截断。
默认值为 tail
.
类型 | 必需 |
---|---|
enum('head', 'middle', 'tail', 'clip') | 否 |
nativeID
用于在原生端定位此视图。
Type |
---|
string |
numberOfLines
用来当文本过长的时候裁剪文本。包括折叠产生的换行在内,总的行数不会超过这个属性的限制。
此属性一般和ellipsizeMode
搭配使用。
类型 | 必需 |
---|---|
number | 否 |
onLayout
在加载时或者布局变化以后调用。
Type |
---|
({nativeEvent: LayoutEvent}) => void |
onLongPress
当文本被长按以后调用此回调函数。
Type |
---|
({nativeEvent: PressEvent}) => void |
onPress
在用户按下后调用的函数,在onPressOut
触发之后被触发。
Type |
---|
({nativeEvent: PressEvent}) => void |
onPressIn
在触摸开始时立即调用,早于onPressOut
和onPress
。
Type |
---|
({nativeEvent: PressEvent}) => void |