react-native 常用組件(二)

8.Modal組件:[是一種簡(jiǎn)單的覆蓋在其他視圖之上顯示內(nèi)容的方式]
屬性:
visiblevisible屬性決定 modal 是否顯示。
supportedOrientationssupportedOrientations用于指定在設(shè)備切換橫豎屏方向時(shí),modal 會(huì)在哪些屏幕朝向下跟隨旋轉(zhuǎn)。在 iOS 上,除了本屬性外,還會(huì)受到應(yīng)用的 Info.plist 文件中UISupportedInterfaceOrientations的限制。如果還設(shè)置了presentationStyle屬性為pageSheet或formSheet,則在 iOS 上本屬性將被忽略。
onRequestCloseonRequestClose回調(diào)會(huì)在用戶按下 Android 設(shè)備上的后退按鍵或是 Apple TV 上的菜單鍵時(shí)觸發(fā)。請(qǐng)務(wù)必注意本屬性在 Android 平臺(tái)上為必填,且會(huì)在 modal 處于開啟狀態(tài)時(shí)阻止BackHandler事件。
onShowonShow回調(diào)函數(shù)會(huì)在 modal 顯示時(shí)調(diào)用。
transparenttransparent 屬性是指背景是否透明,默認(rèn)為白色,將這個(gè)屬性設(shè)為:true 的時(shí)候彈出一個(gè)透明背景層的modal。
animationTypeanimationType指定了 modal 的動(dòng)畫類型。[默認(rèn)值為none]

  • slide 從底部滑入滑出。
  • fade 淡入淡出。
  • none 沒(méi)有動(dòng)畫,直接蹦出來(lái)。

hardwareAcceleratedhardwareAccelerated屬性決定是否強(qiáng)制啟用硬件加速來(lái)繪制彈出層。[只適用android]
onDismissonDismiss回調(diào)會(huì)在 modal 被關(guān)閉時(shí)調(diào)用。[只適用ios]
onOrientationChange模態(tài)窗顯示的時(shí)候,當(dāng)設(shè)備方向發(fā)生更改時(shí),將調(diào)用onOrientationChange回調(diào)方法。 提供的設(shè)備方向僅為“豎屏”或“橫屏”。 無(wú)論當(dāng)前方向如何,也會(huì)在初始渲染時(shí)調(diào)用此回調(diào)方法[只適用ios]
presentationStylepresentationStyle決定 modal(在較大屏幕的設(shè)備比如 iPad 或是 Plus 機(jī)型)如何展現(xiàn)。[只適用ios]

  • fullScreen完全蓋滿屏幕。
  • pageSheet豎直方向幾乎蓋滿,水平居中,左右留出一定空白(僅用于大屏設(shè)備)。
  • formSheet豎直和水平都居中,四周都留出一定空白(僅用于大屏設(shè)備)。
  • overFullScreen完全蓋滿屏幕,同時(shí)允許透明。

默認(rèn)會(huì)根據(jù)transparent屬性而設(shè)置為overFullScreen或是fullScreen。
栗子:

import React, {Component} from "react";
import {Modal, Text, TouchableHighlight, View} from "react-native";

export default class ModalExample extends Component {
    state = {
        modalVisible: false
    };

    setModalVisible(visible) {
        this.setState({modalVisible: visible});
    }

    render() {
        return (
            <View style={{marginTop: 22}}>
                <Modal
                    animationType="slide"
                    transparent={false}
                    visible={this.state.modalVisible}
                    onRequestClose={() => {
                        alert("Modal has been closed.");
                    }}
                >
                    <View style={{marginTop: 22}}>
                        <View>
                            <TouchableHighlight
                                onPress={() => {
                                    this.setModalVisible(!this.state.modalVisible);
                                }}
                            >
                                <Text>Hide Modal</Text>
                            </TouchableHighlight>
                        </View>
                    </View>
                </Modal>

                <TouchableHighlight
                    onPress={() => {
                        this.setModalVisible(true);
                    }}
                >
                    <Text>Show Modal</Text>
                </TouchableHighlight>
            </View>
        );
    }
}

