当今 React
比较流行,可能会有很多的新手和我一样遇到这个问题:
var MyClass = React.createClass({...});
和class MyClass extends React.Component{...}
之间的区别是什么?那么今天带大家一起学习一下。
写法的区别
React
中有两种支持创建组件的方法,你可以通过 React.createClass
和 extends React.Component
,他们实现的目的都是一样的。区别就在于你是否是以 ES6
的形式。
当你使用
ES6
,你应该在constructor
中初始化你的参数:
1 | class MyComponent extends React.Component { |
当你使用
React.createClass
你需要使用getInitialState
:
1 | var MyComponent = React.createClass({ |
- 这两种写法的方法名首字母都必须大写
函数 this 自绑定
React.createClass
创建的组件,其每一个成员函数的this
都有React
自动绑定,任何时候使用,直接使用this.method
即可,函数中的this
会被正确设置。
1 | const Contacts = React.createClass({ |
React.Component
创建的组件,其成员函数不会自动绑定this
,需要开发者手动绑定,否则this
不能获取当前组件实例对象。
1 | class Contacts extends React.Component { |
当然,React.Component
有三种手动绑定方法:可以在构造函数中完成绑定,也可以在调用时使用method.bind(this)
来完成绑定,还可以使用arrow function
来绑定。拿上例的handleClick
函数来说,其绑定可以有
1 | constructor(props) { |
1 | <div onClick={this.handleClick.bind(this)}></div> //使用bind来绑定 |
1 | <div onClick={()=>this.handleClick()}></div> //使用arrow function来绑定 |
组件属性类型propTypes及其默认props属性defaultProps配置不同
React.createClass
在创建组件时,有关组件props
的属性类型及组件默认的属性会作为组件实例的属性来配置,其中defaultProps
是使用getDefaultProps
的方法来获取默认组件属性的:
1 | const TodoItem = React.createClass({ |
React.Component
在创建组件时配置这两个对应信息时,他们是作为组件类的属性,不是组件实例的属性,也就是所谓的类的静态属性来配置的。对应上面配置如下:
1 | class TodoItem extends React.Component { |
组件初始状态state的配置不同
React.createClass
创建的组件,其状态state
是通过getInitialState
方法来配置组件相关的状态;React.Component
创建的组件,其状态state
是在constructor
中像初始化组件属性一样声明的。
1 | const TodoItem = React.createClass({ |
1 | class TodoItem extends React.Component{ |
Mixins的支持不同
Mixins
(混入)是面向对象编程OOP的一种实现,其作用是为了复用共有的代码,将共有的代码通过抽取为一个对象,然后通过Mixins
进该对象来达到代码复用。
React.createClass
在创建组件时可以使用mixins
属性,以数组的形式来混合类的集合。
1 | var SomeMixin = { |
但是遗憾的是React.Component
这种形式并不支持Mixins
,至今React
团队还没有给出一个该形式下的官方解决方案;但是React
开发者社区提供一个全新的方式来取代Mixins
,那就是Higher-Order Components
(高阶组件)。