您的位置:首页 > Web前端 > React

React Native学习小结

2016-02-17 18:25 621 查看
以下均为近期学习React Native的个人心得,并不完善,欢迎园友拍砖。

React Native是什么?

React Native是一个框架,一个中间层,通过这套框架我们可以完成IOS和Android的开发。

为什么选择React Native?

选择React Native是因为它确实能够解决我们的问题。
比较重要的两个特性:
1.跨平台效率高。通过js可以同时编写IOS和Android。
2.动态加载。服务端更新客户端代码与资源,很实用的技术。

用React Native就能完成开发任务吗?

虽然有一些React Native的项目已经上线了,但是只通过React Native来开发项目局限性还是很大。
React Native目前暴露的组件与API只能满足简单的开发任务。
若只需要注册页+登录也+列表页+详情页,那么React Native很好用,网络请求、UI视图交互、页面跳转均提供了很好的支持。
但是需要使用PackageManager,ActivityManager等组件的话,就需要通过React Native和Native混合开发了。

学会了React Native就可以开发IOS程序了吧?

如果是非常简单的需求,React Native应该可以满足。但复杂一些的需求还是需要借助Native丰富的接口来实现(React Native作为一个框架,提供Native所有的接口不太现实)。

了解了React Native的基本情况,接下来开始简单介绍基本开发知识。静态页面、交互页面、页面跳转、网络请求,基本可以理解React Native的使用了。Native模块调用也是关键部分,但官方文档描述的很清楚,依据文档进行Native编写与配置便可实现,就不介绍了。

静态页面

我们可以通过分析官方自带的demo来了解静态页面的基本内容。

'use strict’;
import React, {
AppRegistry,
Component,
StyleSheet,
Text,
View
} from 'react-native';
class rnDemo extends Component {
render() {
return (
<View style={styles.container}>
<Text style={styles.welcome}>
Welcome to React Native!
</Text>
<Text style={styles.instructions}>
To get started, edit index.android.js
</Text>
<Text style={styles.instructions}>
Shake or press menu button for dev menu
</Text>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
instructions: {
textAlign: 'center',
color: '#333333',
marginBottom: 5,
},
});
AppRegistry.registerComponent('rnDemo', () => rnDemo);


代码很多是ES6语法,与早期React Native不太一样。不过对于Android开发来说应该更习惯这种类似编译语言的风格。
1行。表示是js的严格模式。
2行到8行。导入依赖,可以理解为java中import XX.react-native.React;和import XX.react-native.React.AppRegistry;这种。
9行。自定义组件,组件是React Native的基本元素,可以类比Activity。
10行到24行。render()方法,我的理解是渲染页面用的,里边的xml和layout类似,都是用来布局的。
26行到43行。通过StyleSheet.create()方法,生成布局所需的属性集合。在render()中的<View/>等添加style属性就可以了。类比android中每个View的属性,都是通过style来实现,我们创建的属性集合便是style集合。
44行。注册自定义组件。

交互页面

即在静态页面上添加事件处理,我们以点击事件为例。

<TouchableOpacity onPress={() => this.doNavigator()}>
<Text style={styles.welcome}>
Welcome to React Native new Page!
</Text>
</TouchableOpacity>


在android中我们通过setOnClickListener来实现点击事件的注册,而在React Native中,在相应的View外层套一个Touchable**的组件就可以实现这种效果了。点击事件的处理,是通过onPress属性来注册的,例子中点击后便会回调doNavigator()方法。

页面跳转

React Native的Android页面跳转与IOS页面跳转方式略有不同。最初按照IOS方式写页面跳转,报错,在Github上参考了几个Android项目,发现Android的跳转方式复杂一些。
不过页面跳转控制是在render()中,我有些迷惑,这个render()不仅具有页面渲染的功能,竟然也有页面跳转的处理,功能似乎并不是那么清晰。
抱着先会用后理解的态度,我们只能先学习如何进行跳转了。
首先要进行页面跳转控制器的配置,我是在第一个页面配置的,代码如下

render() {
return (
<Navigator
initialRoute={{id: 'Page'}}
renderScene={this.actionTo}/>
);
},
actionTo(route, navigator){
switch (route.id) {
case 'Page':
return (<Page navigator={navigator}/>);
case 'Page2':
return (<Page2 navigator={navigator}/>);
}
}


Navigator就是页面跳转控制器,initialRoute指的是初始页面,renderScene是页面跳转时回调的方法,这里就是actionTo方法。
actionTo方法,便是通过route的属性,来跳转不同的页面,可以这样理解。

接下来需要页面跳转时,调用如下方法即可

this.props.navigator.push({
id: 'Page2',
});


这里只简单介绍了push操作,pop等操作查询相关api即可。

网络请求

网络请求部分可以使用XMLHttpRequest,也可以使用更加函数式的fetch,以fetch为例进行post请求

fetch(url,{
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: “uid=puff2"})
.then((response)=>response.text())
.then((textData)=>{
var json=eval('(' + textData + ')');
Toast.show("textData:"+textData,Toast.SHORT);
this.setState({code:textData});
})
.done();


post请求,添加formData时遇到了一些坑,最后只能通过例子中这种原始方式进行请求了。
至于response使用text()而不是json()来读取数据,是因为直接解析son()会有问题,所以采用text()+eval进行了json解析。
不知道是不是后台搭得不规范,但是Android中Retrofit+Gson却是可以的啊......

上述的内容,基本能够理解React Native的基本使用了,作为一个Android码农,用起来真的很怪,门槛还是有的。不过抱着学习的态度,尝试一种新的技术,对我们码农自身还是很有好处的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: