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