ReactNative之基本元件02
- 原文部落格:ReactNative相關文章
- 之前的文章只是記錄了一些常用的元件, 現在記錄一些偶爾會用到的一些元件
Slider
Slider
用於選擇一個範圍值的元件
相關屬性
// 滑塊的初始值。這個值應該在最小值和最大值之間,預設值是0 value={4} // 滑塊的最小值(當滑塊滑到最左側時表示的值),預設為0 minimumValue={1} // 滑塊的最大值(當滑塊滑到最右端時表示的值),預設為1 maximumValue={10} // 滑塊的最小步長,這個值應該在0到(最大值-最小值)之間,預設值為0 step={2} // 滑塊左側軌道的顏色。在iOS上預設為一個藍色的漸變色 // ios:滑塊右側區域的顏色。android:滑塊左側區域的顏色 minimumTrackTintColor={'red'} // ios:滑塊左側區域的顏色。android:滑塊右側區域的顏色 minimumTrackTintColor={'yellow'}
僅IOS支援:
// 給滑塊設定一張圖片,只支援靜態圖片 thumbImage={require('./image/slider.png')} // 給軌道設定一張背景圖。只支援靜態圖片。圖片最中央的畫素會被平鋪直至填滿軌道 trackImage={require('./image/slider1.png')} // 指定一個滑塊左側軌道背景圖,僅支援靜態圖片。圖片最右邊的畫素會被平鋪直至填滿軌道 minimumTrackImage={require('./image/left.png')} // 指定一個滑塊右側軌道背景圖,僅支援靜態圖片。圖片最左邊的畫素會被平鋪直至填滿軌道 maximumTrackImage={require('./image/right.png')}
僅android支援
// 滑塊顏色 thumbTintColor={'orange'}
相關函式
// 使用者鬆開滑塊的時候呼叫此回撥,無論值是否變化。回撥值為當前值 onSlidingComplete={() => {}} 在使用者拖動滑塊的過程中不斷呼叫此回撥 onValueChange={() => {}}
StatusBar
- 控制應用狀態列的元件
- 由於StatusBar可以在任意檢視中載入,且後加載的設定會覆蓋先前的設定。因此在配合導航器使用時,請務必考慮清楚StatusBar的放置順序
- 有些場景並不適合使用元件,因此StatusBar也暴露了一個靜態API。然而不推薦大家同時通過靜態API和元件來定義相同的屬性,因為靜態API定義的屬性值在後續的渲染中會被元件中定義的值所覆蓋
相關屬性介紹
通用屬性
// 指定狀態列的變化是否應以動畫形式呈現。目前支援這幾種樣式:backgroundColor, barStyle和hidden animated bool // 是否隱藏狀態列 hidden bool
僅支援iOS
// 設定狀態列文字的顏色, 可選值: enum('default', 'light-content', 'dark-content') barStyle={'light-content'} // 設定網路活動指示器(就是那個菊花)是否顯示在狀態列 networkActivityIndicatorVisible={true} // 通過 hidden 屬性來顯示或隱藏狀態列時所使用的動畫效果,有兩種選擇:fade(預設值)、slide showHideTransition={'fade'}
僅支援Android
// Android 裝置上狀態列的背景顏色 backgroundColor={'blue'}
translucent
true
translucent={true}
currentHeight
-
React Native
在Android
平臺為StatusBar
元件提供了一個靜態常量currentHeight
,我們可以通過讀取這個常量來得到Android
手機狀態列的高度。 - 注意:
currentHeight
不是一個屬性,我們直接訪問StatusBar.currentHeight
就可以了
Alert
- 啟動一個提示對話方塊,包含對應的標題和資訊。
- 預設情況下,對話方塊會僅有一個’確定’按鈕
- 在 iOS 上你可以指定任意數量的按鈕。每個按鈕還都可以指定自己的樣式,此外還可以指定提示的類別
- 在 Android 上
- 最多能指定三個按鈕,這三個按鈕分別具有“中間態”、“消極態”和“積極態”的概念:
- 如果你只指定一個按鈕,則它具有“積極態”的屬性(比如“確定”);兩個按鈕,則分別是“消極態”和“積極態”(比如“取消”和“確定”);三個按鈕則意味著“中間態”、“消極態”和“積極態”(比如“稍候再說”,“取消”,“確定”)
- 預設情況下點選提示框的外面會自動取消提示框
{ onDismiss: () => {} } { cancelable: false }
alert()
// 顯示彈窗的方法 static alert(title, message?, buttons?, options?, type?) // 顯示彈窗 _shwoAlert() { Alert.alert( '標題', '彈窗提示資訊', [ {text: '稍後再說', onPress: () => console.log('稍後再說'), style: 'default'}, {text: '取消', onPress: () => console.log('取消'), style: 'cancel'}, {text: '確定', onPress: () => console.log('確定'), style: 'destructive'} ], { cancelable: false } ) }
按鈕樣式
value |
說明 |
---|---|
default |
預設 |
cancel |
取消樣式 |
destructive |
紅色確定樣式 |
BackHandler
-
Android
:監聽後退按鈕事件。如果沒有新增任何監聽函式,或者所有的監聽函式都返回false
,則會執行預設行為,退出應用 -
tvOS
(即Apple TV
機頂盒):監聽遙控器上的後退按鈕事件(阻止應用退出的功能尚未實現) -
iOS
:尚無作用 - 注意: 監聽函式是按倒序的順序執行(即後新增的函式先執行)。如果某一個函式返回 true,則後續的函式都不會被呼叫
componentDidMount() { // 新增監聽 BackHandler.addEventListener('hardwareBackPress', this.handleBackPress); } componentWillUnmount() { // 移除監聽 BackHandler.removeEventListener('hardwareBackPress', this.handleBackPress); } handleBackPress = () => { this.goBack(); return true; } // 退出當前應用 static exitApp()
Clipboard
Clipboard
元件可以在 iOS
和 Android
的剪貼簿中讀寫內容
static getString() // 獲取剪貼簿的文字內容。返回一個Promise,然後你可以用下面的方式來讀取剪貼簿內容。 async _getContent() { var content = await Clipboard.getString(); } static setString(content) // 設定剪貼簿的文字內容,然後你可以用下面的方式來設定剪貼簿內容。 _setContent() { Clipboard.setString('hello world'); }
InteractionManager
-
InteractionManager
可以將一些耗時較長的工作安排到所有互動或動畫完成之後再進行。這樣可以保證JavaScript
動畫的流暢執行。比如Navigator
的轉場動畫 - 對大多數
React Native
應用來說,業務邏輯是執行在JavaScript
執行緒上的。這是React
應用所在的執行緒,也是發生API
呼叫,以及處理觸控事件等操作的執行緒 - 如果你正在
JavaScript
執行緒處理一個跨越多個幀的工作,你可能會注意到TouchableOpacity
的響應被延遲了。這是因為JavaScript
執行緒太忙了,不能夠處理主執行緒傳送過來的原始觸控事件
屬性方法
// 靜態方法,在使用者互動和動畫結束以後執行任務, 返回一個可取消的 promise runAfterInteractions(task) // 靜態方法,建立一個控制代碼(處理器),通知管理器,某個動畫或者互動開始了 createInteractionHandle() // 靜態方法,進行清除控制代碼,通知管理器,某個動畫或者互動結束了。 clearInteractionHandle(handler:Handle) // 設定延遲時間,該會呼叫setTimeout方法掛起並且阻塞所有沒有完成的任務,然後在eventLoopRunningTime到設定的延遲時間後,然後執行setImmediate方法進行批量執行任務 setDeadline(deadline:number) // 事件 Events:CallExpression // 監聽 addListener:CallExpression
這裡最常使用的就是 runAfterInteractions
方法
InteractionManager.runAfterInteractions(() => { navigator.push({ component: MainPager, name: 'MainPager' }) }) // 或者設定state componentDidMount() { InteractionManager.runAfterInteractions(() => { this.setState({renderPlaceholderOnly: false}); }); }
Keyboard
Keyboard
相關方法
//用來載入一個指定事件的事件監聽器 static addListener(eventName, callback) //移除某個型別事件的監聽函式 static removeListener(eventName, callback) //移除某個型別事件的所有監聽函式 static removeAllListeners(eventName) //把彈出的鍵盤收回去,同時使當前的文字框失去焦點 static dismiss()
eventName
上述函式中的 eventName
可以是如下值
-
keyboardWillShow
:軟鍵盤將要顯示 -
keyboardDidShow
:軟鍵盤顯示完畢 -
keyboardWillHide
:軟鍵盤將要收起 -
keyboardDidHide
:軟鍵盤收起完畢 -
keyboardWillChangeFrame
:軟體盤的frame
將要改變 -
keyboardDidChangeFrame
:軟體盤的frame
改變完畢
event 引數值
所有的鍵盤事件處理函式都能收到一個 event
引數,不過在不同平臺下 event
引數可以取到的值不太一樣
Android平臺
event.endCoordinates.screenX event.endCoordinates.screenY event.endCoordinates.width event.endCoordinates.height
iOS平臺
-
event.easing
:這個值始終是keyboard
-
evnet.duration
:記錄軟鍵盤彈出動畫的持續事件,單位是毫秒 -
event.startCoordinates.screenX
-
event.startCoordinates.screenY
-
event.startCoordinates.width
-
event.startCoordinates.height
-
event.endCoordinates.screenX
-
event.endCoordinates.screenY
-
event.endCoordinates.width
-
event.endCoordinates.height
componentWillMount() { // 監聽鍵盤彈出時間 this.keyboardShow = Keyboard.addListener('keyboardWillShow', this._keyboardDidShow) } componentWillUnmount() { this.keyboardShow.remove() } _keyboardDidShow = (event) => { console.log(event) }