React.Component与React.createClass的区别

51

我很困惑组件和React类之间的区别是什么?

何时使用组件而不是React类? 看起来组件是一个类,而createClass创建一个组件。

https://facebook.github.io/react/docs/top-level-api.html

React.Component

 

这是React组件的基类,当使用ES6类定义它们时。请参阅可重用组件以了解如何在React中使用ES6类。有关基类实际提供哪些方法,请参见Component API。

React.createClass

 

给定规范,创建一个组件类。组件实现一个render方法,该方法返回单个子项。该子项可能具有任意深度的子项结构。使组件与标准原型类不同的一件事是,您不需要对它们调用new。它们是方便包装器,可以为您构造后备实例(通过new)。


请注意,使用其中一种语法或另一种语法都有一些注意事项。例如,在MyComponent extends React.Component的情况下不支持混合(mixins)。 - gcedo
我在一些反应式示例中看到了这种情况,其中一些文件使用组件编写,而另一些则使用createClass编写。我之前读过你的提示,但这引导我提出了这个问题。所以基本上,如果我想使用mixins,我就使用createClass。如果不需要,我可以使用ES6,对吗? - svenhornberg
5个回答

52

只有 mixins 不支持 MyComponent extends React.Component 这种写法,其他 React.createClass 的功能都被支持了。

要实现 getInitialState(),可以这样写:

class MyComponent extends React.Component {
  constructor(props, context) {
    super(props, context);

    // initial state
    this.state = {
      counter: 0
    };
  }

  ...
}

或者如果你使用像Babel这样的转译器,你可以获得

class MyComponent extends React.Component {
  state = {
    counter: 0
  }

  ...
}

与 createClass 提供的自动绑定不同,您可以使用 .bind(this) 显式地绑定,就像您上面展示的那样,或者使用 ES6 的箭头函数语法:

class MyComponent extends React.Component {
  onClick = () => {
    // do something
  }
  ...
}

不要把东西放在componentWillMount中,你可以像这样把它们放在构造函数中:

class MyComponent extends React.Component {
  constructor(props, context) {
    super(props, context);

    // what you would have put in componentWillMount
  }

  ...
}

在React文档中有更多的细节,但基本上React.createClass购买的唯一附加功能是mixins,但据我所知,任何你可以用mixins做的事情都可以用context和高阶组件完成。


3
这应该是一个被接受的答案。感谢您提供详细且最新的解释。 - Igor Malyk

16

有两种方法可以完成相同的事情。

React.createClass是一个返回组件类的函数。

MyComponent = React.createClass({
  ...
});

React.Component 是一个现有的组件,您可以扩展它。主要在使用 ES6 时有用。

MyComponent extends React.Component {
  ...
}

3
还有更多的差异。例如,在 ES6 的 React.Component 中不存在 getInitialState()。 - Kevin Ghadyani
2
看一下下面的 Lewis C 的回答。它解释了这些差异。 - Igor Malyk

10

React.createClass - 创建组件类的方法。

为了更好地与ES6模块结合使用,可以使用React.Component继承来代替调用createClass

两者之间的一些区别是:

语法: React.createClass:

var MyComponent = React.createClass({ });

React.Component:

export default class MyComponent extends React.Component{ }

getInitialState() : React.createClass: 有 React.Component: 没有

constructor() : React.createClass: 没有 React.Component: 有

propTypes 语法 : React.createClass:

var MyComponent = React.createClass({
    propTypes: { }
});

React.Component:

export default class MyComponent extends React.Component{ }
MyComponent.prototypes = { }

默认属性:React.createClass:

var MyComponent = React.createClass({
    getDefaultProps(): { return {} }
});

React.Component:

export default class MyComponent extends React.Component{ }
MyComponent.defaultProps = { }

状态: React.createClass:

State changes can be made inside getInitialState() function

React.Component:

State changes can be made inside constructor(props) function

这个:
React.createClass:

automatically bind 'this' values.
Ex: <div onClick={this.handleClick}></div>
'this' can be accessed by default in handleClick function

React.Component:

whereas here we need to bind explicitly,
Ex: <div onClick={this.handleClick.bind(this)}></div>

谢谢您提供的所有示例 :) 在 React.Component 中:类似于 MyComponent.defaultProps,我们是否有选项 MyComponent.defaultState? - Pravin W

3

看起来React建议我们使用React.createClass

据我所知

  1. MyComponent extends React.Component不支持getInitialState()

  2. React.createClass中使用.bind(this)你会得到这个

    警告:bind():您正在将组件方法绑定到组件。React会以高性能的方式自动完成这项工作,因此您可以安全地删除此调用。

我认为这可能不止如此。

如果有人列出所有React.createClass的功能将会很好。

注意:React目前处于0.14.3版本。


1
根据 https://facebook.github.io/react/blog/2015/03/10/react-v0.13.html 的说法,从v0.13开始,他们计划在某个时候删除React.createClass()语法,转而使用其他语法。“我们的最终目标是完全用ES6类替换React.createClass,但在语言中没有当前mixin用例的替代方案和类属性初始化程序的支持之前,我们不打算弃用React.createClass。” - Gonzalo.-

0
说实话,唯一的区别就是React.createClass使用mixins而新的ES6语法则不使用。
两者都只是语法,选择最适合你的。React实际上希望在未来的更新中弃用React.createClass,转而使用ES6语法。
因此,我建议您和未来的用户查看这些链接,因为本主题中的大多数答案都与详细解释相关。

https://ultimatecourses.com/blog/react-create-class-versus-component

https://www.newline.co/fullstack-react/articles/react-create-class-vs-es6-class-components/


哦,我明白了。我只是认为这样做会重复,因为代码示例和片段已经在链接的页面上了。但是感谢你的提示,我会在以后实施! - Precious Adeyinka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接