轉載連接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/react-native-es5-and-es6-writing-table/react
對於不少初次學習React-Native人來講,都會爲ES6語法所困惑,由於網上好多React-Native的Demo都是用ES5語法寫的。因此我剛開始也是學的ES5,對我來講ES5語法比較熟悉,可是看到ES6的語法剛開始就感受怪怪的,相信對初次接觸ES6寫法的es6
人來講都會有這樣的感受。今天我就整理下ES5跟ES6寫法的規範,但願會對你有所幫助。react-native
1、模塊引用ide
在ES5裏引入React的包基本經過require進行,代碼以下:函數
//ES5oop
var React=require('react-native'); var { Image, Text, propTypes }=React;
2、導出單個類post
//在ES6中用,import導入學習
import React,{Image,Text,PropTypes} from 'react-native'
在ES5中,通常經過module.exports來導出ui
//ES5this
var MyComponent=React.createClass({ ..... }), module.exports=MyComponent;
//ES6
export default class MyComponent extends React.component{ .... }
引用的時候:
//ES5
var MyComponent=require('./MyComponent.js');
//ES6
import MyComponent from './MyComponent.js'
3、定義組件
在ES5中,經過React.createClass來定義一個組件類。以下所示:
//ES5
var MyComponent=React.createClass({ render:function(){ return ( <Text>...</Text> ); } })
在ES6裏,經過定義一個繼承自React.Component的class來定義一個組件:
//ES6
class MyComponent extends React.component{ render(){ return( <Text>...</Text> ) } }
4、給組件定義方法
從上面能夠看出給組件定義方法再也不用 函數名:function()的寫法,而是直接名字,方法的後面也不用用逗號(,)
5、定義組件的屬性類型和默認屬性
在ES5裏,屬性類型和默認屬性分別經過propTypes成員和getDefaultProps方法來實現
//ES5 var Video = React.createClass({ getDefaultProps: function( ) { return { autoPlay: false, maxLoops: 10, }; }, propTypes: { autoPlay: React.PropTypes.bool.isRequired, maxLoops: React.PropTypes.number.isRequired, posterFrameSrc: React.PropTypes.string.isRequired, videoSrc: React.PropTypes.string.isRequired, }, render: function( ) { return ( <View /> ); }, });
在ES6裏,能夠統一使用static成員來實現
//ES6 class Video extends React.Component { static defaultProps = { autoPlay: false, maxLoops: 10, }; // 注意這裏有分號 static propTypes = { autoPlay: React.PropTypes.bool.isRequired, maxLoops: React.PropTypes.number.isRequired, posterFrameSrc: React.PropTypes.string.isRequired, videoSrc: React.PropTypes.string.isRequired, }; // 注意這裏有分號 render() { return ( <View /> ); } // 注意這裏既沒有分號也沒有逗號 }
6、初始化state
ES5以下:
//ES5 var Video = React.createClass({ getInitialState: function() { return { loopsRemaining: this.props.maxLoops, }; }, })
ES6以下:
//ES6 class Video extends React.Component { state = { loopsRemaining: this.props.maxLoops, } } 不過咱們推薦更易理解的在構造函數中初始化(這樣你還能夠根據須要作一些計算): //ES6 class Video extends React.Component { constructor(props){ super(props); this.state = { loopsRemaining: this.props.maxLoops, }; } }
7、把方法做爲回調提供
//ES5
var MyComponent=React.createClass({ _example:function(){ console.log('example') }, render:function(){ return( <View> <TouchableHighlight onPress={this._example}> <Text>...</Text> </TouchableHighlight> </View> ) } })
//在ES6下能夠經過bind來綁定引用,或者使用箭頭函數(它會綁定當前的scope的this引用)來調用
class MyComponent extends React.component{ _example(){ console.log('example') } render(){ return( <View> <TouchableHighlight onPress={this._example.bind(this) or ()=>{this._example()}}> <Text>...</Text> </TouchableHighlight> </View> ) } }
對於不少初次學習React-Native人來講,都會爲ES6語法所困惑,由於網上好多React-Native的Demo都是用ES5語法寫的。因此我剛開始也是學的ES5,對我來講ES5語法比較熟悉,可是看到ES6的語法剛開始就感受怪怪的,相信對初次接觸ES6寫法的
人來講都會有這樣的感受。今天我就整理下ES5跟ES6寫法的規範,但願會對你有所幫助。
1、模塊引用
在ES5裏引入React的包基本經過require進行,代碼以下:
//ES5
var React=require('react-native'); var { Image, Text, propTypes }=React;
2、導出單個類
//在ES6中用,import導入
import React,{Image,Text,PropTypes} from 'react-native'
在ES5中,通常經過module.exports來導出
//ES5
var MyComponent=React.createClass({ ..... }), module.exports=MyComponent;
//ES6
export default class MyComponent extends React.component{ .... }
引用的時候:
//ES5
var MyComponent=require('./MyComponent.js');
//ES6
import MyComponent from './MyComponent.js'
3、定義組件
在ES5中,經過React.createClass來定義一個組件類。以下所示:
//ES5
var MyComponent=React.createClass({ render:function(){ return ( <Text>...</Text> ); } })
在ES6裏,經過定義一個繼承自React.Component的class來定義一個組件:
//ES6
class MyComponent extends React.component{ render(){ return( <Text>...</Text> ) } }
4、給組件定義方法
從上面能夠看出給組件定義方法再也不用 函數名:function()的寫法,而是直接名字,方法的後面也不用用逗號(,)
5、定義組件的屬性類型和默認屬性
在ES5裏,屬性類型和默認屬性分別經過propTypes成員和getDefaultProps方法來實現
//ES5 var Video = React.createClass({ getDefaultProps: function( ) { return { autoPlay: false, maxLoops: 10, }; }, propTypes: { autoPlay: React.PropTypes.bool.isRequired, maxLoops: React.PropTypes.number.isRequired, posterFrameSrc: React.PropTypes.string.isRequired, videoSrc: React.PropTypes.string.isRequired, }, render: function( ) { return ( <View /> ); }, });
在ES6裏,能夠統一使用static成員來實現
//ES6 class Video extends React.Component { static defaultProps = { autoPlay: false, maxLoops: 10, }; // 注意這裏有分號 static propTypes = { autoPlay: React.PropTypes.bool.isRequired, maxLoops: React.PropTypes.number.isRequired, posterFrameSrc: React.PropTypes.string.isRequired, videoSrc: React.PropTypes.string.isRequired, }; // 注意這裏有分號 render() { return ( <View /> ); } // 注意這裏既沒有分號也沒有逗號 }
6、初始化state
ES5以下:
//ES5 var Video = React.createClass({ getInitialState: function() { return { loopsRemaining: this.props.maxLoops, }; }, })
ES6以下:
//ES6 class Video extends React.Component { state = { loopsRemaining: this.props.maxLoops, } } 不過咱們推薦更易理解的在構造函數中初始化(這樣你還能夠根據須要作一些計算): //ES6 class Video extends React.Component { constructor(props){ super(props); this.state = { loopsRemaining: this.props.maxLoops, }; } }
7、把方法做爲回調提供
//ES5
var MyComponent=React.createClass({ _example:function(){ console.log('example') }, render:function(){ return( <View> <TouchableHighlight onPress={this._example}> <Text>...</Text> </TouchableHighlight> </View> ) } })
//在ES6下能夠經過bind來綁定引用,或者使用箭頭函數(它會綁定當前的scope的this引用)來調用
class MyComponent extends React.component{ _example(){ console.log('example') } render(){ return( <View> <TouchableHighlight onPress={this._example.bind(this) or ()=>{this._example()}}> <Text>...</Text> </TouchableHighlight> </View> ) } }