2015-11-04 3 views
39

Что отличается отReact.createClass против расширяет компонент

var MyClass = React.createClass({...}); 

Для

class MyClass extends React.Component{...} 
+0

Там на самом деле больше различий, чем 'getInitialState' прокомментировал в принятом ответ. Кроме того, различия заключаются в следующем: использование 'this'; использование 'defaultProps'; использование _mixins_. Вы можете прочитать об этих изменениях в этой статье: https://toddmotto.com/react-create-class-versus-component/ –

ответ

39

Эти два способа зависит от того, если вы используете синтаксис 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 */ }; 
    }, 
}); 

Они оба будут работать так же, как настроить начальное состояние.

4

С синтаксисом 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 */ 
    } 
} 
4

Одним из основных дифференцирующим не упоминалось выше, как state наследуется при использовании createClass против extendingComponent.

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) 
    } 
} 
+1

Что это значит (createClass позволяет наследовать состояние) означает? –

+0

Наследование - очень распространенная концепция ООП. Вы можете прочитать больше [здесь] (https://en.wikipedia.org/wiki/Inheritance_ (object-oriented_programming)). Это просто означает, что хотя 'Test' не определяет' foo' в своем 'состоянии', он получает его от своего родителя, когда он расширяет' BaseClass'. –

+0

Обратите внимание, что это не идиоматический React - вы должны ** только ** расширять 'React.Component' при разработке классов React (и в идеале использовать функциональные компоненты, если это возможно). Предпочитают композицию для наследования. – Idefixx

0

React.createClass

Здесь мы имеем константный с классом React присвоенной с важной функцией визуализации вслед, чтобы завершить типичное определение базового компонента.

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; 

С точки зрения JavaScript мы сейчас, используя классы ES6, как правило, это будет использоваться с чем-то вроде Вавилонской для компиляции ES6 в ES5, чтобы работать в других браузерах. С этим изменением введем конструктор , где нам нужно позвонить super(), чтобы передать реквизиты на React.Component.

Для Реагировать изменения, мы теперь создать класса под названием «Контакты» и расширить от React.Component вместо обращающегося React.createClass непосредственно, который использует меньше Реагировать шаблонный и больше JavaScript. Это важное изменение, чтобы отметить дальнейшие изменения, возникающие при смене синтаксиса.

More

Смежные вопросы