按照官方推荐的思路,React使用标准的ES6标准的语法。比如说创建一个类:

class Greeting extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}

但是ES5依然深入人心。用的是React.creatCalss();方法。

    var Greeting=React.createClass({
render:function(){
return (
<h1>Hello,{this.props.name}</h1>
);
}
});

二者是如此的相似,但是还是有若干差别。现将官网内容翻译如下,相信无论是ES5或是ES6的使用者,都会有所裨益。

propTypesdefaultProps的声明方式

在ES6的语法下,propTypesdefaultProps是以属性的形式定义(类似写一个原生对象的属性):

class Greeting extends React.Component {
// ...
} Greeting.propTypes = {
name: React.PropTypes.string//定义为属性的数据类型
}; Greeting.defaultProps = {
name: 'Mary'//定义属性内容
};

但是你用React.creatClass(),它的参数是一个类似json的对象,所以应该这么写:

var Greeting = React.createClass({
propTypes: {
name: React.PropTypes.string
}, getDefaultProps: function() {
return {
name: 'Mary'
};
}, // ...
});

设置初始状态:

ES6的初始状态可以使用constructor函数:

class Counter extends React.Component {
constructor(props) {
super(props);//绑定
this.state = {count: props.initialCount};
}
// ...
}

但是如果你使用ES5,操作应该是setInitialState方法,props都得有this:

React.createClass({
getInitialState:function(){
return {
count:this.props.initialCount
};
}
});

自动绑定

在Es6声明的React组件中,方法都符合ES6类的规则,这意味着它不会自动绑定this关键字。因此你需要在constructor函数的方法加.bind(this)

class SayHello extends React.Component {
constructor(props) {
super(props);
this.state = {message: 'Hello!'};
// 关键语句!
this.handleClick = this.handleClick.bind(this);
} handleClick() {
alert(this.state.message);
} render() {
// 由于 `this.handleClick` 已经被绑定, 所以可以作为事件处理方法了!
return (
<button onClick={this.handleClick}>
Say hello
</button>
);
}
}

而在ES5语法下,就不必绑定了,因为它给所有的方法都绑定了this:

var SayHello = React.createClass({
getInitialState: function() {
return {message: 'Hello!'};
}, handleClick: function() {
alert(this.state.message);
}, render: function() {
return (
<button onClick={this.handleClick}>
Say hello
</button>
);
}
});

注:类似定时器,函数套函数这样的方法,this指向window,还是需要注意一下。

尽管ES6的this弄起来比较麻烦,但对于大型应用构建时,这是一个明显的优势——this就不容易出错。

当然,如果你实在是不爽那些冗余bind(this),可以采用Babel语法——Class Properties ,也不必写在constructor函数里面了。

  // 注意,此语法还不成熟!
// 用箭头绑定方法的this
handleClick = () => {
alert(this.state.message);
}

以后有可能不支持这种写法。

如果你想百分百安全,省的去维护,可以:

  • 继续使用React.createClass();
  • 老老实实地把方法写在constructor函数里面,再绑定this;
  • 在渲染中使用箭头函数, e比如:onClick={(e) => this.handleClick(e)}

Mixins

ES6运行不支持任何mixin,所以,放弃吧。

同时,在codebase使用mixin,已经发现相当多的问题。因此不建议在新的代码中使用mixin。

有时候会遇到多个组件共享一个方法的情况(术语叫横切关注点),React.createClass允许你使用mixins机制。

最常见的情况是一个组件想通过定时器更新自身的状态,定时器setInteval用起来是非常容易,但是一旦你不用,记得关掉它节省内存。React的生命周期方法可以让你知道组件何时生成和销毁。现在基于生命周期的方法创建一个简单的mixin:

当你的定时器组件销毁时,自动清理掉它:

// 通用的定时器功能。
var SetIntervalMixin = {
componentWillMount: function() {
this.intervals = [];
},
setInterval: function() {
this.intervals.push(setInterval.apply(null, arguments));
},
componentWillUnmount: function() {
this.intervals.forEach(clearInterval);
}
}; var TickTock = React.createClass({
mixins: [SetIntervalMixin], // Use the mixin
getInitialState: function() {
return {seconds: 0};
},
componentDidMount: function() {
this.setInterval(this.tick, 1000); // Call a method on the mixin
},
tick: function() {
this.setState({seconds: this.state.seconds + 1});
},
render: function() {
return (
<p>
React has been running for {this.state.seconds} seconds.
</p>
);
}
});

