react-native 常用组件的用法(二)
ScrollView组件
能够调用移动平台的ScrollView(滚动视图)的组件,同时还集成了触摸锁定的“响应者”系统。
注意一定要给scrollview一个高度,或者是他父级的高度。
常用方法
onScrollBeginDrag:开始拖拽的时候;
onScrollEndDrag:结束拖拽的时候;
onMomentumScrollBegin:开始滑动;
onMomentumScrollEnd:开始滑动;
特殊组件
RefreshControl 以用在ScrollView或ListView内部,为其添加下拉刷新的功能。
当ScrollView处于竖直方向的起点位置(scrollY: 0),此时下拉会触发一个onRefresh事件。
示例
创建一个scroll.js文件
代码如下:
import React, { Component } from 'react';
import {
StyleSheet,
View,
ScrollView,
RefreshControl
} from 'react-native';
var dataSource = require("./data.json");
// 创建组件
var ScrollTest = React.createClass({
// 下面的几种函数可以根据自己的需求添加
_onScrollBeginDrag () {
// 这里是开始拖拽的函数
},
_onScrollEndDrag () {
// 这里是拖拽结束的函数
},
_onMomentumScrollBegin () {
// 这里是开始滚动的函数
},
_onMomentumScrollEnd () {
// 这里是滚动结束的函数
},
_refresh () {
// 这里是请求数据的函数
alert("正在请求数据");
},
render () {
return (
<ScrollView style={styles.container}
onScrollBeginDrag={this._onScrollBeginDrag}
onScrollEndDrag={this._onScrollEndDrag}
onMomentumScrollBegin={this._onMomentumScrollBegin}
onMomentumScrollEnd={this._onMomentumScrollEnd}
refreshControl={
<RefreshControl refreshing={false}
titleColor={"red"}
title={"正在刷新......."}
tintColor={"cyan"}
onRefresh={this._refresh} />
}>
<View style={[styles.item, styles.item1]}></View>
<View style={[styles.item, styles.item2]}></View>
<View style={[styles.item, styles.item3]}></View>
</ScrollView>
)
}
});
// 实例化样式
var styles = StyleSheet.create({
container: {
marginTop: 25,
height: 300,
borderWidth: 1,
borderColor: "#ccc"
},
item: {
width: 280,
height: 150,
margin: 20
},
item1: {
backgroundColor: "red"
},
item2: {
backgroundColor: "green"
},
item3: {
backgroundColor: "yellow"
}
});
module.exports = ScrollTest;
再将index.ios.js文件改成如下:
import React, { Component } from 'react';
import {
AppRegistry,
View,
} from 'react-native';
var Scroll = require("./scroll");
var ScrollTest = React.createClass({
render () {
return (
<View>
<Scroll></Scroll>
</View>
)
}
});
AppRegistry.registerComponent('useComponent', () => ScrollTest);
最终效果:
ListView组件
用于高效地显示一个可以垂直滚动的变化的数据列表。
最基本的使用方式就是创建一个ListView.DataSource数据源,然后给它传递一个普通的数据数组,再使用数据源来实例化一个ListView组件,并且定义它的renderRow回调函数,这个函数会接受数组中的每个数据作为参数,返回一个可渲染的组件(作为listview的每一行)。
数据处理
ListView.DataSource为ListView组件提供高性能的数据处理和访问。
我们需要调用方法从原始输入数据中抽取数据来创建ListViewDataSource对象,并用其进行数据变更的比较。
DataSource初始化:
getInitialState:function () {
// 实例化DataSource对象
var ds = new ListView.DataSource({
rowHasChanged:(oldData,newData) => oldData !== newData
});
return {
data:ds.cloneWithRows(news)
}
}
常用属性
设置数据源:dataSource={this.state.dataSource}
设置列表组件:renderRow={this._renderRow}
设置ListView头部:renderHeader={this._renderHeader}
设置列表项之间的间隔:renderSeparator={this._renderSeparator}
示例 制作一个电影列表
博主先前从猫眼电影里获取了一些电影介绍的json文件,有兴趣的同学可以去猫眼电影列表获取一些信息,注意这里需要json格式转换一下!
这里创建一个movieList.js的文件
代码如下:
import React, { Component } from 'react';
import {
StyleSheet,
Text,
View,
Image,
ListView
} from 'react-native';
// 通过ListView实现电影列表
var movies = require("./data.json").data.movies;
// 创建组件
var ListMovie = React.createClass({
getInitialState () {
var ds = new ListView.DataSource({
rowHasChanged: (oldData, newData) => oldData !== newData
});
return {dataSource: ds.cloneWithRows(movies)}
},
_renderRow (movie) {
return (
<View style={styles.row}>
<Image style={styles.img} source={{uri: movie.img}}/>
<View style={styles.right}>
<Text style={styles.name}>{movie.nm}</Text>
<Text style={styles.dir}>导演:{movie.dir}</Text>
<Text style={styles.dir}>上映时间:{movie.rt}</Text>
</View>
</View>
)
},
_renderHeader () {
return (
<View style={styles.header}>
<Text style={styles.title}>猫眼热门电影</Text>
<View style={[styles.separator, {width: "100%"}]}></View>
</View>
)
},
_renderSeparator () {
return <View style={styles.separator}></View>
},
render () {
return <ListView style={styles.container}
dataSource={this.state.dataSource}
renderRow={this._renderRow}
renderHeader={this._renderHeader}
renderSeparator={this._renderSeparator}
/>
}
});
// 实例化样式
var styles = StyleSheet.create({
container: {
marginTop: 25
},
row: {
flexDirection: "row",
alignItems: "center",
padding: 10
},
img: {
width: 78,
height: 128
},
right: {
marginLeft: 15,
flex: 1
},
name: {
fontSize: 20,
fontWeight: "bold",
marginTop: 3,
marginBottom: 10
},
dir: {
fontSize: 15,
marginBottom: 3,
color: "#686868"
},
header: {
height: 44,
alignItems: "center"
},
title: {
fontSize: 25,
fontWeight: "bold",
lineHeight: 44
},
separator: {
height: 1,
backgroundColor: "#ccc"
}
});
module.exports = ListMovie;
再将index.ios.js文件改成如下:
import React, { Component } from 'react';
import {
AppRegistry,
View,
} from 'react-native';
var ListMovie = require("./listMovie");
var Movie = React.createClass({
render () {
return (
<View>
<ListMovie></ListMovie>
</View>
)
}
});
AppRegistry.registerComponent('useComponent', () => Movie);
最终效果:
Navigator组件
使用导航器可以让你在应用的不同场景(页面)间进行切换。其实质上类似于HTML里导航条功能。
不过导航器页面的跳转需要通过路由对象来分辨不同的场景。
利用renderScene方法,导航栏可以根据指定的路由来渲染场景。
导航器的设置步骤
第一步:设置属性initialRoute:初始化route对象,指定默认页面,也就是启动app之后所看到的第一个页面;
第二步:configureScene:配置场景动画和手势;
第三步:renderScene;渲染场景,参数route(第一步创建并设置的导航器路由对象),navigator(导航器对象)
代码展示:
<Navigator
initialRoute={rootRoute}
configureScene={(route)=>Navigator.SceneConfigs.PushFromRight}
renderScene={
(route,navigator)=>{
var MySceneComponent = route.component;
console.log(MySceneComponent);
console.log(“aaaa”);
return (
<MySceneComponent route={route} navigator={navigator}/>
)
}
}
/>
示例
创建一个nav.js文件
代码如下:
import React, { Component } from 'react';
import {
StyleSheet,
Text,
View,
Navigator,
TouchableOpacity,
TextInput
} from 'react-native';
// 在进行导航时,需要先构成一些页面,使用Navigator
// 创建组件
var FirstPage = React.createClass({
getInitialState () {
return {text: ""}
},
saveText (text) {
this.setState({text: text})
},
changePage () {
// 把需要传递的值,都放在路由的nextPass属性里
var nextRoute = {
component: SecondPage,
nextPass: {text: this.state.text}
};
this.props.navigator.push(nextRoute);
},
render () {
return (
<View style={[styles.container, {backgroundColor: "cyan"}]}>
<TextInput style={styles.input} placeholder={"请输入"} onChangeText={this.saveText}/>
<TouchableOpacity onPress={this.changePage} style={styles.btn}>
<Text style={styles.btnText}>跳转到下一页</Text>
</TouchableOpacity>
</View>
)
}
});
var SecondPage = React.createClass({
changePage () {
this.props.navigator.pop();
},
render () {
return (
<View style={[styles.container, {backgroundColor: "yellowgreen"}]}>
<Text>接收到的数据是{this.props.text}</Text>
<TouchableOpacity onPress={this.changePage} style={styles.btn}>
<Text style={styles.btnText}>返回上一页</Text>
</TouchableOpacity>
</View>
)
}
});
var Nav = React.createClass({
render () {
// 初始路由,首页
var rootRoute = {
component: FirstPage,
nextPass: {}
};
return (
<Navigator
// 第一步需要进行初始路由的设置
initialRoute={rootRoute}
// 第二步设置页面的切换方式
configureScene={(route) => Navigator.SceneConfigs.FloatFromBottom}
// 第三部确定要渲染的场景(页面)
renderScene={(route, navigator) => {
// 找到要渲染的页面
var Component = route.component;
// 渲染时,需要把route和Navigator作为属性传递下去,传递的值也作为属性传递
// ...route.nextPass把route中的nextPass里的数据都传递下去
return <Component {...route.nextPass} text={route.nextPass.text} route={route} navigator={navigator} />
}}
/>
)
}
});
// 实例化样式
var styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: "center",
alignItems: "center",
},
btn: {
backgroundColor: "#25f30d",
width: 115,
height: 30,
borderRadius: 5,
justifyContent: "center",
alignItems: "center"
},
btnText: {
fontSize: 14,
fontWeight: "bold"
},
input: {
margin: 30,
borderWidth: 1,
borderColor: "#ccc",
height: 30,
backgroundColor: "#77ccb1"
}
});
module.exports = Nav;
在index.ios.js文件中代码更改如下:
import React, { Component } from 'react';
import {
AppRegistry,
View,
} from 'react-native';
var Nav = require("./nav");
var NavTest = React.createClass({
render () {
return (
<View style={{flex: 1}}>
<Nav></Nav>
</View>
)
}
});
AppRegistry.registerComponent('useComponent', () => NavTest);
最终效果:
TableBarIOS组件
TableBar是放置在屏幕的最下方会有很多平级的标签图标的标签栏,用户可以击内部不同的图标切换屏幕中显示的视图,TableBarIOS只适用于IOS平台
常用属性
barTintColor:标签栏的背景颜色
tintColor:当前被选中标签图标的颜色
unselectedItemTintColor:当前没有被选中的标签图标的颜色
TabBarIOS.Item
TabBarIOS.Item是每个可以点击标签不图标,根据点击的不同显示不同的视图
常用属性
title:在图标下面显示的标题文字
icon:给当前标签指定一个自定义的图标
onPress:当此标签被选中时调用。你应该修改组件的状态来使得selected={true}
selected:这个属性决定了子视图是否可见。如果你看到一个空白的页面,很可能是没有选中任何一个标签。
代码展示:
<TabBarIOS.Item
title=“movieTest”
icon={require(“./passport.png”)}
onPress={this.changeTab.bind(this, ”movieTest”)}
selected={this.state.selectTab == “movieTest”}
>
<MovieList></MovieList>
</TabBarIOS.Item>
示例
创建一个tabBar.js文件
代码如下:
import React, { Component } from 'react';
import {
TabBarIOS
} from 'react-native';
//引入三个选项页面(这里引入的是之前做好的几个组件)
var Nav = require("./nav");
var MovieList = require("./movieList");
var ImageTest = require("./image");
var TabBarTest = React.createClass({
getInitialState:function () {
//显示当前显示的标签
return {
selectTab: "首页"
}
},
changeTab:function (name) {
this.setState({
selectTab:name
})
},
render:function () {
return (
<TabBarIOS barTintColor="#ccc"
tintColor={"red"}
unselectedItemTintColor={"cyan"}
>
{/*下部的标签栏*/}
<TabBarIOS.Item
title="首页"
icon={require("./images/index.png")}
onPress={this.changeTab.bind(this,"首页")}
selected={this.state.selectTab == "首页"}
>
{/*每一个选项*/}
<Input/>
</TabBarIOS.Item>
<TabBarIOS.Item
title="图片"
icon={require("./images/picture.png")}
onPress={this.changeTab.bind(this,"图片")}
selected={this.state.selectTab == "图片"}
>
{/*每一个选项*/}
<ImageTest/>
</TabBarIOS.Item>
<TabBarIOS.Item
title="电影"
icon={require("./images/movie.png")}
onPress={this.changeTab.bind(this,"电影")}
selected={this.state.selectTab == "电影"}
>
{/*每一个选项*/}
<MovieList/>
</TabBarIOS.Item>
</TabBarIOS>
)
}
});
module.exports = TabBarTest;
在index.ios.js文件中,代码更改为如下:
import React, { Component } from 'react';
import {
AppRegistry,
View,
} from 'react-native';
var TabBarTest = require("./tabBar");
var TabTest = React.createClass({
render () {
return (
<View style={{flex: 1}}>
<TabBarTest></TabBarTest>
</View>
)
}
});
AppRegistry.registerComponent('useComponent', () => TabTest);
最终效果:
网络请求
React Native提供了和web标准一致的Fetch API,用于满足开发者访问网络的需求。与之前学过的AJAX很相似。
fetch()第一个参数为请求地址
fetch(‘https://mywebsite.com/mydata.json’);
第二个参数可选,可以用来定制HTTP请求一些参数
fetch(‘https://mywebsite.com/endpoint/‘, {
method: ‘POST’,
headers: {
‘Accept’: ‘application/json’,
‘Content-Type’: ‘application/json’,
},
body: JSON.stringify({
firstParam: ‘yourValue’,
secondParam: ‘yourOtherValue’,
})
})
其中body表示要传输的数据
Fetch 方法会返回一个Promise,需要对返回的数据进行处理
通过链式结构添加then方法进行成功数据处理
如果有错,通过catch方式捕捉
getDate:function () {
fetch(url)
.then((res)=>{
return res.json();
})
.then((resData)=>{
this.setState({
loaded:true,
dataSource:this.state.dataSource.cloneWithRows(resData.data.movies)
})
})
.catch((err)=>{
alert(err)
})
}
.
react-native 常用组件的用法(二)的更多相关文章
- React Native常用组件在Android和IOS上的不同
React Native常用组件在Android和IOS上的不同 一.Text组件在两个平台上的不同表现 1.1 height与fontSize 1.1.1只指定font,不指定height 在这种情 ...
- React Native常用组件之ListView
1. ListView常用属性 ScrollView 相关属性样式全部继承 dataSource ListViewDataSource 设置ListView的数据源 initialListSize n ...
- React Native常用组件之ListView组件
学习iOS开发的同学应该都知道UITableView,几乎每个APP中都有它的存在,而且衍生出各种形态:那么同样,ListView就是在React Native中的tableView,而且更加简单和灵 ...
- react native 常用组件汇总
react-native-uploader //文件上传https://github.com/aroth/react-native-uploader jpush-react-native //官方版本 ...
- 一起来点React Native——常用组件之Touchable系列
在前面的登录界面中,我们发现所有的组件不会对用户的点击.触摸.拖拽做出合适的响应,这是十分不友好的.那么,在React Native中如何让视图对触发做出合适的响应呢? 一.高亮触摸 Touchab ...
- 一起来点React Native——常用组件之Image
一.前言 在开发中还有一个非常重要的组件Image,通过这个组件可以展示各种各样的图片,而且在React Native中该组件可以通过多种方式加载图片资源. 二.Image组件的基本用法 2.1 从当 ...
- React Native常用组件之TabBarIOS、TabBarIOS.Item组件、Navigator组件、NavigatorIOS组件、React Navigation第三方
以下内容为老版本React Native,faceBook已经有了新的导航组件,请移步其他博客参考>>[我是传送门] 参考资料:React Navigation react-native ...
- React Native常用组件之ScrollView组件
一.前言 从iOS开发的经验来看,scrollView无疑是移动开发中很重要的一个组件,比如后面会学到的ListView就是继承自它.那么,在开发中比如:焦点图.引导页等地方都有其的影子,那接下来我们 ...
- React Native常用组件之ScrollView
1. 两个要点 1.1 ScrollView必须有一个确定的高度才能正常工作 它实际上所做的就是将一系列不确定高度的子组件装进一个确定高度的容器(通过滚动操作) 通常有两种做法: 第一种: 直接给该S ...
随机推荐
- wcf常用的概念
常见的服务行为包括实例控制.并发控制.元数据发布等 在WCF中,有三种消息交换模式:数据报模式.请求-响应模式.双工模式. 在WCF中一共包含了4种契约,分别是服务契约.数据契约.错误契约和消息契约. ...
- 转载~Linux 平台下阅读源码的工具
Linux 平台下阅读源码的工具 前言 看源代码是一个程序员必须经历的事情,也是可以提升能力的一个捷径.个人认为: 要完全掌握一个软件的方法只有阅读源码在Windows下有sourceinsight这 ...
- 详解利用ShoeBox制作位图字体
http://childhood.logdown.com/posts/190580/-details-using-shoebox-produce-bitmap-fonts?utm_source=tui ...
- HTTP GET与POST区别
HTTP定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST. HTTP-GET和HTTP-POST是使用HTTP的标准协议动词,用于编码和传送变量名/变量值对参数,并且使用相关的请求语 ...
- XML技术总结之XDocument 和XmlDocument
引言 虽然现在Json在我们的数据交换中越来越成熟,但XML格式的数据还有很重要的地位. C#中对XML的处理也不断优化,那么我们如何选择XML的这几款处理类 XmlReader,XDocument ...
- centos6.x一键15项系统优化(转自努力哥)
#!/bin/sh ################################################ #Author:nulige # qqinfo: # Date: -- #vers ...
- PHP成生若干位防伪码的方法
public static function createCode($length =16) { $arr = array_merge(range(0, 9), range('a', 'z')); / ...
- 我只能说,Spring Data REST真的很燥辣
我自己写REST,到一半了,突然想试一下Spring Data REST,还真不是乱说, 燥辣得很,短时间全生成,快赶上DJANGO的速度了.怕了我. 参考文档: Spring Data REST入门 ...
- [POI2006]Periods of Words
题目大意: 给定一个长度为$n(n\leq10^6)$的字符串$S$,定义一个串$S$的最大周期为一个不为$S$的字符串$Q$,满足$Q$为$S$的前缀且$S$为$QQ$的前缀.求字符串$S$的每一个 ...
- Leave It Behind and Carry On ---- 高一下期末考反思 [补档]
背景 这个学期的前\(\frac{3}{4}\), 我都是在停课集训中度过的, 先是GDKOI, 再是北京集训, 最后是GDOI, 结果GDOI还没进day3就滚粗了. 学校的内容是考完GDOI后回学 ...