123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299 |
- <!DOCTYPE HTML>
- <html lang="" >
- <head>
- <meta charset="UTF-8">
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
- <title>React/React Native 的ES5 ES6写法对照表 · 代码收集</title>
- <meta http-equiv="X-UA-Compatible" content="IE=edge" />
- <meta name="description" content="">
- <meta name="generator" content="GitBook 3.1.1">
-
-
-
-
- <link rel="stylesheet" href="../../gitbook/style.css">
-
-
-
- <link rel="stylesheet" href="../../gitbook/gitbook-plugin-search-pro/search.css">
-
-
-
- <link rel="stylesheet" href="../../gitbook/gitbook-plugin-highlight/website.css">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <meta name="HandheldFriendly" content="true"/>
- <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
- <meta name="apple-mobile-web-app-capable" content="yes">
- <meta name="apple-mobile-web-app-status-bar-style" content="black">
- <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../../gitbook/images/apple-touch-icon-precomposed-152.png">
- <link rel="shortcut icon" href="../../gitbook/images/favicon.ico" type="image/x-icon">
-
- <link rel="next" href="03.html" />
-
-
- <link rel="prev" href="01.html" />
-
- </head>
- <body>
-
- <div class="gb-page-wrapper">
- <header class="gb-page-header">
- <div class="container">
-
-
- <div id="book-search-input" role="search">
- <input type="text" placeholder="Type to search" />
- </div>
- <a href="../.." class="logo">
- <img src="../../gitbook/images/logo/128.png">
- <h1>代码收集</h1>
- </a>
-
-
- <a href="https://github.com/seamong/myBlogs/blob/doc/JavaScript/cases/02.md" target="_blank" class="btn btn-link pull-right hidden-xs">
- <i class="octicon octicon-mark-github"></i> 在GitHub编辑本页
- </a>
- <a href="../../faq.md" class="btn btn-link pull-right hidden-xs">
- F.A.Q
- </a>
- <a href="https://github.com/seamong/myBlogs/README.md" target="_blank" class="btn btn-link pull-right hidden-xs">
- 当前版本0.0.1
- </a>
-
- </div>
- </header>
- <div class="gb-page-body">
- <div class="gb-page-inner">
- <div class="container">
- <div class="row">
- <div class="col-md-3">
-
-
- <div class="panel panel-default">
-
- <div class="panel-heading">
- <h3 class="panel-title">介绍</h3>
- </div>
-
- <div class="list-group">
-
-
-
- <a href="../../" class="list-group-item ">
-
-
-
- 关于本文档
-
- </a>
-
-
-
- </div>
- </div>
-
- <div class="panel panel-default">
-
- <div class="panel-heading">
- <h3 class="panel-title">JavaScript</h3>
- </div>
-
- <div class="list-group">
-
-
-
- <a href="../principle/" class="list-group-item ">
-
-
-
- <i class="octicon octicon-chevron-right"></i>
-
- 原理解析
-
- </a>
-
-
-
-
- <a href="./" class="list-group-item ">
-
-
-
- <i class="octicon octicon-chevron-down"></i>
-
- 案例解析
-
- </a>
-
-
-
-
-
- <a href="0.html" class="list-group-item ">
-
-
- <i class="octicon octicon-chevron-down" style="opacity: 0"></i>
-
-
- 动态替换图片
-
- </a>
-
-
-
-
- <a href="01.html" class="list-group-item ">
-
-
- <i class="octicon octicon-chevron-down" style="opacity: 0"></i>
-
-
- 原生Ajax学习
-
- </a>
-
-
-
-
- <a href="02.html" class="list-group-item active">
-
-
- <i class="octicon octicon-chevron-down" style="opacity: 0"></i>
-
-
- React/React Native 的ES5 ES6写法对照表
-
- </a>
-
-
-
-
- <a href="03.html" class="list-group-item ">
-
-
- <i class="octicon octicon-chevron-down" style="opacity: 0"></i>
-
-
- 战舰游戏
-
- </a>
-
-
-
-
- <a href="04.html" class="list-group-item ">
-
-
- <i class="octicon octicon-chevron-down" style="opacity: 0"></i>
-
-
- 正则截取指定字符串
-
- </a>
-
-
-
-
- <a href="05.html" class="list-group-item ">
-
-
- <i class="octicon octicon-chevron-down" style="opacity: 0"></i>
-
-
- 常用功能收集
-
- </a>
-
-
-
-
-
- </div>
- </div>
-
- <div class="panel panel-default">
-
- <div class="panel-heading">
- <h3 class="panel-title">angular</h3>
- </div>
-
- <div class="list-group">
-
-
-
- <a href="../../angular/study_notes/" class="list-group-item ">
-
-
-
- <i class="octicon octicon-chevron-right"></i>
-
- Study notes
-
- </a>
-
-
-
-
- <a href="../../angular/ng.html" class="list-group-item ">
-
-
-
- ng
-
- </a>
-
-
-
- </div>
- </div>
-
- <div class="panel panel-default">
-
- <div class="panel-heading">
- <h3 class="panel-title">css</h3>
- </div>
-
- <div class="list-group">
-
-
-
- <a href="../../css/principle/" class="list-group-item ">
-
-
-
- 原理解析
-
- </a>
-
-
-
-
- <a href="../../css/cases/" class="list-group-item ">
-
-
-
- <i class="octicon octicon-chevron-right"></i>
-
- 案例收集
-
- </a>
-
-
-
- </div>
- </div>
-
- <div class="panel panel-default">
-
- <div class="panel-heading">
- <h3 class="panel-title">vue</h3>
- </div>
-
- <div class="list-group">
-
-
-
- <a href="../../vue/components/" class="list-group-item ">
-
-
-
- <i class="octicon octicon-chevron-right"></i>
-
- components
-
- </a>
-
-
-
-
- <a href="../../vue/router/" class="list-group-item ">
-
-
-
- <i class="octicon octicon-chevron-right"></i>
-
- router
-
- </a>
-
-
-
-
- <a href="../../vue/vuex/" class="list-group-item ">
-
-
-
- VUE
-
- </a>
-
-
-
- </div>
- </div>
-
- <div class="panel panel-default">
-
- <div class="panel-heading">
- <h3 class="panel-title">ubuntu</h3>
- </div>
-
- <div class="list-group">
-
-
-
- <a href="../../ubuntu/serves/" class="list-group-item ">
-
-
-
- <i class="octicon octicon-chevron-right"></i>
-
- 服务器生存指南
-
- </a>
-
-
-
-
- <a href="../../ubuntu/instruction.html" class="list-group-item ">
-
-
-
- 常用指令
-
- </a>
-
-
-
-
- <a href="../../ubuntu/software/" class="list-group-item ">
-
-
-
- 常用软件安装
-
- </a>
-
-
-
- </div>
- </div>
-
- <div class="panel panel-default">
-
- <div class="panel-heading">
- <h3 class="panel-title">GIT</h3>
- </div>
-
- <div class="list-group">
-
-
-
- <a href="../../git/git.html" class="list-group-item ">
-
-
-
- git 命令
-
- </a>
-
-
-
-
- <a href="../../git/push.html" class="list-group-item ">
-
-
-
- git~push
-
- </a>
-
-
-
-
- <a href="../../git/faq.html" class="list-group-item ">
-
-
-
- git~F.A.Q
-
- </a>
-
-
-
- </div>
- </div>
-
- <div class="panel panel-default">
-
- <div class="panel-heading">
- <h3 class="panel-title">NODE&NPM</h3>
- </div>
-
- <div class="list-group">
-
-
-
- <a href="../../node/0.html" class="list-group-item ">
-
-
-
- <i class="octicon octicon-chevron-right"></i>
-
- node
-
- </a>
-
-
-
-
- <a href="../../node/npm/0.html" class="list-group-item ">
-
-
-
- npm
-
- </a>
-
-
-
- </div>
- </div>
-
- <div class="panel panel-default">
-
- <div class="list-group">
-
-
-
- <a href="../../other/faq.html" class="list-group-item ">
-
-
-
- FAQ
-
- </a>
-
-
-
-
- <a href="../../other/examples.html" class="list-group-item ">
-
-
-
- Examples
-
- </a>
-
-
-
- </div>
- </div>
-
- </div>
- <div class="col-md-9">
-
- <div id="book-search-results">
- <div class="search-noresults">
-
-
- <div class="gb-markdown book-page-inner">
- <h1 id="reactreact-native-的es5-es6写法对照表">React/React Native 的ES5 ES6写法对照表</h1>
- <h2 id="来源:">来源:<br></h2>
- <blockquote>
- <p><a href="https://babeljs.io/blog/2015/06/07/react-on-es6-plus" target="_blank">React on ES6+</a><br><a href="http://bbs.reactnative.cn/topic/15/react-react-native-%E7%9A%84es5-es6%E5%86%99%E6%B3%95%E5%AF%B9%E7%85%A7%E8%A1%A8" target="_blank">React/React Native 的ES5 ES6写法对照表</a></p>
- </blockquote>
- <h2 id="class定义语法">class定义语法</h2>
- <blockquote>
- <p>值得注意的是,我们已经删除了两个括号和一个后缀分号,而对于每个声明的方法,我们都省略了一个冒号,一个function关键字和一个逗号。</p>
- </blockquote>
- <pre><code class="lang-javascript"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Photo</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{
- render() {
- <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag"><<span class="hljs-name">img</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">{this.props.caption}</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{this.props.src}</span> /></span>
- }
- }
- // The ES5 way
- var Photo = React.createClass({
- handleDoubleTap: function(e) { ... }
- render: function() { ... }
- })
- //ThE ES6 way
- class Photo extends React.Component {
- handleDoubleTap(e) { ... }
- render() { ... }
- }
- </span></code></pre>
- <h2 id="生命周期方法">生命周期方法</h2>
- <blockquote>
- <p>所有的生命周期方法,但可以定义为使用新的类语法期望的。该课程constructor现在承担以前填写的角色componentWillMount:</p>
- </blockquote>
- <pre><code class="lang-javascript"><span class="hljs-comment">// es5</span>
- <span class="hljs-keyword">var</span> EmbedModal = React.createClass({
- componentWillMount: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ ... }
- })
- <span class="hljs-comment">// es6</span>
- <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">EmbedModal</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">createClass</span> (
- <span class="hljs-title">construtor</span>(<span class="hljs-title">props</span>) </span>{
- <span class="hljs-keyword">super</span>(props);
- <span class="hljs-comment">// Operations usually carried out in componentWillMount go here</span>
- }
- )
- </code></pre>
- <h2 id="属性初始化">属性初始化</h2>
- <blockquote>
- <p>ES7属性初始化器在类的构造函数中运行,其中this指的是正在构建的类的实例,所以初始状态仍然可以依赖于this.props。值得注意的是,我们不再需要根据吸气功能定义道具默认值和初始状态对象。</p>
- </blockquote>
- <pre><code class="lang-javascript"><span class="hljs-comment">// es5 </span>
- <span class="hljs-keyword">var</span> Video = React.createClass({
- getDefaultProps: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">return</span> {
- autoPlay: flase,
- maxLoops: <span class="hljs-number">10</span>,
- };
- },
- getInitalState: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">return</span> {
- loopsRemaining: <span class="hljs-keyword">this</span>.props.maxloops,
- };
- },
- propsTypes: {
- autoPlay: React.PropsTypes.bool.isRequired,
- maxloops: React.PropsTypes.number.isRequired,
- posterFrameSrc: React.PropsTypes.string.isRequired,
- videoSrc: React.PropsTypes.string.isRequired
- },
- });
- <span class="hljs-comment">// es6</span>
- <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Video</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{
- <span class="hljs-keyword">static</span> defaultProps = {
- autoPlay: <span class="hljs-literal">false</span>,
- maxloops: <span class="hljs-number">10</span>
- }
- <span class="hljs-keyword">static</span> propsTypes = {
- autoPlay: React.PropsTypes.bool.isRequired,
- maxloops: React.propsTypes.number.isRequired,
- posterFrameSrc: React.PropsTypes.string.isRequired,
- videoSrc: React.PropsTypes.string.isRequired
- }
- state = {
- loopsRemaining: <span class="hljs-keyword">this</span>.props.maxloops,
- }
- }
- </code></pre>
- <h2 id="箭头函数说明">箭头函数说明</h2>
- <blockquote>
- <p>该React.createClass方法用于对组件的实例方法执行一些额外的绑定工作,以确保其中的this关键字将引用该组件的实例。</p>
- </blockquote>
- <pre><code class="lang-javascript"><span class="hljs-comment">// 自动绑定React.createClass</span>
- <span class="hljs-keyword">var</span> PostInfo = React.createClass({
- handleOptionsButtonClick: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>) </span>{
- <span class="hljs-comment">// 这里,'this' 是指组件实例。</span>
- <span class="hljs-keyword">this</span>.setState({showOptionModal: <span class="hljs-literal">true</span>});
- },
- });
- </code></pre>
- <blockquote>
- <p>由于我们React.createClass在使用ES6 +类语法定义组件时不涉及该方法,所以我们需要手动绑定实例方法,无论我们想要这种行为:</p>
- </blockquote>
- <pre><code class="lang-javascript"><span class="hljs-comment">// 手动绑定,无论你是否需要</span>
- <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PostInfo</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{
- construtor(props) {
- <span class="hljs-keyword">super</span>(props);
- <span class="hljs-comment">// 手动将此方法绑定到组件实例中…</span>
- <span class="hljs-keyword">this</span>.handleOptionsButtonClick = <span class="hljs-keyword">this</span>.handleOptionsButtonClick.bind(<span class="hljs-keyword">this</span>);
- }
- handleOptionsButtonClick(e) {
- <span class="hljs-comment">// …为了确保'this'指的是组件实例。</span>
- <span class="hljs-keyword">this</span>.setState({showOptionsModal: <span class="hljs-literal">true</span>});
- }
- }
- </code></pre>
- <blockquote>
- <p>幸运的是,通过组合两个ES6 +功能 - 箭头函数和属性初始值设置 - 选择加入到组件实例的绑定变得轻而易举:</p>
- </blockquote>
- <pre><code class="lang-javascript"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PostInfo</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{
- handleOptionsButtonClick = (e) => {
- <span class="hljs-keyword">this</span>.setState({showOptionsModal: <span class="hljs-literal">true</span>});
- }
- }
- </code></pre>
- <blockquote>
- <p>ES6箭头函数的主体具有与它们周围this的代码相同的词汇,这使得我们获得了期望的结果,因为ES7属性初始化器的作用域的方式。在罩下看,看看为什么这个工作。</p>
- </blockquote>
- <h2 id="动态属性名称和模板字符串">动态属性名称和模板字符串</h2>
- <blockquote>
- <p>其中的增强对象文本包括分配给派生属性名称的能力。我们原本可以做这样的事情来设定一个状态:
- ```js
- var From = React.createClass({
- onChange: function(inputName, e) {
- var stateToSet = {};
- stateToSet[inputName + 'Value'] = e.targe.value;
- this.setState(stateToset);
- },
- });
- // 现在,我们有能力构建在运行时由JavaScript表达式决定其属性名称的对象。在这里,我们使用模板字符串来确定要设置的属性:
- class From extends React.Component {
- onChange(inpuntName, e){
- this.setState({</p>
- </blockquote>
- <pre><code> [`$(inputName)value`]: e.targe.value,
- });
- }
- </code></pre><p>}</p>
- <pre><code>
- ## 解构和传播属性
- >通常在组成组件时,我们可能希望将大部分父组件的道具传递给子组件,但并不是全部。将ES6 + 解构与JSX 传播属性相结合,无需仪式即可实现:
- ```js
- class AutoloadingPostsGrid extends React.Component {
- render() {
- const {
- className,
- ...others // 包含所有特性this.props除了类名
- } = this.props;
- return (
- <div className={className}>
- <PostsGrid {...others} />
- <button onClick={this.handleLoadMoreClick}>Load more</button>
- </div>
- );
- }
- }
- // 我们可以将JSX传播属性与常规属性结合起来,利用简单的优先级规则来实现覆盖和默认值。该元素将获得className“覆盖”,即使存在一个className财产this.props:
- <div {...this.props} className="override">
- ...
- </div>
- // This element will regularly have the “base” unless there exists a property in to override it:
- <div className="base" {...this.props}>
- ...
- </div>
- </code></pre><h2 id="模块">模块</h2>
- <pre><code class="lang-javascript"><span class="hljs-comment">// 引用</span>
- <span class="hljs-comment">// es5</span>
- <span class="hljs-keyword">var</span> React = <span class="hljs-built_in">require</span>(<span class="hljs-string">"react"</span>);
- <span class="hljs-keyword">var</span> {
- Component,
- PropsTypes
- } = React; <span class="hljs-comment">//引用react抽象组件</span>
- <span class="hljs-keyword">var</span> ReactNative = <span class="hljs-built_in">require</span>(<span class="hljs-string">"react-native"</span>);
- <span class="hljs-keyword">var</span> {
- Image,
- Text,
- } = ReactNative; <span class="hljs-comment">// 引用具体的React Native组件</span>
- <span class="hljs-comment">// es6 import写法更为标准</span>
- <span class="hljs-keyword">import</span> React, {
- Component,
- PropsTypes,
- } <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>;
- <span class="hljs-keyword">import</span> {
- imange,
- Text,
- } <span class="hljs-keyword">from</span> <span class="hljs-string">'react-native'</span>
- </code></pre>
- <h2 id="导出单个类">导出单个类</h2>
- <blockquote>
- <p>在ES5里,要导出一个类给别的模块用,一般通过module.exports来导出</p>
- </blockquote>
- <pre><code>// es5
- var MyComponent = React.createClass({
- // 函数
- })
- // es6
- export default class MyComponent extends Component{
- // 函数
- }
- // 引用 class
- // es5
- var MyComponent = require(('./MyComponent'));
- // es6
- import MyComponent from './MyComponent';
- </code></pre><h2 id="定义组件">定义组件</h2>
- <blockquote>
- <p>es5 在ES5里,通常通过React.createClass来定义一个组件类,像这样:</p>
- </blockquote>
- <pre><code class="lang-javascript"><span class="hljs-keyword">var</span> Photo = React.createClass({
- render: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">return</span> (
- <span class="xml"><span class="hljs-tag"><<span class="hljs-name">Image</span> <span class="hljs-attr">source</span>=<span class="hljs-string">{this.props.source}</span> /></span>
- )
- }
- })
- </span></code></pre>
- <blockquote>
- <p>在ES6里,我们通过定义一个继承自React.Component的class来定义一个组件类,像这样:</p>
- </blockquote>
- <pre><code class="lang-javascript"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Photo</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{
- render() {
- <span class="hljs-keyword">return</span> (
- <span class="xml"><span class="hljs-tag"><<span class="hljs-name">Image</span> <span class="hljs-attr">source</span>=<span class="hljs-string">{this.props.source}</span> /></span>
- );
- }
- }
- </span></code></pre>
- <h2 id="给组件定义方法">给组件定义方法</h2>
- <blockquote>
- <p>给组件定义方法不再用 名字: function()的写法,而是直接用名字(),在方法的最后也不能有逗号了。</p>
- </blockquote>
- <pre><code class="lang-javascript"><span class="hljs-comment">// es5</span>
- <span class="hljs-keyword">var</span> Photo = React.createClass({
- componentWillMount: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-comment">// 函数</span>
- },
- render: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">return</span> (
- <Image source={this.props.source} />
- );
- },
- });
- // es6
- class Photo extends React.Component {
- componentWillMount() {
- // 函数
- },
- render() {
- return (
- <Image source={this.props.source} />
- );
- }
- }
- </code></pre>
- <h2 id="定义组件的属性类型和默认属性">定义组件的属性类型和默认属性</h2>
- <blockquote>
- <p>在ES5里,属性类型和默认属性分别通过propTypes成员和getDefaultProps方法来实现</p>
- </blockquote>
- <pre><code class="lang-javascript"><span class="hljs-comment">// es5</span>
- <span class="hljs-keyword">var</span> video = React.createClass({
- getDefaultProps: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">return</span> {
- autoPlay: <span class="hljs-literal">false</span>,
- maxloops: <span class="hljs-number">10</span>,
- };
- },
- PropsTypes: {
- autoPlay: React.PropsTypes.bool.isRequired,
- maxloops: React.PropsTypes.number.isRequired,
- posterFrameSrc: React.PropsTypes.string.isRequired,
- videoSrc: React.PropsTypes.string.isRequired,
- },
- render: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">return</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <View />
- };
- }
- })
- </code></pre>
- <blockquote>
- <p>在ES6里,可以统一使用static成员来实现</p>
- </blockquote>
- <pre><code class="lang-javascript"><span class="hljs-comment">//es6</span>
- <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Video</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{
- <span class="hljs-keyword">static</span> defaultProps = {
- autoPlay: flase,
- maxloops: <span class="hljs-number">10</span>,
- }; <span class="hljs-comment">// 注意这里有分号</span>
- <span class="hljs-keyword">static</span> propsTypes = {
- autoPlay: React.PropsTypes.bool.isRequired,
- maxloops: React.PropsTypes.number.isRequired,
- posterFrameSrc: React.PropsTypes.string.isRequired,
- videoSrc: React.PropsTypes.string.isRequired,
- }; <span class="hljs-comment">// 注意这里有分号</span>
- render() {
- <span class="hljs-keyword">return</span> (
- <span class="xml"><span class="hljs-tag"><<span class="hljs-name">view</span> /></span>
- )
- }
- }
- </span></code></pre>
- <blockquote>
- <p>也有人这么写,虽然不推荐,但读到代码的时候你应当能明白它的意思:</p>
- </blockquote>
- <pre><code class="lang-javascript"><span class="hljs-comment">//es6</span>
- <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Videlo</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{
- render() {
- <span class="hljs-keyword">return</span> (
- <span class="xml"><span class="hljs-tag"><<span class="hljs-name">Video</span> /></span>
- );
- }
- }
- Video.defauleftProps = {
- autoPlay: false,
- maxloops: 10,
- };
- Video.propsTypes = {
- autoPlay: React.PropsTypes.bool.isRequired,
- maxloops: React.PropsTypes.number.isRequired,
- posterFrameSrc: React.PropsTypes.string.isRequired,
- videoSrc: React.PropsTypes.string.isRequired,
- }
- // 注意: 对React开发者而言,static成员在IE10及之前版本不能被继承,而在IE11和其它浏览器上可以,这有时候会带来一些问题。React Native开发者可以不用担心这个问题。
- </span></code></pre>
- <h2 id="初始化state">初始化STATE</h2>
- <pre><code class="lang-javascript"><span class="hljs-comment">// es5</span>
- <span class="hljs-keyword">var</span> video = React.createClass({
- getInitalState: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">return</span> {
- loopsRemaining: <span class="hljs-keyword">this</span>.props.maxloops,
- };
- }
- })
- <span class="hljs-comment">// ES6下,有两种写法:</span>
- <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Video</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{
- state = {
- loopsRemaining: <span class="hljs-keyword">this</span>.props.maxloops,
- }
- }
- <span class="hljs-comment">// 不过我们推荐更易理解的在构造函数中初始化(这样你还可以根据需要做一些计算):</span>
- <span class="hljs-comment">// es6</span>
- <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Video</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{
- construtor(props){
- <span class="hljs-keyword">super</span>(props);
- <span class="hljs-keyword">this</span>.state = {
- loopsRemaining: <span class="hljs-keyword">this</span>.props.maxloops,
- }
- }
- }
- </code></pre>
- <h2 id="把方法作为回调提供">把方法作为回调提供</h2>
- <blockquote>
- <p>很多习惯于ES6的用户反而不理解在ES5下可以这么做:</p>
- </blockquote>
- <pre><code class="lang-javascript"><span class="hljs-keyword">var</span> PostInfo = React.createClass({
- handleOptionsButtonClick: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>) </span>{
- <span class="hljs-comment">// Here,'this' refers to the component instance</span>
- <span class="hljs-keyword">this</span>.setState({showOptionModel: <span class="hljs-literal">true</span>});
- },
- render: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">return</span> (
- <span class="xml"><span class="hljs-tag"><<span class="hljs-name">TouchableHighlight</span> <span class="hljs-attr">onPress</span>=<span class="hljs-string">{this.handleOptionsButtonClick}</span> ></span>
- <span class="hljs-tag"><<span class="hljs-name">Text</span>></span>{this.props.label}<span class="hljs-tag"></<span class="hljs-name">Text</span>></span>
- <span class="hljs-tag"></<span class="hljs-name">TouchableHighlight</span>></span></span>
- )
- },
- });
- </code></pre>
- <blockquote>
- <p>在ES5下,React.createClass会把所有的方法都bind一遍,这样可以提交到任意的地方作为回调函数,而this不会变化。但官方现在逐步认为这反而是不标准、不易理解的。</p>
- </blockquote>
- <p>在ES6下,你需要通过bind来绑定this引用,或者使用箭头函数(它会绑定当前scope的this引用)来调用</p>
- <pre><code class="lang-javascript"><span class="hljs-comment">// es6</span>
- <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PostInfo</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span>
- </span>{
- handleOptionsButtonClick(e){
- <span class="hljs-keyword">this</span>.setState({showOptionsModal: <span class="hljs-literal">true</span>});
- }
- render() {
- <span class="hljs-keyword">return</span> (
- <span class="xml"><span class="hljs-tag"><<span class="hljs-name">TouchableHighlight</span>
- <span class="hljs-attr">onpress</span>=<span class="hljs-string">{this.handleOptionsButtonClick.bind(this)}</span>
- <span class="hljs-attr">onpress</span>=<span class="hljs-string">{e=</span>></span>this.handleOptionsButtonClick(e)}
- >
- <span class="hljs-tag"><<span class="hljs-name">Text</span>></span>{this.props.label}<span class="hljs-tag"></<span class="hljs-name">Text</span>></span>
- <span class="hljs-tag"></<span class="hljs-name">TouchableHighlight</span>></span></span>
- )
- },
- }
- </code></pre>
- <h2 id="箭头函数">箭头函数</h2>
- <blockquote>
- <p>箭头函数实际上是在这里定义了一个临时的函数,箭头函数的箭头=>之前是一个空括号、单个的参数名、或用括号括起的多个参数名,而箭头之后可以是一个表达式(作为函数的返回值),或者是用花括号括起的函数体(需要自行通过return来返回值,否则返回的是undefined)。</p>
- </blockquote>
- <pre><code class="lang-javascript"><span class="hljs-comment">// 箭头函数实例</span>
- ()=><span class="hljs-number">1</span>
- v=>v+<span class="hljs-number">1</span>
- (a,b)=>a+b
- ()=>{
- alert(<span class="hljs-string">'foo'</span>);
- }
- e=>{
- <span class="hljs-keyword">if</span> (e == <span class="hljs-number">0</span>){
- <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
- }
- <span class="hljs-keyword">return</span> <span class="hljs-number">1000</span>/e;
- }
- </code></pre>
- <blockquote>
- <p>需要注意的是,不论是bind还是箭头函数,每次被执行都返回的是一个新的函数引用,因此如果你还需要函数的引用去做一些别的事情(譬如卸载监听器),那么你必须自己保存这个引用</p>
- </blockquote>
- <pre><code>// 错误的做法
- class PaussMenu extends React.Component{
- componentWillMount() {
- AppStateIOS.addEventListener('change', this.onAppPaused.bind(this));
- }
- componentDidUnmount() {
- AppStateIOS.removeEventListener('change', this.onAppPaused.buid(this));
- }
- onAppPaused(event){
- }
- }
- // 正确的做法
- class PaussMenu extends React.Component{
- construtor(props) {
- super(props);
- this._OnAppPaused = this.onAppPaused.bind(this);
- }
- componentWillMount() {
- AppStateIOS.addEventListener('change', this._OnAppPaused);
- }
- componentDidUnmount() {
- AppStateIOS.removeEventListener('change', this_onAppPaused);
- }
- onAppPaused(event) {
- }
- }
- // 从这个帖子[这个帖子](http://www.tuicool.com/articles/Rj6RFnm)中我们还学习到一种新的做法:
- // 正确的做法
- class PaussMenu extends React.createClass{
- componentWillMount() {
- AppStateIOS.addEventListener('change', this.onAppPaused);
- }
- componentDidUnmount() {
- AppStateIOS.removeEventListener('change', this.onAppPaused);
- }
- onAppPaused = (event) => {
- // 把方法直接作为一个arrow function的属性来定义,初始化的时候就绑定好了this的指针
- }
- }
- </code></pre><h2 id="mixins">Mixins</h2>
- <blockquote>
- <p>在ES5下,我们经常使用minxin来为我们的类添加一些新的方法,譬如PureRenderMinxin
- ```
- var PurRenderMixin = require('react-addins-pure-render-minxin');
- React.createClass({
- mixin: [PurRenderMixin],</p>
- </blockquote>
- <pre><code>render: function() {
- return <div className={this.props.className}>foo</div>;
- }
- </code></pre><p>})</p>
- <pre><code>
- > 然而现在官方已经不再打算在ES6里继续推行Mixin,他们说:Mixins Are Dead. Long Live Composition。<br/>
- 尽管如果要继续使用mixin,还是有一些第三方的方案可以用,譬如这个方案<br>
- 不过官方推荐,对于库编写者而言,应当尽快放弃Mixin的编写方式,文中提到Sebastian Markbåge的一段代码推荐了一种新的编码方式:
- </code></pre><p>//Enhance.js
- import { Component } from 'React'</p>
- <p>extends var Enhance = ComposedComponent => class extends Component {
- construtor() {
- this.state = {dtaa:null}
- }
- componentDidUnmount() {
- this.setState({ data: 'Hello' });
- }
- render() {
- renturn <composedcomponent {...this.props}="" data="{this.state.data}">
- }
- }</composedcomponent></p>
- <p>// HigherOrderComponent.js
- import { Enhance } from "./Enhance";</p>
- <p>class MyComponent {
- render() {
- if (!this.data) return <div>Waiting...</div>;
- return <div>{this.data}</div>;
- }
- }</p>
- <p>export defaule Enhance(MyComponent); // Enhance component
- //用一个“增强函数”,来某个类增加一些方法,并且返回一个新类,这无疑能实现mixin所实现的大部分需求。</p>
- <pre><code>
- ## ES6+带来的其它好处
- ### 解构&属性延展
- > 结合使用ES6+的解构和属性延展,我们给孩子传递一批属性更为方便了。这个例子把className以外的所有属性传递给div标签:
- </code></pre><p>class AutoloadingPostsGrid extends React.Component {
- render() {
- var {
- className,
- ...others,
- } = this.props;
- return (
- <div classname="{className}">
- <postsgrid {...others}="">
- <button onclick="{this.handleOptionsButtonClick}">Load more</button>
- </postsgrid></div>
- );
- }
- }</p>
- <pre><code>
- > 下面这种写法,则是传递所有属性的同时,用覆盖新的className值:
- </code></pre><p><div {...this.props}="" classname="override">
- ...
- </div></p>
- <pre><code>
- > 这个例子则相反,如果属性中没有包含className,则提供默认的值,而如果属性中已经包含了,则使用属性中的值
- </code></pre><p><div classname="base" {...this.props}="">
- ...
- </div>
- ```</p>
- </div>
-
- <hr>
- <div class="btn-group btn-group-justified">
-
- <a class="btn" href="01.html"><b>上一页:</b> 原生Ajax学习</a>
-
-
- <a class="btn" href="03.html"><b>下一页:</b> 战舰游戏</a>
-
- </div>
-
- </div>
- <div class="search-results">
- <div class="has-results">
-
- <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
- <ul class="search-results-list"></ul>
-
- </div>
- <div class="no-results">
-
- <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
-
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <footer class="gb-page-footer">
- <div class="container">
- <ul class="menu">
- <li class="pull-right">
- <span class="service-info">Copyright GitBook 2018</span>
- </li>
- <li>
- <a href="#">Return to the top</a>
- </li>
- <li>
- <a href="#">Updated May 30th 18</a>
- </li>
- </ul>
- </div>
- </footer>
- </div>
- <script src="../../gitbook/gitbook.js"></script>
-
- <script src="../../gitbook/gitbook-plugin-search-pro/jquery.mark.min.js"></script>
-
-
- <script src="../../gitbook/gitbook-plugin-search-pro/search.js"></script>
-
-
- <script src="../../gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
-
-
- <script src="../../gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
-
- <script>
- (function() {
- gitbook.page.hasChanged({"page":{"title":"React/React Native 的ES5 ES6写法对照表","level":"2.2.3","depth":2,"next":{"title":"战舰游戏","level":"2.2.4","depth":2,"path":"JavaScript/cases/03.md","ref":"JavaScript/cases/03.md","articles":[]},"previous":{"title":"原生Ajax学习","level":"2.2.2","depth":2,"path":"JavaScript/cases/01.md","ref":"JavaScript/cases/01.md","articles":[]},"dir":"ltr"},"config":{"plugins":["theme-official@2.1.1","-sharing","-fontsettings","sitemap","-search","search-pro"],"root":"./docs/","styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"sitemap":{"hostname":"https://blog.honghaitao.net/"},"search-pro":{"cutWordLib":"nodejieba","defineWord":["小需求","基础建设"]},"highlight":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"theme-official":{},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{"version":"0.0.1"},"title":"代码收集","gitbook":"3.1.1"},"file":{"path":"JavaScript/cases/02.md","mtime":"2018-05-30T08:23:34.364Z","type":"markdown"},"gitbook":{"version":"3.1.1","time":"2018-05-31T06:23:00.958Z"},"basePath":"../..","book":{"language":""}});
- })();
- </script>
-
- </body>
- </html>
|