ES5下的React的更多相关文章

  1. react-native —— 在Windows下搭建React Native Android开发环境

    在Windows下搭建React Native Android开发环境 前段时间在开发者头条收藏了 @天地之灵_邓鋆 分享的<在Windows下搭建React Native Android开发环 ...

  2. 手把手教你在Windows下搭建React Native Android开发环境

    最近看到React Native好像好厉害的样子,好奇心驱使之下体验了一下并将在Window下搭建React Natvie Android环境的步骤记录下来,并有需要的朋友参考.(我都是参考官方文档的 ...

  3. windows下安装react

    在 Windows 10 64 下创建 React App 由 SHUIJINGWAN · 2018/03/26   1.在官方网站:https://nodejs.org/zh-cn/ 下载推荐版本: ...

  4. 与 ES5 相比,React 的 ES6 语法有何不同?

    以下语法是 ES5 与 ES6 中的区别: 1.require 与 import // ES5 var React = require('react'); // ES6 import React fr ...

  5. 【转】在Windows下搭建React Native Android开发环境

    http://www.jianshu.com/p/2fdc4655ddf8 安装JDK 从Java官网下载JDK并安装.请注意选择x86还是x64版本. 推荐将JDK的bin目录加入系统PATH环境变 ...

  6. window环境下搭建react native及相关插件

    可以先浏览一下中文翻译的开发文档具体了解一下关于React Native,想要查看官方文档可以点http://facebook.github.io/react-native/docs/getting- ...

  7. Windows环境下搭建React Native

    随着移动开发越来越火热,前端开发也是有之前11年一直火热到现在,不过我发现从去年年底开发,Android和ios基本已经饱和了,特别是随着广大开源社区的中很多人贡献代码,开发已经不是什么问题了,所以现 ...

  8. windows 下android react native详细安装配置过程

    写在前面: 在网上搜了很多安装配置文档,感觉没有一个真的跟我安装的过程一模一样的,东拼拼西凑凑,总算是装好了,我不会告诉你,断断续续,我花了两天时间...一到黑屏报错就傻眼,幸好在react群里遇到了 ...

  9. Mac下搭建react native开发环境

    安装必需软件 Homebrew Homebrew, Mac系统的包管理器,用于安装NodeJS和一些其他必需的工具软件. /usr/bin/ruby -e "$(curl -fsSL htt ...

随机推荐

  1. java-mybaits-00601-查询缓存-一级缓存、二级缓存

    1.什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存. 在操作数据库时需要构造 sql ...

  2. 看我学习Apache+php+wordpress+phpMyAdmin的搭配配置

    开场白:我不是这方面的"专家"或"菜鸟",因为我不懂,别问我为什么,我只是心血来潮好奇,东拼西凑写了这些文字. 1.php的配,使用免安装版本,要进行的设置, ...

  3. linux automake使用

    一篇文章: 一.Makefile介绍 Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中纪录有 ...

  4. iis7.5安装配置php环境详细清晰教程,三步实现【图文】

    iis7.5安装配置php环境详细清晰教程,三步实现[图文] iis7.5是安装在win7.win8里的web服务器,win2003.win2000的web服务器使用的是iis6.0,由于win7.w ...

  5. TWebBrowser静音

    procedure TForm1.FormCreate(Sender: TObject); var   hDSound: Cardinal;   pDirectSoundCreate: Pointer ...

  6. 优化css,增加性能

    转载自:https://www.cnblogs.com/xiaoloulan/p/5801663.html 前端性能优化一直是一个比较热门的话题,我们总是在尽我们最大的努力去,提高我们的页面性能,比如 ...

  7. ElasticSearch recovery过程源码分析

    [ES版本] 5.5.0 [分析过程] 找到Recovery有6种状态 public class RecoveryState implements ToXContent, Streamable { p ...

  8. TOSCA自动化测试工具安装

    1.下载链接 https://www.tricentis.com/software-testing-tools/ 2.免费试用14天, 弹出的页面输入邮箱地址--> 输入一堆信息-->点击 ...

  9. 资料:mnist.pkl.gz数据包的下载以及数据内容解释

    deeplearning.net/data/mnist/mnist.pkl.gz The MNIST dataset consists of handwritten digit images and ...

  10. 为什么iterator,foreach遍历时不能进行remove操作?除了一种情况可以这样(特殊情况)?

    Exception in thread "main" java.util.ConcurrentModificationException 并发修改异常引发的思考! 1 foreac ...