React Native
有點大勢所趨,因此前段時間研究了下它,看了它的官方文檔同時也在Github
瀏覽了前輩們的傑做,因此本身也寫了一個簡單的Demo
也算是一個好的入門。配合官方文檔與代碼實例相信都能很快的進入React Native
的世界。下面我介紹的不會很詳細,是針對React Native
語法有必定會基礎的同窗。css
這裏簡單的介紹下React Native
html
FaceBook
現有的輪子,它能夠實現對ISO
和Android
兩大平臺的支持React.js
來操做原生的UI
組件,替代了DOM
元素UI
方面,提供了Flexbox
的佈局,同時也支持css-layout
樣式JSX
來轉換成JS
來執行,JSX
是一種相似於XML
語法的腳步擴展語言。對於React Native
的環境搭建,能夠參考官方文檔Getting Started,若是英文很差的別急,這裏還有中文版的Getting Startedreact
推薦使用英文版的,中文版的仍是存在坑,下面簡單的介紹下Demo中用到的組件
這是一個導航器,直白的理解就是實現界面之間的跳轉,在React Native
中藉助它能很好的實現界面的切換。實現它須要實現幾個必要的方法。git
<Navigator initialRoute={{title: '主頁', component: Welcome}} configureScene={(route,routeStack) => Navigator.SceneConfigs.FloatFromLeft} renderScene={this.renderScene}/>
Navigator
都是由route
來控制跳轉路線的,因此開始使用時要初始化route
github
initialRoute={{title: '主頁', component: Welcome}}
裏面的參數名不受限制,可是你必需要指明跳轉的Componnet
組件名,方便在後續執行中取出。能夠經過route.component
取出。react-native
該配置就是執行沒一個route
的具體實現,從而渲染出來,它提供兩個內置參數route
與navigator
,來方便渲染佈局
renderScene={this.renderScene}
renderScene(route, navigator){ _navigator = navigator; let DefaultComponet = route.component; return <DefaultComponet route = {route} navigator = {navigator}/> }
在renderScene
中咱們取出每次要導航的Component
,同時渲染出來,而且把route
與navigator
傳到渲染的界面中。在渲染界面能夠經過this.props.rout
與this.props.navigator
來獲取。最後一步就是要綁定事件flex
this.renderScene = this.renderScene.bind(this);
不懂props的能夠本身查閱官方文檔
Navigator
提供了push
與pop
方法來控制route
的路線,至關於咱們熟知的棧。經過push
來設置下一個導航的route
,經過pop
來退出該界面返回原來的界面。ui
<TouchableOpacity onPress={() => this.props.navigator.push({ title: '詳情', component: Detail, number: rowID, })}> <View style={styles.item}> <View style={styles.content}> <Text style={styles.des}> {rowData.title} </Text> .... </View> </TouchableOpacity>
TouchableOpacity
是一個點擊監聽組件,能夠綁定點擊事件。this
<TouchableOpacity onPress={() => this.props.navigator.pop()}> <Image source={require('../imgs/back.png')} style={styles.back}/> </TouchableOpacity>
在點擊之後渲染出來的界面中調用pop
方法退出該渲染.
是否是感受很親切,它要實現的功能跟Android
中是同樣的。可是使用方法就不一樣了哦。不過總體須要的數據原理仍是相似。無非也要整個的數據源,與綁定沒個Item
的數據。
在渲染以前要設置判斷該數據是否須要重新渲染,這樣就減小許多沒必要要的渲染步驟,該方法能幫助咱們進行判斷。
const listView = new ListView.DataSource({ rowHasChanged: (r1,r2) => r1!==r2});
爲listView
初始化數據源,能夠經過state
狀態來進行保存。
this.state={ dataSource: listView.cloneWithRows(this._rowData())}; }
最後在渲染render()
生命週期方法中進行組件資源綁定:
<ListView style={styles.container} dataSource={this.state.dataSource} renderRow={this._renderRow.bind(this)}/> </View>
其中dataSource
與renderRow
是兩個必要的方法,前一個是綁定數據源,後一個是綁定渲染的每一行的數據。其中_renderRow
是Item
的佈局。
_renderRow(rowData,sectionID,rowID,highlightRow){ return( <TouchableOpacity onPress={() => this.props.navigator.push({ title: '詳情', component: Detail, number: rowID, })}> <View style={styles.item}> <View style={styles.content}> <Text style={styles.des}> {rowData.title} </Text> <View style={styles.bottom}> <Text style={styles.fb}> {"發佈: "+rowData.fb} </Text> <Text style={styles.data}> {"日期: "+rowData.data} </Text> </View> </View> <Image style={styles.image} source={{uri: rowData.image}}/> </View> </TouchableOpacity> ); }
renderRow
提供了四個參數rowData,sectionID,rowID,highlightRow
這裏主要是利用rowData
來獲取數據源。佈局樣式是使用css-layout
來實現,能夠直接在組件是使用
style={{flex: 1}}
或者經過StyleSheet
來統一建立:
const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#F5FCFF', }, title: { backgroundColor: 'royalblue', justifyContent: 'center', alignItems: 'center', borderColor: 'gray', borderBottomWidth: 1, }, ... });
css這裏很少說,本身能夠參考官方文檔
這裏再簡單介紹下TabNavigator
這是一個相似於Android
中的FragmentTabHost
。相信都知道它的功能是什麼了。
<TabNavigator> <TabNavigator.Item title="新聞" selected={this.state.selectedTab==='news'} selectedTitleStyle={styles.selectedText} titleStyle={styles.text} renderIcon={() => <Image source={require('../imgs/ic_news.png')} style={styles.image}/>} renderSelectedIcon={() => <Image source={require('../imgs/ic_news_pressed.png')} style={styles.image}/>} onPress={() => this.setState({selectedTab: 'news'})}> <News {...this.props}/> </TabNavigator.Item> ... </TabNavigator>
經過<TabNavigator.Item>
子標籤來設置每個底部Item
,在其中在設置該Item
要渲染的界面,上面的News
就是要渲染的界面,該界面能夠經過export default News
導出,import News from './News'
導入。
先就介紹到這裏,若是還有須要能夠下載源碼,後續還會繼續再作擴展
項目地址:https://github.com/idisfkj/RN...
我的blog:https://idisfkj.github.io