9.RefreshControl組件:[用在ScrollView或FlatList內(nèi)部,為其添加下拉刷新的功能。]當(dāng)ScrollView處于豎直方向的起點(diǎn)位置(scrollY: 0),此時(shí)下拉會(huì)觸發(fā)一個(gè)onRefresh事件。
注意:refreshing是一個(gè)受控屬性, 所以必須在onRefresh函數(shù)中設(shè)置為true,否則loading指示器會(huì)立即停止。
屬性:
refreshing視圖是否應(yīng)該在刷新時(shí)顯示指示器。
onRefresh在視圖開始刷新時(shí)調(diào)用。
colors指定至少一種顏色用來(lái)繪制刷新指示器。[只適用android]
enabled指定是否要啟用刷新指示器。[只適用android]
progressBackgroundColor指定刷新指示器的背景色。[只適用android]
progressViewOffset指定刷新指示器的垂直起始位置(top offset)。[只適用android]
size指定刷新指示器的大小,具體數(shù)值可參閱RefreshControl.SIZE.[只適用android]
tintColor指定刷新指示器的顏色。[只適用ios]
title指定刷新指示器下顯示的文字。[只適用ios]
titleColor指定刷新指示器下顯示的文字的顏色。[只適用ios]
栗子:

import React, {Component} from "react";
import {ScrollView, RefreshControl} from "react-native";

export default class App extends Component {
    state = {
        modalVisible: false,
        isRefreshing: false,
    };

    _onRefresh() {
        this.setState({isRefreshing: true});
        setTimeout(() => {
            this.setState({isRefreshing: false});
        }, 2000)
    }

    render() {
        return (
            <ScrollView
                refreshControl={
                    <RefreshControl
                        refreshing={this.state.isRefreshing}
                        onRefresh={this._onRefresh.bind(this)}
                        colors={['#ddd', '#0398ff']}
                        progressBackgroundColor="#ffffff"
                    />
                }
            />
        );
    }
}

10.SafeAreaView組件:[SafeAreaView的目的是在一個(gè)“安全”的可視區(qū)域內(nèi)渲染內(nèi)容。]SafeAreaView會(huì)自動(dòng)根據(jù)系統(tǒng)的各種導(dǎo)航欄、工具欄等預(yù)留出空間來(lái)渲染內(nèi)部?jī)?nèi)容。更重要的是,它還會(huì)考慮到設(shè)備屏幕的局限,比如屏幕四周的圓角或是頂部中間不可顯示的“劉?!眳^(qū)域。本組件目前僅支持 iOS 設(shè)備以及 iOS 11 或更高版本。
栗子:

SafeAreaView style={{flex: 1, backgroundColor: '#fff'}}>
  <View style={{ flex: 1 }}>
    <Text>Hello World!</Text>
  </View>
</SafeAreaView>

11.ScrollView組件:[滾動(dòng)視圖,同時(shí)還集成了觸摸鎖定的“響應(yīng)者”系統(tǒng)。]
記住ScrollView必須有一個(gè)確定的高度才能正常工作,因?yàn)樗鼘?shí)際上所做的就是將一系列不確定高度的子組件裝進(jìn)一個(gè)確定高度的容器(通過(guò)滾動(dòng)操作)。要給一個(gè)ScrollView確定一個(gè)高度的話,要么直接給它設(shè)置高度(不建議),要么確定所有的父容器都有確定的高度。一般來(lái)說(shuō)我們會(huì)給ScrollView設(shè)置flex: 1以使其自動(dòng)填充父容器的空余空間,但前提條件是所有的父容器本身也設(shè)置了flex或者指定了高度,否則就會(huì)導(dǎo)致無(wú)法正常滾動(dòng)。
ScrollView和FlatList應(yīng)該如何選擇?

  • ScrollView會(huì)簡(jiǎn)單粗暴地把所有子元素一次性全部渲染出來(lái)。其原理淺顯易懂,使用上自然也最簡(jiǎn)單。然而這樣簡(jiǎn)單的渲染邏輯自然帶來(lái)了性能上的不足。
  • FlatList會(huì)惰性渲染子元素,只在它們將要出現(xiàn)在屏幕中時(shí)開始渲染。這種惰性渲染邏輯要復(fù)雜很多。

屬性:

contentContainerStyle樣式會(huì)應(yīng)用到一個(gè)內(nèi)層的內(nèi)容容器上,并且所有的子視圖都會(huì)包裹在內(nèi)容容器樣式內(nèi)。

keyboardDismissMode用戶拖拽滾動(dòng)視圖的時(shí)候,是否要隱藏軟鍵盤。
【 跨平臺(tái)可用的值:
1. 'none' (默認(rèn)值),拖拽時(shí)不隱藏軟鍵盤。
2. 'on-drag',當(dāng)拖拽開始的時(shí)候隱藏軟鍵盤。
僅iOS可用的值:
- 'interactive',軟鍵盤伴隨拖拽操作同步地消失,并且如果往上滑動(dòng)會(huì)恢復(fù)鍵盤。安卓設(shè)備上不支持這個(gè)選項(xiàng),會(huì)表現(xiàn)的和none一樣。

keyboardShouldPersistTaps如果當(dāng)前界面有軟鍵盤,那么點(diǎn)擊scrollview后是否收起鍵盤,取決于本屬性的設(shè)置。(譯注:很多人反應(yīng)TextInput無(wú)法自動(dòng)失去焦點(diǎn)/需要點(diǎn)擊多次切換到其他組件等等問(wèn)題,其關(guān)鍵都是需要將TextInput放到ScrollView中再設(shè)置本屬性)

  • 'never' (默認(rèn)值),點(diǎn)擊TextInput以外的子組件會(huì)使當(dāng)前的軟鍵盤收起。此時(shí)子元素不會(huì)收到點(diǎn)擊事件。
  • 'always',鍵盤不會(huì)自動(dòng)收起,ScrollView也不會(huì)捕捉點(diǎn)擊事件,但子組件可以捕獲。
  • 'handled',當(dāng)點(diǎn)擊事件被子組件捕獲時(shí),鍵盤不會(huì)自動(dòng)收起。這樣切換TextInput時(shí)鍵盤可以保持狀態(tài)。多數(shù)帶有TextInput的情況下你應(yīng)該選擇此項(xiàng)。
  • false,已過(guò)期,請(qǐng)使用'never'代替。
  • true,已過(guò)期,請(qǐng)使用'always'代替。

