var MyClass = React.createClass({...});
之間的不同,以
class MyClass extends React.Component{...}
var MyClass = React.createClass({...});
之間的不同,以
class MyClass extends React.Component{...}
這兩種方式取決於如果您正在使用ES6語法與否,他們也改變設定的方式你的初始狀態。
使用ES6類時,您應該初始化constructor
中的狀態。
使用React.createClass時,您必須使用getInitialState
函數。
ES6類語法:
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = { /* initial state, this is ES6 syntax (classes) */ };
}
}
ES5 React.CreateClass語法:
var MyComponent = React.createClass({
getInitialState() {
return { /* initial state */ };
},
});
這些都將同樣的方式工作,以建立初始狀態。
隨着class MyClass extends React.Component{...}
語法,
不能使用的混入,你需要的方法自己
class MyClass extends Component {
constructor() {
super();
this.handleClick.bind(this);
}
handleClick() {
this.setState(...);
}
}
的情況下綁定到我這是最大的區別。
更換混入,你可以使用一個容器來包裝你的組件
export default Container(MyClass);
function Container(Component) {
var origin = Component.prototype.componentDidMount;
Component.prototype.componentDidMount = function() {
origin.apply(this, arguments);
/* do mixin */
}
}
一個主要區別不是上面提到的是state
如何使用createClass
VS extending
一個Component
時繼承。
var BaseComponent extends Component {
constructor(props) {
super(props);
this.state = {
foo: 'bar'
};
}
});
var BaseClass = React.createClass({
getInitialState() {
return {
foo: 'bar'
};
}
});
class Test extends BaseClass { // or extend BaseComponent
constructor(props){
super(props);
this.state = {
...this.state,
myNewVar: 'myNewVal'
}
render() {
alert(this.state.foo)
}
}
這個(createClass允許繼承狀態)行是什麼意思? –
繼承是一個非常普遍的面向對象的概念。你可以閱讀更多[這裏](https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming))。它只是意味着儘管'Test'沒有在其'state'上定義'foo',它在擴展'BaseClass'時從它的父節點獲取它。 –
請注意,這不是慣用的React - 您應該只在**設計React類時擴展'React.Component'(如果可能,理想情況下使用功能組件)。喜歡構成繼承。 – Idefixx
React.createClass
在這裏,我們有分配陣營類常量,具有重要的渲染功能,下面就來完成一個典型的基礎組件定義。
import React from 'react';
const Contacts = React.createClass({
render() {
return (
<div></div>
);
}
});
export default Contacts;
React.Component
讓我們以上述React.createClass定義,並將其轉換爲使用ES6類。
import React from 'react';
class Contacts extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div></div>
);
}
}
export default Contacts;
從現在開始我們使用ES6類一個JavaScript的角度來看,這通常會用像巴貝爾用來編譯器ES6到ES5在其他瀏覽器。有了這個變化,我們引入了構造函數,我們需要調用super()將道具傳遞給React.Component。
對於變化做出反應,我們現在創建一個類所謂的「聯繫人」和延長從React.Component而不是訪問React.createClass直接,使用較少陣營樣板和更多的JavaScript。這是一個重要的改變,要注意這個語法交換帶來的進一步變化。
實際上,有超過分歧'getInitialState'評論中接受的答案。另外,區別在於:使用'this';使用'defaultProps';使用_mixins_。你可以閱讀這篇文章中的這些變化:https://toddmotto.com/react-create-class-versus-component/ –