• React Native学习小结


    以下均为近期学习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来了解静态页面的基本内容。
     1 'use strict’;
     2 import React, {
     3   AppRegistry,
     4   Component,
     5   StyleSheet,
     6   Text,
     7   View
     8 } from 'react-native';
     9 class rnDemo extends Component {
    10   render() {
    11     return (
    12       <View style={styles.container}>
    13         <Text style={styles.welcome}>
    14           Welcome to React Native!
    15         </Text>
    16         <Text style={styles.instructions}>
    17           To get started, edit index.android.js
    18         </Text>
    19         <Text style={styles.instructions}>
    20           Shake or press menu button for dev menu
    21         </Text>
    22       </View>
    23     );
    24   }
    25 }
    26 const styles = StyleSheet.create({
    27   container: {
    28     flex: 1,
    29     justifyContent: 'center',
    30     alignItems: 'center',
    31     backgroundColor: '#F5FCFF',
    32   },
    33   welcome: {
    34     fontSize: 20,
    35     textAlign: 'center',
    36     margin: 10,
    37   },
    38   instructions: {
    39     textAlign: 'center',
    40     color: '#333333',
    41     marginBottom: 5,
    42   },
    43 });
    44 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行。注册自定义组件。

    交互页面

    即在静态页面上添加事件处理,我们以点击事件为例。
    1 <TouchableOpacity onPress={() => this.doNavigator()}>
    2   <Text style={styles.welcome}>
    3     Welcome to React Native new Page!
    4   </Text>
    5 </TouchableOpacity>

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

    页面跳转

    React Native的Android页面跳转与IOS页面跳转方式略有不同。最初按照IOS方式写页面跳转,报错,在Github上参考了几个Android项目,发现Android的跳转方式复杂一些。
    不过页面跳转控制是在render()中,我有些迷惑,这个render()不仅具有页面渲染的功能,竟然也有页面跳转的处理,功能似乎并不是那么清晰。
    抱着先会用后理解的态度,我们只能先学习如何进行跳转了。
    首先要进行页面跳转控制器的配置,我是在第一个页面配置的,代码如下
     1 render() {
     2   return (
     3     <Navigator
     4       initialRoute={{id: 'Page'}}
     5       renderScene={this.actionTo}/>
     6   );
     7 },
     8 actionTo(route, navigator){
     9   switch (route.id) {
    10     case 'Page':
    11       return (<Page navigator={navigator}/>);
    12     case 'Page2':
    13       return (<Page2 navigator={navigator}/>);
    14   }
    15 }
    Navigator就是页面跳转控制器,initialRoute指的是初始页面,renderScene是页面跳转时回调的方法,这里就是actionTo方法。
    actionTo方法,便是通过route的属性,来跳转不同的页面,可以这样理解。
     
    接下来需要页面跳转时,调用如下方法即可
    1 this.props.navigator.push({
    2   id: 'Page2',
    3 });
    这里只简单介绍了push操作,pop等操作查询相关api即可。

    网络请求

    网络请求部分可以使用XMLHttpRequest,也可以使用更加函数式的fetch,以fetch为例进行post请求
     1 fetch(url,{ 
     2       method: "POST",
     3       headers: {
     4         "Content-Type": "application/x-www-form-urlencoded"
     5       },
     6       body: “uid=puff2"})
     7     .then((response)=>response.text())
     8     .then((textData)=>{
     9       var json=eval('(' + textData + ')');
    10       Toast.show("textData:"+textData,Toast.SHORT);
    11       this.setState({code:textData});
    12     })
    13     .done();
    post请求,添加formData时遇到了一些坑,最后只能通过例子中这种原始方式进行请求了。
    至于response使用text()而不是json()来读取数据,是因为直接解析son()会有问题,所以采用text()+eval进行了json解析。
    不知道是不是后台搭得不规范,但是Android中Retrofit+Gson却是可以的啊......
     
     
    上述的内容,基本能够理解React Native的基本使用了,作为一个Android码农,用起来真的很怪,门槛还是有的。不过抱着学习的态度,尝试一种新的技术,对我们码农自身还是很有好处的。
  • 相关阅读:
    【转帖】流程与IT管理部——IT支撑业务变革的必然趋势
    【转帖】39个让你受益的HTML5教程
    【转帖】2015年2月份最佳的免费 UI 工具包
    【消息】Pivotal Pivots 开源大数据处理的核心组件
    【转帖】创业者,你为什么这么着急?
    教程:SpagoBI开源商业智能之XML Template 图表模板
    教程:Spagobi开源BI系统 Console报表设计教程
    【转帖】Mysql多维数据仓库指南 第一篇 第1章
    Kiss MySQL goodbye for development and say hello to HSQLDB
    梯度消失和梯度爆炸问题详解
  • 原文地址:https://www.cnblogs.com/puff/p/5196255.html
Copyright © 2020-2023  润新知