从ES5语法到ES6语法你应该知道这些

最近在学RN,所以就要先来了解一下现在使用ES6编写RN的主流语言了,可是当我从GitHub上下载了一下Demo来学习的时候,我发现有些Demo已经很长时间了,用的都是ES5语法来完成的。而现在许多公司基本都用ES6语法来开发RN了,所以当一个刚接触RN,对JS又不是很厉害的同学来说,要看懂别人的代码就要先知道ES5和ES6的区别有哪些,当我们遇到ES5语法写的RN项目时,我们怎么把他很好的理解成ES6语法的项目,话不多说,我们直接来学习吧

  • 从ES5语法开发转入ES6开发主要需要注意下面讨论的6个部分。

1.React native 组件导入

  • 导入RN组件使用ES5语法示例:

    let React = require('react-native');
    let{
        AppRegistry, //注册
        StyleSheet,   //样式
        Text,         //文本组件
        View,         //视图组件
    } = React;
    
  • 导入RN组件使用ES6语法示例:

        import React, { Component } from 'react';
        import {
          AppRegistry, //注册
          StyleSheet,   //样式
          Text,         //文本组件
          View,         //视图组件
          TextInput
        } from 'react-native';
    

我们在使用ES5语法创建自己的RN组件时会这样写

```
    let Index = React.createClass({
        ······
    });
```

使用ES6语法时我们要将上面的代码改为下面的形式

```
    class Index extends Component {
    ·····
    }
```

属性声明

我们常要声明一个属性和指定属性默认值

  • 在使用ES5语法示例:

        var Index = React.createClass({
            propTypes:{
                aStringProp:React.PropTypes.string
            },
            getDefaultPrors: function(){
                return {aStringProp:'default value'};
            }
            ······
        });
    
  • 使用ES6语法时我们要将上面的代码改成下面的形式:

        var Index extends Component {   ·····   }
        Index.propTypes = {
            aStringProp:React.PropTypes.string
        };
        Index.defaultProps = {
            aStringProp: 'default value'
        };
    

注意:在ES6语法中,属性的类型声明和默认值声明不像ES5语法那样在组件定义内部声明,而是在组件定义外部声明。

成员变量声明

  • 在ES5语法中,RN组件的成员变量声明代码如下:

        ···
        let Index = React.createClass({
            myProperty1:'test',
            myProperty2:true,
        });
        ···
    
  • 在使用ES6语法编写RN组件时,可以为RN组件指定一个构造函数,而声明RN组件的成员变量必须在组件的构造函数中声明。具体示例如下:

        var Index extends Component {
            constructor(props) {            //组件构造函数名称与声明方式,不可修改
                super(props);               //将属性传给父类构造函数,必须有这句,不可修改
                this.myProperty1='test',    //声明成员变量
                this.myProperty2=true,      //声明成员变量
            }
        }
    

在使用ES6语法编写RN组件时函数名称后不能再有“:function”关键字,不同于使用ES5语法编写时可有也可没用这个关键字。

状态机变量声明

  • 使用ES5语法时,RN组件的状态机变量声明代码如下:

        ·····
        let Index = React.createClass({
            getInitialState:function(){
                return {
                    var1:'value of var1',
                    var2:30,
                    var3:true
                }
            };
        });
        ······
    
  • 使用ES6语法编写RN组件时,RN组件的状态机变量也必须在组件的构造函数中声明。示例如下:

        var Index extends Component {
            constructor(props) {            //组件构造函数名称与声明方式,不可修改
                super(props);               //将属性传给父类构造函数,必须有这句,不可修改
                this.state = {              //声明状态机变量
                    var1: 'value of var1',
                    var2:30,
                    var3:true
                };
            }
        }
    

