關於RN第一個項目完畢的總結


首先,大概描述一下用到的框架:react-navigation(類似於ios中TabbarVC),Fetch(網絡獲取工具),Platform(平台判斷-ios、安卓等),Dimensions(獲取屏幕寬高-布局時常用到)等。下面會對這些框架或多或少的做一些講解,主要是一些我遇到的問題的收集。

1.react-navigation

在移動開發中,我們常常需要設定每一個頁面的標題和左右按鈕,這個在原生開發中很容易的實現,對於一個接觸RN不久的開發者來說還是有難度的,這個框架有一些弊病我前面的博客有提到,也有解決方案,這里不多做贅述。

a.標題設置(屬性:title或headerTitle)

這里多說一句,react-navigation上導航欄的屬性設置都是通過一個屬性來的——navigationOptions,你只需要設置它就可以了,拿標題舉例如下,其余的添加到屬性里面就好。

static navigationOptions = ({ navigation, state }) => ({
  // head導航欄
  // title:<Text style={headerStyle.titlestyle}>我的標題</Text>,
  headerTitle: '我的標題',
  headerTitleStyle: {  //標題樣式,與headerTitle結合使用
  alignSelf: 'center',
  fontSize: 24,
  lineHeight: 35
  },
}
如上,標題的設置有兩種方式,一種根據你的需要自定義,如上title(道理上來說可以為任意組件,未做驗證),或者用第二種,自帶默認的headerTitle,通過headerTieleStyle設置樣式,這里主要說下在做適配的時候有些問題要注意:ios上的顯示問題不大,但是如果適配安卓需要左右兩邊都添加按鈕或者都不添加,這樣子標題才會居中,只有一個的另一端可以添加一個<View/>做占位用。
b.設置左按鈕(屬性:headerLeft)
對於原生開發而言,這個是手到擒來的,樣式設置也比較簡單,但是RN好像並沒有太多的可設定變更,可能跟要適配兩端有關系吧,這里最好的設置就是重新定制左按鈕,通過TouchableOpacity(RN中的點擊事件)吧,如下
static navigationOptions = ({ navigation, state }) => ({
headerLeft: (
<TouchableOpacity onPress={() => {
  navigation.goBack();
}>
<Image source={require('../../../../Resource/iosImg/left.png')} style={{ marginLeft: 5 }} //可以為任意顯示組件
resizeMode="center"
/>
</TouchableOpacity>
),
}
這里注意一點,如果要隱藏導航欄直接設置header:null,但是 必須重寫navigationOptions屬性的headerLeft方法,不然的話沒辦法調用goback或navigate等系列方法,親測案例,希望大家不要在這繞太久。
c.設置右按鈕(屬性:headerRight)
在原生開發中,左右按鈕的設定沒有什么本質上的區別,但是RN中區別有點大,主要是在於你要執行的事件,左按鈕一半情況下只需要返回上一級,它用到的事件對象navigation可以通過屬性拿到,如上b點,但是右按鈕可能會有其他事件,左按鈕的其他事件同理,相對比較少就在一起說了, 實現其他點擊事件分3步走,如下:
(1)寫法通b點,注意點擊事件的寫法,先判斷navigation.state.params是否存在,存在就調用旗下子方法navigatePress,否則為null
headerRight: (
<TouchableOpacity style={{ top: 0, right: 0, height: 20, width: 35 }} onPress={navigation.state.params ? navigation.state.params.navigatePress : null}>
<Image source={require('../../../../../Resource/iosImg/more.png')} style={{ width: 20, height: 20 }} />
</TouchableOpacity>
)
(2)實現子方法
//右按鈕相應事件
navigatePress = () => {
  this.setState({
    isshow: true //改變狀態,渲染組件
  })
}
(3)組件加載完成,重設props,定義子方法
componentDidMount() {
  // 組件渲染之后重設props
  this.props.navigation.setParams({
    title: '自定義Header',
    navigatePress: this.navigatePress
  })
}
2.刷新界面
我用到的有兩種,一個是setState()——異步刷新,寧外一個是this.forceUpdate()——同步刷新,親身經歷表示一定要結合使用,不然會有可能造成modal隱藏失敗,換句話說就是,頁面先跳轉,但是異步的模態還沒有執行,這樣子會導致modal的顯隱有問題,這種時候用this.forceUpdate()就可以避免這種情況。
3.適配安卓
對於初學者這是個比較棘手的問題,因為我是ios開發出家的,所以先是ios開發,然后安卓適配,其中一點前文已經提到,需要同時設置或不設左右按鈕,標題才能居中,還有一點比較重要也是造成布局差異的元凶,就是TouchableOpacity組件,在ios中不論你設置組件的樣式在TouchableOpacity或者其他內組件都可以正常顯示,但是在安卓中TouchableOpacity的優先級好像要高點,如果你不在TouchableOpacity中設置樣式就對出現一系列問題,所以建議在TouchableOpacity中設置精確樣式,在內組件中只設置寬高即可,顯示靈活多變,老鐵們各自珍重。
4.約束ScrollView\FlatList\ListView(建議放棄,使用FlatList更簡便,性能更好)
這些組件的高度好像不能通過自身的樣式進行限定,所以我們需要借助外力,外層加一個<View></View>,設置view的高度即可,這樣子便可以隨意設定高度。
5.Modal(可以實現菊花效果)
RN中的彈窗圖層,不能通過Alert點擊事件改變其狀態,親測好想沒什么用,就放棄了Alert組件,彈窗基本用modal完成,其方式簡單,但是每個界面都用的話需要每個頁面布局,所以還是比較煩的,用之前最好考慮好需要用到的彈窗(模態),設定好屬性再開工。用法參考官方文檔。
6.TextInput組件焦點問題
默認情況下,其焦點是在上下居中,靠左,大部分情況我們需要焦點停留在左上角初始狀態,大概查了些資料,說到的很少,這里提一下,代碼如下:
<TextInput
multiline={true}
textAlign='left' //初始焦點居左
textAlignVertical='top'//初始焦點靠頂部
placeholder="占位文字"
onChangeText={(text)=>this.setState{text}} //可以不用text,自己另外設定一個屬性即可
placeholderTextColor='gray'
// editable={this.props.isEidt}
style={[styles.textStyle, { borderWidth: 0.5, borderColor: '#FAFAFA', top: this.props.top, }]} />
暫且至此,后記慢補。不喜忽噴,謝謝。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM