如果是通过看react视频学习的同仁们会发现,有的视频是通过React.createClass来讲解sample 有的视频是用React.component来开发sample,那俩者之间有啥差别呢。 前面讲解的主要是环境搭建方面的,现在我们开始关注下React组件本身: createClass是React以前版本的写法,现在Facebook官方逐渐废弃,所以尽量使用React.component来定义:
我们现在看下createClass的一个典型写法的例子:
import React,{Component} from 'react'; var ClickCount = React.createClass({ //初始化state getInitState: function () { return {count: 0} }, //点击事件 将state里的count进行累加 _handleClick: function () { this.setState(this.state.count + 1); }, render: function () { return ( <div> <h1>计数器:{this.state.count}</h1> <button onClick={this._handleClick}>点击计数</button> </div> ) } }); export default ClickCount;如果改成ES6的写法: 差别一:ES6 Class 语法比起传统的对象字面量更为简洁。对于方法的定义不需要再使用 function 关键字,也不需要 , 来分开多个方法。 before
var ClickCount = React.createClass({ render: function () { return ...; } })after
var ClickCount extends React.component{ render(){ return ...; } }差别二:将初始 state 定义移动到构造函数中 before:
var ClickCount = React.createClass({ //初始化state getInitState: function () { return {count: 0} }, ... })after:
var ClickCount extends React.component{ constructor(prop){ super(prop); this.state={count:0}; } }差别三:绑定实例方法和回调到实例上 比如前面例子中的 _handleClick 方法里的 this 将会指向当前这个组件实例。当使用 ES6 Class 语法的时候,我们必须要手动为这些方法绑定执行上下文 before:
var ClickCount = React.createClass({ //初始化state ... //点击事件 将state里的count进行累加 _handleClick: function () { console.log(this); console.log(this.state); this.setState(this.state.count + 1); }, render: function () { return ( <div> <h1>计数器:{this.state.count}</h1> <button onClick={this._handleClick}>点击计数</button> </div> ) } }点击按钮的时候会调用_handleClick方法,而且输出this与this.state都是可以的。我们来看下es6:
class ClickCounter extends Component{ constructor(prop){ super(prop); //先将这句话屏蔽掉 //this._handleClick=this._handleClick.bind(this); this.state={count:0}; } _handleClick(){ //输出null console.log(this); //报错误 state of null console.log(this.state) this.setState({count:this.state.count+1}); } render(){ return ( <div> <button onClick={this._handleClick}>click Me</button> <h1>click Count{this.state.count}</h1> </div> ) } }所以es6的写法需要在constructor【构造】函数里面,进行手动绑定this对象
this._handleClick=this._handleClick.bind(this);如果存在多个事件需要绑定时,操作是比较繁琐的: before:
class ExampleComponent extends React.Component { constructor() { super(); this._handleClick = this._handleClick.bind(this); this._handleFoo = this._handleFoo.bind(this); } // ... }after:
class ExampleComponent extends React.Commponent{ _bind(...methods){ methods.forEach((method)=>this[method]=this[method].bind(this)); } constructor(){ this._bind('_handleClick', '_handleFoo'); } }