React Native系列之-组件初入门
来源:互联网 发布:淘宝直通车要什么条件 编辑:程序博客网 时间:2024/05/20 07:33
我们先看下官网上的组件一栏,见图:
,
这是目前官网上放出来的组件,可以看到,分为3种
- 以IOS结尾的,IOS的组件
- 以Android结尾的,Android的组件,
不以Android或IOS结尾的,公共组件。
接下来我们以Image+ListView为例,对应Android中的ImageView+ListView。(例子是官方的例子)
/** * Sample React Native App * https://github.com/facebook/react-native */'use strict';var React = require('react-native');var { AppRegistry, StyleSheet, Text, Image, View,} = React;var MOCKED_MOVIES_DATA = [ { title:'Title', year:'2015', posters:{ thumbnail:'http://i.imgur.com/UePbdph.jpg' } },];var text = React.createClass({ render: function() { var movie=MOCKED_MOVIES_DATA[0]; return ( <View style={styles.container}> <Image source={{uri:movie.posters.thumbnail}} style={styles.thumbnail}> </Image> <View style={styles.rightContainer}> <Text style={styles.title}>{movie.title}</Text> <Text style={styles.year}>{movie.year}</Text> </View> </View> ); }});var styles = StyleSheet.create({ container: { flex: 1, flexDirection:'row', justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF', }, thumbnail:{ width:53, height:81, }, rightContainer:{ flex:1, }, title:{ fontSize:20, marginBottom:8, textAlign:'center', }, year:{ textAlign:'center' },});AppRegistry.registerComponent('text', () => text);
我们先看下组件text的结构:
其实和我们用XML写布局是一样的。关于CSS属性,这里基本和网页那边是一样的(有些-可能被去掉了),具体的CSS属性请参考CSS标准属性,我又仔细地看了下,发现CSS标准属性中带-的,在React.js中,去掉-,并将-后的第一个字符大写。
看看上面代码的效果图。
。
接下来,我们就将ListView加进去。先上张效果图勾引勾引大家。
接下来看看代码。首先嘛,肯定得先将ListView加进来,然后我们看数据的获取。
var API_KEY='7waqfqbprs7pajbz28mqf6vz';var API_URL='http://api.rottentomatoes.com/api/public/v1.0/lists/movies/in_theaters.json';var PAGE_SIZE=50;var PARAMS='?apikey=' + API_KEY + '&page_limit=' + PAGE_SIZE;var REQUEST_URL=API_URL+PARAMS;
这里是拼接请求字符串,官方是25条,我这里是50条。
fetchData:function(){ fetch(REQUEST_URL) .then((response)=>response.json()) .then((responseData)=>{ this.setState({ dataSource:this.state.dataSource.cloneWithRows(responseData.movies), loaded:true, }); }) .done(); },
这里就是将数据获取下来,关于Fetch API,参考Fetch API.
我们看一眼原始数据,见图:
就是一堆的json数据。上面的代码,把movies对应的json数组给了我们初始化的dataSource,这个dataSource是什么呢?
getInitialState:function(){ return { dataSource:new ListView.DataSource({rowHasChanged:(row1,row2)=>row1 !==row2,}), loaded:false, }; },
恩,就是listview对应的数据。接下来我们看返回的视图是啥样子的。
render: function() { if (!this.state.loaded) { return this.renderLoadingView(); } return ( <ListView dataSource={this.state.dataSource} renderRow={this.renderMovie} style={styles.listview} > </ListView> ); }, renderLoadingView:function(){ return ( <View style={styles.container}> <Text> Loading movies... </Text> </View> ); }, renderMovie:function(movie){ return ( <View style={styles.container}> <Image source={{uri:movie.posters.thumbnail}} style={styles.thumbnail}> </Image> <View style={styles.rightContainer}> <Text style={styles.title}>{movie.title}</Text> <Text style={styles.year}>{movie.year}</Text> </View> </View> ); },
分两种,加载的时候和加载完毕。renderMovie是讲数据解析成一条一条的数据显示。多的就不说了,最后来下完整的代码
/** * Sample React Native App * https://github.com/facebook/react-native */'use strict';var React = require('react-native');var { AppRegistry, StyleSheet, Text, Image, ListView, View,} = React;var MOCKED_MOVIES_DATA = [ { title:'Title', year:'2015', posters:{ thumbnail:'http://i.imgur.com/UePbdph.jpg' } },];var API_KEY='7waqfqbprs7pajbz28mqf6vz';var API_URL='http://api.rottentomatoes.com/api/public/v1.0/lists/movies/in_theaters.json';var PAGE_SIZE=50;var PARAMS='?apikey=' + API_KEY + '&page_limit=' + PAGE_SIZE;var REQUEST_URL=API_URL+PARAMS;var text = React.createClass({ getInitialState:function(){ return { dataSource:new ListView.DataSource({rowHasChanged:(row1,row2)=>row1 !==row2,}), loaded:false, }; }, componentDidMount:function(){ this.fetchData(); }, fetchData:function(){ fetch(REQUEST_URL) .then((response)=>response.json()) .then((responseData)=>{ this.setState({ dataSource:this.state.dataSource.cloneWithRows(responseData.movies), loaded:true, }); }) .done(); }, render: function() { if (!this.state.loaded) { return this.renderLoadingView(); } return ( <ListView dataSource={this.state.dataSource} renderRow={this.renderMovie} style={styles.listview} > </ListView> ); }, renderLoadingView:function(){ return ( <View style={styles.container}> <Text> Loading movies... </Text> </View> ); }, renderMovie:function(movie){ return ( <View style={styles.container}> <Image source={{uri:movie.posters.thumbnail}} style={styles.thumbnail}> </Image> <View style={styles.rightContainer}> <Text style={styles.title}>{movie.title}</Text> <Text style={styles.year}>{movie.year}</Text> </View> </View> ); },});var styles = StyleSheet.create({ container: { flex: 1, flexDirection:'row', justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF', }, thumbnail:{ width:53, height:81, }, rightContainer:{ flex:1, }, title:{ fontSize:20, marginBottom:8, textAlign:'center', }, year:{ textAlign:'center' }, listview:{ paddingTop:20, backgroundColor:'#F5FCFF', },});AppRegistry.registerComponent('text', () => text);
我加载了50条数据,竟然没有OOM,真是神奇!!!
0 0
- React Native系列之-组件初入门
- React Native系列之-React.js入门
- React Native Touchable系列组件
- React Native]React Native组件之Navigator
- React Native控件之Touchable*系列组件详解(28)
- 《React-Native系列》15、 RN之可触摸组件
- 《React-Native系列》16、 RN组件之ListView
- 《React-Native系列》29、 RN组件之WebView
- 《React-Native系列》15、 RN之可触摸组件
- 《React-Native系列》16、 RN组件之ListView
- 《React-Native系列》29、 RN组件之WebView
- 《React-Native系列》16、 RN组件之ListView
- 《React-Native系列》16、 RN组件之ListView
- 【React Native开发】React Native控件之Touchable*系列组件详解(18)
- 【React Native开发】React Native控件之Touchable*系列组件详解(18)
- React Native入门(十三)之组件的生命周期
- React Native之ViewPagerAndroid 组件
- React Native之ViewPagerAndroid 组件
- UI_UITableViewController
- HT2000
- Javascript数据引用类型及检测
- 仪表盘实时数据显示,下载即用,json嵌入数据。
- Ext4.2+ Ext.grid.plugin.RowExpander无法触发collapsebody,expandbody事件解决办法
- React Native系列之-组件初入门
- java nio Selector (新IO)分析
- char *a 和char a[] 的区别
- 谈软件测试---一年测试工作总结
- 解决OpenSSL 在VC2015下链接报错的问题。
- Android 颜色渲染(九) PorterDuff及Xfermode详解
- 【Python】Learn Python the hard way, ex10 转义字符
- box-sizing 属性
- 版本库重新定位时svn uuid不一致问题