按照官方推荐的思路,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 多线程 day11 lock

    import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock; /** * Create ...

  2. Spring框架第六篇之Spring与DAO

    一.Spring与JDBC模板 1.搭建环境 首先导入需要的jar包: 以上jar中多导入了DBCP和C3P0的jar包,因为这里需要演示怎么配置多种数据源,所以导入了这两个包,在实际开发中无需导入这 ...

  3. 压力测试工具MySQL mysqlslap

    MySQL mysqlslap压测 2016-09-12 17:49 by pursuer.chen, 771 阅读, 0 评论, 收藏, 编辑 介绍 mysqlslap是mysql自带的一个性能压测 ...

  4. 查看Oracle latch _spin_count默认值

    查看Oracle latch  _spin_count默认值 SELECT X.KSPPINM NAME, Y.KSPFTCTXVL VALUE, Y.KSPFTCTXDF ISDEFAULT FRO ...

  5. JAVA中重写equals()方法为什么要重写hashcode()方法?

    object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true:注意:当此方法 ...

  6. fork和multiprocessing

    多任务理解 单核cpu完成多个cpu的切换 时间片轮转 优先级调度 并发看上去一起执行 并行一起执行 调度算法 什么样的情况下用什么样的规则让谁去执行. 一般情况下电脑都是并发的 进程的创建-fork ...

  7. 安装memcached扩展

    1.wget http://pecl.php.net/package/memcache  下载相对应的扩展包 2. tar -zxvf memcache-2.2.7.tgz 3.  cd memcac ...

  8. 2016-2017 National Taiwan University World Final Team Selection Contest A - Hacker Cups and Balls

    题目: Dreamoon likes algorithm competitions very much. But when he feels crazy because he cannot figur ...

  9. XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem F. Matrix Game

    题目: Problem F. Matrix GameInput file: standard inputOutput file: standard inputTime limit: 1 secondM ...

  10. python中的引用传递,可变对象,不可变对象,list注意点

    python中的引用传递 首先必须理解的是,python中一切的传递都是引用(地址),无论是赋值还是函数调用,不存在值传递. 可变对象和不可变对象 python变量保存的是对象的引用,这个引用指向堆内 ...