【React Native】文件翻譯閱讀紀錄 - Components(組件) - Text
Facebook Open Source React Native |
Text
用於顯示文本的React組件。
Text
支持嵌套,樣式和触摸處理。在下面的示例中,嵌套的標題和正文文本將從 styles.baseText 繼承 fontFamily,但標題提供了自己的其他樣式。由於字面換行,標題和正文將疊加在一起:
嵌套文本
iOS和Android都允許您通過使用特定格式(如粗體或彩色文本)對字符串的範圍進行註釋來顯示格式化文本(iOS上為NSAttributedString,Android上為SpannableString)。在實踐中,這非常繁瑣。對於React Native,我們決定使用web範例來嵌套文本以達到相同的效果。
在幕後,React Native將其轉換為包含以下信息的平面 NSAttributedString 或 SpannableString:
"I am bold and red"
0-9: bold
9-17: bold, red
嵌套視圖(僅限iOS)
在iOS上,您可以在Text組件中嵌套視圖。這是一個例子:
要使用此功能,必須為視圖指定寬度和高度。
Containers
<Text>元素相對於佈局是特殊的:內部的所有內容不再使用flexbox佈局,而是使用文本佈局。這意味著<Text>內部的元素不再是矩形,而是在看到行尾時換行。
<Text>
<Text>First part and </Text>
<Text>second part</Text>
</Text>
// Text container: all the text flows 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|
有限式傳承
在Web上,為整個文檔設置字體系列和大小的常用方法是利用繼承的CSS屬性,如下所示:
html {
font-family: 'lucida grande', tahoma, verdana, arial, sans-serif;
font-size: 11px;
color: #141823;
}
除非文檔或其父級之一指定新規則,否則文檔中的所有元素都將繼承此字體。
在React Native中,我們對它更加嚴格:您必須將所有文本節點包裝在 <Text> 組件中。您不能直接在 <View> 下擁有文本節點。
在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>
您還失去了為整個子樹設置默認字體的功能。在整個應用程序中使用一致字體和大小的推薦方法是創建一個包含它們的組件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仍然具有樣式繼承的概念,但僅限於文本子樹。在這種情況下,第二部分將是粗體和紅色。
React Native仍然具有樣式繼承的概念,但僅限於文本子樹。在這種情況下,第二部分將是粗體和紅色。
<Text style={{fontWeight: 'bold'}}>
I am bold
<Text style={{color: 'red'}}>and red</Text>
</Text>
我們認為,這種更加受約束的樣式文本方式將產生更好的應用程序:
- (開發人員)React組件在設計時考慮到了強烈的隔離:您應該能夠將組件放在應用程序的任何位置,相信只要道具相同,它的外觀和行為就會一樣。可以從道具外部繼承的文本屬性會破壞這種隔離。
- (實現者)React Native的實現也得到了簡化。我們不需要在每個元素上都有一個fontFamily字段,每次顯示文本節點時,我們都不需要將樹遍歷到根目錄。樣式繼承僅在本機Text組件內編碼,不會洩漏到其他組件或系統本身。
Props
selectable
accessible
ellipsizeMode
nativeID
numberOfLines
onLayout
onLongPress
onPress
pressRetentionOffset
allowFontScaling
style
testID
disabled
selectionColor
textBreakStrategy
adjustsFontSizeToFit
minimumFontScale
suppressHighlighting
參考
Props
selectable
設置為true時,表示視圖是輔助功能元素。 Text元素的默認值為true。
TYPE | REQUIRED |
---|---|
bool | No |
accessible
設置為true時,表示視圖是輔助功能元素。 Text元素的默認值為true。
有關更多信息,請參閱“輔助功能”指南
有關更多信息,請參閱“輔助功能”指南
TYPE | REQUIRED |
---|---|
bool | No |
ellipsizeMode
設置numberOfLines時,此prop將定義如何截斷文本。 numberOfLines必須與此prop一起設置。
這可以是以下值之一:
這可以是以下值之一:
head
- 顯示行以使末尾適合容器,並且行開頭的缺失文本由省略號字符表示。例如,“... wxyz”middle
- 顯示該行,使得開頭和結尾適合容器,中間缺少的文本由省略號字符表示。 “AB ... YZ”tail
- 顯示該行,使得開頭適合容器,行末尾的缺失文本由省略號字形表示。例如,“abcd ......”clip
- 不會在文本容器的邊緣之外繪製線條。
默認為
tail
.TYPE | REQUIRED |
---|---|
enum('head', 'middle', 'tail', 'clip') | No |
nativeID
用於從本機代碼中查找此視圖。
TYPE | REQUIRED |
---|---|
string | No |
numberOfLines
用於在計算文本佈局(包括換行)後使用省略號截斷文本,以使總行數不超過此數。
該prop通常與 ellipsizeMode 一起使用。
TYPE | REQUIRED |
---|---|
number | No |
onLayout
使用安裝和佈局更改時調用
{nativeEvent: {layout: {x, y, width, height}}}
TYPE | REQUIRED |
---|---|
function | No |
onLongPress
長按時調用此功能。
e.g.,
onLongPress={this.increaseSize}>
TYPE | REQUIRED |
---|---|
function | No |
onPress
按下此功能。
e.g.,
onPress={() => console.log('1st')}
TYPE | REQUIRED |
---|---|
function | No |
pressRetentionOffset
當禁用滾動視圖時,這將定義在取消激活按鈕之前觸摸可以從按鈕移開的距離。一旦停用,嘗試將其移回,您將看到該按鈕再次被重新激活!在禁用滾動視圖的同時來回移動幾次。確保傳入常量以減少內存分配。
TYPE | REQUIRED |
---|---|
object: {top: number, left: number, bottom: number, right: number} | No |
allowFontScaling
指定字體是否應縮放以遵循“文本大小”輔助功能設置。默認值為true。
TYPE | REQUIRED |
---|---|
bool | No |
style
TYPE | REQUIRED |
---|---|
style | No |
textShadowOffset
: object: {width: number,height: number}color
: colorfontSize
: numberfontStyle
: enum('normal', 'italic')fontWeight
: enum('normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900')指定字體粗細。大多數字體都支持“正常”和“粗體”值。並非所有字體都具有每個數值的變體,在這種情況下,選擇最接近的字體。lineHeight
: numbertextAlign
: enum('auto', 'left', 'right', 'center', 'justify')指定文本對齊。值 'justify' 僅在iOS上支持,在 Android 上支持不支援。textDecorationLine
: enum('none', 'underline', 'line-through', 'underline line-through')textShadowColor
: colorfontFamily
: stringtextShadowRadius
: numberincludeFontPadding
: bool (Android)設置為false以刪除旨在為某些上升/下降器騰出空間的額外字體填充。對於某些字體,此填充可以使文本在垂直居中時看起來略微錯位。為獲得最佳效果,還將 textAlignVertical 設置為 center。默認為true。
textAlignVertical
: enum('auto', 'top', 'bottom', 'center') (Android)fontVariant
: array of enum('small-caps', 'oldstyle-nums', 'lining-nums', 'tabular-nums', 'proportional-nums') (iOS)letterSpacing
: number增加或減少字符之間的間距。默認值為0,表示沒有額外的字母間距。
iOS:每個字形後將呈現額外的空間。
Android:僅支持自Android 5.0以來 - 舊版本將忽略此屬性。請注意,字形周圍將添加額外的空間(每側一半),這與iOS渲染不同。可以通過使用佈局屬性來模擬iOS渲染,例如負邊際,適合您的情況。textDecorationStyle
: enum('solid', 'double', 'dotted', 'dashed') (iOS)textTransform
: enum('none', 'uppercase', 'lowercase', 'capitalize') (iOS)writingDirection
: enum('auto', 'ltr', 'rtl') (iOS)
testID
用於在端到端測試中查找此視圖。
TYPE | REQUIRED |
---|---|
string | No |
disabled
指定文本視圖的禁用狀態以進行測試
TYPE | REQUIRED | PLATFORM |
---|---|---|
bool | No | Android |
selectionColor
文本的高亮顏色。
TYPE | REQUIRED | PLATFORM |
---|---|---|
color | No | Android |
textBreakStrategy
在Android API Level 23+上設置文本中斷策略,可能的值很簡單,highQuality,balanced。默認值為 highQuality。
TYPE | REQUIRED | PLATFORM |
---|---|---|
enum('simple', 'highQuality', 'balanced') | No | Android |
adjustsFontSizeToFit
指定是否應自動縮小字體以適合給定的樣式約束。
TYPE | REQUIRED | PLATFORM |
---|---|---|
bool | No | iOS |
minimumFontScale
指定在啟用adjustsFontSizeToFit時字體可以達到的最小可能比例。 (值0.01-1.0)。
TYPE | REQUIRED | PLATFORM |
---|---|---|
number | No | iOS |
suppressHighlighting
如果為true,則在按下文本時不會進行視覺更改。 默認情況下,灰色橢圓會在按下時突出顯示文本。
TYPE | REQUIRED | PLATFORM |
---|---|---|
bool | No | iOS |
0 意見