ES5下的React
按照官方推荐的思路,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的使用者,都会有所裨益。
propTypes和defaultProps的声明方式
在ES6的语法下,propTypes和defaultProps是以属性的形式定义(类似写一个原生对象的属性):
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的更多相关文章
- react-native —— 在Windows下搭建React Native Android开发环境
		
在Windows下搭建React Native Android开发环境 前段时间在开发者头条收藏了 @天地之灵_邓鋆 分享的<在Windows下搭建React Native Android开发环 ...
 - 手把手教你在Windows下搭建React Native Android开发环境
		
最近看到React Native好像好厉害的样子,好奇心驱使之下体验了一下并将在Window下搭建React Natvie Android环境的步骤记录下来,并有需要的朋友参考.(我都是参考官方文档的 ...
 - windows下安装react
		
在 Windows 10 64 下创建 React App 由 SHUIJINGWAN · 2018/03/26 1.在官方网站:https://nodejs.org/zh-cn/ 下载推荐版本: ...
 - 与 ES5 相比,React 的 ES6 语法有何不同?
		
以下语法是 ES5 与 ES6 中的区别: 1.require 与 import // ES5 var React = require('react'); // ES6 import React fr ...
 - 【转】在Windows下搭建React Native Android开发环境
		
http://www.jianshu.com/p/2fdc4655ddf8 安装JDK 从Java官网下载JDK并安装.请注意选择x86还是x64版本. 推荐将JDK的bin目录加入系统PATH环境变 ...
 - window环境下搭建react native及相关插件
		
可以先浏览一下中文翻译的开发文档具体了解一下关于React Native,想要查看官方文档可以点http://facebook.github.io/react-native/docs/getting- ...
 - Windows环境下搭建React Native
		
随着移动开发越来越火热,前端开发也是有之前11年一直火热到现在,不过我发现从去年年底开发,Android和ios基本已经饱和了,特别是随着广大开源社区的中很多人贡献代码,开发已经不是什么问题了,所以现 ...
 - windows 下android react native详细安装配置过程
		
写在前面: 在网上搜了很多安装配置文档,感觉没有一个真的跟我安装的过程一模一样的,东拼拼西凑凑,总算是装好了,我不会告诉你,断断续续,我花了两天时间...一到黑屏报错就傻眼,幸好在react群里遇到了 ...
 - Mac下搭建react native开发环境
		
安装必需软件 Homebrew Homebrew, Mac系统的包管理器,用于安装NodeJS和一些其他必需的工具软件. /usr/bin/ruby -e "$(curl -fsSL htt ...
 
随机推荐
- 文本情感分类:分词 OR 不分词(3)
			
为什么要用深度学习模型?除了它更高精度等原因之外,还有一个重要原因,那就是它是目前唯一的能够实现“端到端”的模型.所谓“端到端”,就是能够直接将原始数据和标签输入,然后让模型自己完成一切过程——包括特 ...
 - Kafka笔记整理(二):Kafka Java API使用
			
下面的测试代码使用的都是下面的topic: $ kafka-topics.sh --describe hadoop --zookeeper uplooking01:,uplooking02:,uplo ...
 - 5.MySQL必知必会之过滤数据-WHERE
			
本章将讲授如何使用SELECT语句的WHERE子句指定搜索条件. 1.使用WHERE子句 数据库表一般包含大量的数据,很少需要检索表中所有行.通常只 会根据特定操作或报告的需要提取表数据的子集.只检索 ...
 - Django小练习
			
1.获取系统所有Url from django.urls.resolvers import RegexURLPattern #定义函数 def get_all_url(patterns, prev, ...
 - 产品管理?企业规范化?iclap秀出新高度
			
19世纪,美国西部开发,无数拓荒者涌入,并最终因金矿的发现形成了淘金热.而当无数人埋头寻找黄金之时,有一个人却抬起头看到了潜藏在无数淘金者身上的金矿-这个人就是牛仔裤的发明者,Levi’s的创始人-李 ...
 - 【转】Google的2012论文
			
转自:http://www.sigvc.org/bbs/thread-1152-1-1.html Google的论文一直是业界的风向标,尤其在机器学习.分布式系统.网络等方面很多创新性的成果都是由他们 ...
 - 【android】使用RecyclerView和CardView,实现知乎日报精致布局
			
完整代码,请参考我的博客园客户端,git地址:http://git.oschina.net/yso/CNBlogs 在写博客园客户端的时候,突然想到,弄个知乎日报风格的简单清爽多好!不需要那么多繁杂的 ...
 - Java HashMap详细介绍和使用示例
			
①对HashMap的整体认识 HashMap是一个散列表,它存储的内容是键值对(key-value)映射. HashMap继承于AbstractMap,实现了Map.Cloneable.java.io ...
 - Safari中的input、textarea无法输入的问题
			
原因是这两种表单元素上应用了user-select:none的css属性.一般没人刻意这么做,可能是这样的情况: * { user-select: none; } 在css中排除掉这两种元素就好了: ...
 - Wex5各组件介绍
			
1.http://doc.wex5.com/comp-base/ 2.select 组件 http://doc.wex5.com/comps-select/ 3.页面交互以及传递参数 http:// ...