最近在開發RN時遇到這樣一種狀況,頁面上方有個數字類型的輸入框(keyboardType="numeric"),點開以後把頁面底部的提交按鈕給遮蔽了,可是IOS的數字鍵盤沒有收縮功能,致使一點開就沒法進行操做了,如圖:html
所以須要在用戶點擊空白處時把鍵盤隱藏,能夠使用以下的方法:react
const dismissKeyboard = require('dismissKeyboard') export default class Demo extends Component { render() { return ( <TouchableWithoutFeedback onPress={dismissKeyboard}> <View style={{flex:1}}> //some components like TextInput </View> </TouchableWithoutFeedback> ) } }
但每次都須要麻煩地引入dismissKeyboard和TouchableWithoutFeedback組件,所以想到了用高階組件的實現方式:app
const dismissKeyboard = require('dismissKeyboard') export default (WrappedComponent) => class AutoHideKeyboard extends Component { render() { return ( <TouchableWithoutFeedback style={{flex:1}} onPress={dismissKeyboard}> <View style={{flex:1}}> <WrappedComponent {...this.props}/> </View> </TouchableWithoutFeedback> ) } }
注意:即便你的WrappedComponent是一個用View包裹的組件,也得在TouchableWithoutFeedBack中再包一層View,纔不會致使找不到setNativeProps的錯誤,詳見:http://reactnative.cn/docs/0.40/direct-manipulation.html#contentide
這樣子就完成一個簡單的高階組件了。函數
使用方式有兩種:flex
1.函數式ui
class FindPw extends Component { //...... } export default AutoHideKeyboard(FindPw)
2.decorator(裝飾器)this
@AutoHideKeyboard class FindPw extends Component { //...... } export default FindPw
建議使用第二種,能夠保證在之後疊加多個高階組件時,不會出現 export defalut A(B(C(...)))這種難以解讀的形式code