回调函数绑定

  • 使用ES5语法时,RN组件的回调函数可以直接指向本组件的某个成员方法,示例如下:

        ······
       let Login = React.createClass({
       getInitalState:function () {
           return {
               inputedNum:''
           };
       },
        updateNum: function (newText) {     //这个成员方法将被用作回调函数
            this.setState((state) => {
               return {
                   inputedNum:newText
               };
            });
        },
        buttonPressed: function () {        //这个成员方法将被用作回调函数
            //·····
        },
        render:function () {
            return(
                <View style={styles.container}>
                    <TextInput style={styles.innerViewStyle}
                        placeholder={"请输入账号"}
                        //下面的语句指定第一个回调函数
                        onChangeText={(newText) => this.updateNum(newText)}
                    />
    
                    <Text style={styles.innerViewStyle2}
                        onPress={this.buttonPressed()}>//指定第二个回调函数
                        确定
                    </Text>
                </View>
            );
        }
    });
    ······
    
  • 使用ES6语法编写RN组件时,RN组件的回调函数必须在组件的构造函数中执行绑定操作。使用ES5语法也是有这一步绑定操作的,但是React类的creatClass方法为开发者代劳了这一步操作。使用ES6语法开发这一步必须由开发者自己在代码中绑定,那么我们来练习一下。

        class Login extends Component {
        constructor (props){
            super(props);
            this.state = {
                inputedNum:''
            };
            //下面两条语句将两个回调函数和成员方法绑定
            this.updateNum = this.updateNum.bind(this);
            this.buttonPressed = this.buttonPressed.bind(this);
        }
        updateNum(newText) {
            this.setState((state) => {
                return {
                    inputedNum:newText
                };
            });
        }
        buttonPressed(){
            this.setState((state) => {
                return {
                    inputedNum:''
                };
            });
        }
      //初始化方法====》返回具体的组件内容
        //写结构和内容
      render() {
          return (
              <View style={styles.container}>
                  <TextInput style={styles.innerViewStyle}
                             placeholder={"请输入账号"}
                      //下面的语句指定第一个回调函数
                             onChangeText={(newText) => this.updateNum(newText)}
                  />
    
                  <Text style={styles.innerViewStyle2}
                        onPress={this.buttonPressed()}>//指定第二个回调函数
                      确定
                  </Text>
              </View>
          );
          //返回
      }
    }
    

相对于ES5语法开发,使用ES6语法开发需要开发者通过代码自己绑定每一个回调函数,这对于开发者来说时一种开发方便性上的退步。但是直到RN可以使用ES7语法开发前,只能使用这种不方便的办法。

类的静态成员变量与静态成员函数

  • 使用ES5语法进行RN开发时,类的静态成员变量与静态成员函数的实现我们在下面的代码中感受一下:

        statics: {
            myStaticObject: 'init value',       //定义类的静态成员变量
            myStaticMethod: function(){         //定义类的静态成员函数
                console.log('myStaticMethod is called.')
            }
        },
        render:function() {
            console.log(Index.myStaticObject);  //访问类的静态成员变量
            Index.myStaticMethod();             //调用类的静态成员函数
            ·······
        }
    
  • 使用ES6语法时,我们相应的实现代码我们来学习一下:

        Class Idnex extends Component {
            static myStaticObject = 'init value';
            static myStaticMethod (){
                console.log('myStaticMethod is called.');
            }
    
            render(){
                console.log(Index.myStaticObject);  //访问类的静态成员变量
                Index.myStaticMethod();             //调用类的静态成员函数
                ·······
            }
        }
    

好了到这里呢,我们已经了解了ES5语法和ES6语法在开发RN时有那些异同。那么在以后的开发中和去阅读别人的代码时相信你很块的就能分辨出来这是ES5语法还是ES6语法编写的了。

ES6新特性

ES6(ECMAScript2015)的出现,不仅给前端的开发人员带来了新的惊喜,而且给开发RN的开发者带来了很多惊喜,以前的RN开发者都在用ES5语法编写RN,现在ES6语法已经成为了编写RN的趋势和潮流,就是说现在的RN开发者基本都在用ES6语法还有将ES5语法换成ES6语法的。所以我们必须要了解一下ES6的新特性

ES6常用的特性有:

  • 箭头操作符 =>
  • 类的支持 class
  • 增强的对象字面量
  • 字符串模板
  • 解构
  • 参数默认值,不定参数,拓展参数
  • let与const 关键字
  • for of 值遍历
  • iterator, generator
  • 模块
  • Map,Set 和 WeakMap,WeakSet
  • Proxies
  • Symbols
  • Math,Number,String,Object 的新API
  • Promises

ES6的新特性具体的异同你们可以参考这两篇博文来进行学习
1.ES6的新特性
2.ES6的新特性


好了说到这里也差不多了,让我们继续在学习RN的这条路上前进吧。
如果你想了解更多欢迎加入我们一起学React Native 群点击链接加入群【我们一起学React Native】
来一起学习吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,441评论 25 707
  • 引用:http://hao.jser.com/archive/10813/?utm_source=tuicool&...
    庄志平阅读 1,201评论 1 14
  • 上周听了关于幼小衔接的专题讲座,学习了一些关于幼小衔接的内容,整理如下: 1、幼小衔接,有必要吗?如果必要,应该从...
    微乴问阅读 418评论 0 1
  • #每日精进拆解12/21#既然花钱学习了Frank老师的写作训练营,师傅已经领进门,修炼在自身。给自己定了一个小目...
    豆妈不逗阅读 182评论 0 0
  • 杂感六八 夜半听见火车在叫,长长的呼叫好象两根锃亮的钢轨,铺向遥远的大千世界。 梦是黑夜唯一的羽毛,在寂静中点亮星...
    闲不语阅读 167评论 0 1