onContentSizeChange此函數(shù)會(huì)在ScrollView內(nèi)部可滾動(dòng)內(nèi)容的視圖發(fā)生變化時(shí)調(diào)用。
onMomentumScrollBegin滾動(dòng)動(dòng)畫開始時(shí)調(diào)用此函數(shù)。
onMomentumScrollEnd滾動(dòng)動(dòng)畫結(jié)束時(shí)調(diào)用此函數(shù)。
onScroll在滾動(dòng)的過(guò)程中,每幀最多調(diào)用一次此回調(diào)函數(shù)。調(diào)用的頻率可以用scrollEventThrottle屬性來(lái)控制。
onScrollBeginDrag當(dāng)用戶開始拖動(dòng)此視圖時(shí)調(diào)用此函數(shù)。
onScrollEndDrag當(dāng)用戶停止拖動(dòng)此視圖時(shí)調(diào)用此函數(shù)。
pagingEnabled當(dāng)值為true時(shí),滾動(dòng)條會(huì)停在滾動(dòng)視圖的尺寸的整數(shù)倍位置。這個(gè)可以用在水平分頁(yè)上。默認(rèn)值為false。
注意:垂直分頁(yè)在Android上不支持。
refreshControl指定RefreshControl組件,用于為ScrollView提供下拉刷新功能。只能用于垂直視圖,即horizontal不能為true。
removeClippedSubviews當(dāng)此屬性為true時(shí),屏幕之外的子視圖(子視圖的overflow樣式需要設(shè)為hidden)會(huì)被移除。這個(gè)可以提升大列表的滾動(dòng)性能。默認(rèn)值為true。
scrollEnabled當(dāng)值為false的時(shí)候,內(nèi)容不能滾動(dòng),默認(rèn)值為true。
showsHorizontalScrollIndicator當(dāng)此屬性為true的時(shí)候,顯示一個(gè)水平方向的滾動(dòng)條。
showsVerticalScrollIndicator當(dāng)此屬性為true的時(shí)候,顯示一個(gè)垂直方向的滾動(dòng)條。
stickyHeaderIndices一個(gè)子視圖下標(biāo)的數(shù)組,用于決定哪些成員會(huì)在滾動(dòng)之后固定在屏幕頂端。舉個(gè)例子,傳遞stickyHeaderIndices={[0]}會(huì)讓第一個(gè)成員固定在滾動(dòng)視圖頂端。這個(gè)屬性不能和horizontal={true}一起使用。
horizontal當(dāng)此屬性為true的時(shí)候,所有的子視圖會(huì)在水平方向上排成一行,而不是默認(rèn)的在垂直方向上排成一列。默認(rèn)值為false。
decelerationRate
snapToAlignment當(dāng)設(shè)置了snapToInterval,snapToAlignment會(huì)定義停駐點(diǎn)與滾動(dòng)視圖之間的關(guān)系。

  • 'start' (默認(rèn)) 會(huì)將停駐點(diǎn)對(duì)齊在左側(cè)(水平)或頂部(垂直)
  • 'center' 會(huì)將停駐點(diǎn)對(duì)齊到中間
  • 'end' 會(huì)將停駐點(diǎn)對(duì)齊到右側(cè)(水平)或底部(垂直)
    snapToInterval當(dāng)設(shè)置了此屬性時(shí),會(huì)讓滾動(dòng)視圖滾動(dòng)停止后,停止在snapToInterval的倍數(shù)的位置。這可以在一些子視圖比滾動(dòng)視圖本身小的時(shí)候用于實(shí)現(xiàn)分頁(yè)顯示。需要與snapToAlignment組合使用。
    以下針對(duì)平臺(tái)android:
    endFillColor有時(shí)候滾動(dòng)視圖會(huì)占據(jù)比實(shí)際內(nèi)容更多的空間。這種情況下可以使用此屬性,指定以某種顏色來(lái)填充多余的空間,以避免設(shè)置背景和創(chuàng)建不必要的繪制開銷。一般情況下并不需要這種高級(jí)優(yōu)化技巧。
    overScrollMode覆蓋默認(rèn)的overScroll模式
    可選的值有:
  • 'auto' - 默認(rèn)值,允許用戶在內(nèi)容超出視圖高度之后可以滾動(dòng)視圖。
  • 'always' - 無(wú)論內(nèi)容尺寸,用戶始終可以滾動(dòng)視圖。
  • 'never' - 始終不允許用戶滾動(dòng)視圖。
    nestedScrollEnabled在Android API level 21(5.0)以上啟用嵌套滾動(dòng)。iOS上默認(rèn)支持嵌套滾動(dòng)。
    以下針對(duì)平臺(tái)ios:
    alwaysBounceHorizontal當(dāng)此屬性為true時(shí),水平方向即使內(nèi)容比滾動(dòng)視圖本身還要小,也可以彈性地拉動(dòng)一截。當(dāng)horizontal={true}時(shí)默認(rèn)值為true,否則為false。
    automaticallyAdjustContentInsets當(dāng)滾動(dòng)視圖放在一個(gè)導(dǎo)航條或者工具條后面的時(shí)候,iOS系統(tǒng)是否要自動(dòng)調(diào)整內(nèi)容的范圍。默認(rèn)值為true。(譯注:如果你的ScrollView或FlatList的頭部出現(xiàn)莫名其妙的空白,嘗試將此屬性置為false)
    bounces當(dāng)值為true時(shí),如果內(nèi)容范圍比滾動(dòng)視圖本身大,在到達(dá)內(nèi)容末尾的時(shí)候,可以彈性地拉動(dòng)一截。如果為false,尾部的所有彈性都會(huì)被禁用,即使alwaysBounce屬性為true。默認(rèn)值為true。
    bouncesZoom當(dāng)值為true時(shí),使用手勢(shì)縮放內(nèi)容可以超過(guò)min/max的限制,然后在手指抬起之后彈回min/max的縮放比例。否則的話,縮放不能超過(guò)限制。
    canCancelContentTouches當(dāng)值為false時(shí),一旦有子節(jié)點(diǎn)響應(yīng)觸摸操作,即使手指開始移動(dòng)也不會(huì)拖動(dòng)滾動(dòng)視圖。默認(rèn)值為true(在以上情況下可以拖動(dòng)滾動(dòng)視圖)。
    centerContent當(dāng)值為true時(shí),如果滾動(dòng)視圖的內(nèi)容比視圖本身小,則會(huì)自動(dòng)把內(nèi)容居中放置。當(dāng)內(nèi)容比滾動(dòng)視圖大的時(shí)候,此屬性沒(méi)有作用。默認(rèn)值為false。
    contentInset內(nèi)容范圍相對(duì)滾動(dòng)視圖邊緣的坐標(biāo)。默認(rèn)為{top: 0, left: 0, bottom: 0, right: 0}。
    contentInsetAdjustmentBehavior
    contentOffset用來(lái)手動(dòng)設(shè)置初始的滾動(dòng)坐標(biāo)。默認(rèn)值為{x: 0, y: 0}。
    directionalLockEnabled當(dāng)值為真時(shí),滾動(dòng)視圖在拖拽的時(shí)候會(huì)鎖定只有垂直或水平方向可以滾動(dòng)。默認(rèn)值為false
    indicatorStyle設(shè)置滾動(dòng)條的樣式。
    maximumZoomScale允許的最大縮放比例。默認(rèn)值為1.0。
    minimumZoomScale允許的最小縮放比例。默認(rèn)值為1.0。
    pinchGestureEnabled設(shè)置為true時(shí),ScrollView會(huì)允許用戶使用雙指縮放操作。默認(rèn)值為true。
    scrollEventThrottle這個(gè)屬性控制在滾動(dòng)過(guò)程中,scroll事件被調(diào)用的頻率(單位是每秒事件數(shù)量)。更小的數(shù)值能夠更及時(shí)的跟蹤滾動(dòng)位置,不過(guò)可能會(huì)帶來(lái)性能問(wèn)題,因?yàn)楦嗟男畔?huì)通過(guò)bridge傳遞。由于JS事件循環(huán)需要和屏幕刷新率同步,因此設(shè)置1-16之間的數(shù)值不會(huì)有實(shí)質(zhì)區(qū)別。默認(rèn)值為0,意味著每次視圖被滾動(dòng),scroll事件只會(huì)被調(diào)用一次。
    scrollIndicatorInsets決定滾動(dòng)條距離視圖邊緣的坐標(biāo)。這個(gè)值應(yīng)該和contentInset一樣。默認(rèn)值為{0, 0, 0, 0}。
    scrollsToTop當(dāng)此值為true時(shí),點(diǎn)擊狀態(tài)欄的時(shí)候視圖會(huì)滾動(dòng)到頂部。默認(rèn)值為true。
    zoomScale
    alwaysBounceVertical
    方法:
  • scrollTo() 用法:scrollTo(([y]: number), object, ([x]: number), ([animated]: boolean));滾動(dòng)到指定的x, y偏移處。第三個(gè)參數(shù)為是否啟用平滑滾動(dòng)動(dòng)畫。
    比如:scrollTo({x: 0, y: 0, animated: true})
  • scrollToEnd() 用法:scrollToEnd(([options]: object));滾動(dòng)到視圖底部(水平方向的視圖則滾動(dòng)到最右邊)。
    加上動(dòng)畫參數(shù)scrollToEnd({animated: true})則啟用平滑滾動(dòng)動(dòng)畫,或是調(diào)用scrollToEnd({animated: false})來(lái)立即跳轉(zhuǎn)。如果不使用參數(shù),則animated選項(xiàng)默認(rèn)啟用。

12.StatusBar組件:[控制應(yīng)用狀態(tài)欄的組件。]
屬性:
animated指定狀態(tài)欄的變化是否應(yīng)以動(dòng)畫形式呈現(xiàn)。目前支持這幾種樣式:backgroundColor, barStyle和hidden。
barStyle設(shè)置狀態(tài)欄文本的顏色。
hidden是否隱藏狀態(tài)欄。
[只適用于android]
backgroundColor狀態(tài)欄的背景色。
translucent指定狀態(tài)欄是否透明。設(shè)置為true時(shí),應(yīng)用會(huì)延伸到狀態(tài)欄之下繪制(即所謂“沉浸式”——被狀態(tài)欄遮住一部分)。常和帶有半透明背景色的狀態(tài)欄搭配使用。
[只適用ios]
networkActivityIndicatorVisible指定是否顯示網(wǎng)絡(luò)活動(dòng)提示符。
showHideTransition通過(guò)hidden屬性來(lái)顯示或隱藏狀態(tài)欄時(shí)所使用的動(dòng)畫效果。默認(rèn)值為'fade'。
方法:

  • setHidden()
    用法:static setHidden(hidden: boolean, [animation]: StatusBarAnimation)
  • setBarStyle()
    用法:static setBarStyle(style: StatusBarStyle, [animated]: boolean)
  • setNetworkActivityIndicatorVisible()
    用法:static setNetworkActivityIndicatorVisible(visible: boolean)
  • setBackgroundColor()
    用法:static setBackgroundColor(color: string, [animated]: boolean)
  • setTranslucent()
    用法:static setTranslucent(translucent: boolean)
    栗子:
    <StatusBar animated={true} barStyle='dark-content' hidden={true}/>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容