2015-11-04 11 views
39

Qual è la differenza traReact.createClass vs estende Componente

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

Per

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

C'è in realtà più differenze che il 'getInitialState' commentato nella risposta accettata. Inoltre le differenze riguardano: l'uso di 'this'; uso di 'defaultProps'; uso di _mixins_. Puoi leggere di questi cambiamenti in questo articolo: https://toddmotto.com/react-create-class-versus-component/ –

risposta

39

Questi due modi dipendono da se si utilizza la sintassi ES6 o no, e cambiano anche il modo in cui si imposta il tuo stato iniziale

Quando si utilizzano classi ES6, è necessario inizializzare lo stato in constructor.

Quando si utilizza React.createClass, è necessario utilizzare la funzione getInitialState.

ES6 Classe Sintassi:

class MyComponent extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { /* initial state, this is ES6 syntax (classes) */ }; 
    } 
} 

ES5 React.CreateClass sintassi:

var MyComponent = React.createClass({ 
    getInitialState() { 
    return { /* initial state */ }; 
    }, 
}); 

Questi saranno entrambi funzionano allo stesso modo per impostare lo stato iniziale.

4

Con la sintassi class MyClass extends React.Component{...},

non è possibile utilizzare mixins e avete bisogno di impegnare la contesto del metodo da soli

class MyClass extends Component { 
    constructor() { 
    super(); 
    this.handleClick.bind(this); 
    } 

    handleClick() { 
    this.setState(...); 
    } 
} 

a me queste sono le maggiori differenze.

per sostituire il mixin, è possibile utilizzare un contenitore per avvolgere il componente

export default Container(MyClass); 

function Container(Component) { 
    var origin = Component.prototype.componentDidMount; 
    Component.prototype.componentDidMount = function() { 
     origin.apply(this, arguments); 
     /* do mixin */ 
    } 
} 
4

Un importante elemento di differenziazione non precedentemente indicate è come il state è ereditata quando si utilizza createClass vs extending un 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) 
    } 
} 
+1

cosa significa questo (createClass permette di ereditare lo stato)? –

+0

L'ereditarietà è un concetto di OOP molto comune. Puoi leggere di più [qui] (https://en.wikipedia.org/wiki/Inheritance_ (object-oriented_programming)). Significa solo che sebbene 'Test' non definisca' pippo' sul suo 'stato', lo ottiene dal suo genitore quando estende' BaseClass'. –

+0

nota che non si tratta di Reazione idiomatica - si dovrebbe ** solo ** estendere 'React.Component' quando si progettano le classi React (e se possibile utilizzare idealmente i componenti funzionali). Preferisci la composizione all'eredità. – Idefixx

0

React.createClass

Qui abbiamo un const con una classe Reagire assegnato, con l'importante funzione di rendere seguente per completare una definizione tipico componente di base.

import React from 'react'; 

const Contacts = React.createClass({ 
    render() { 
    return (
    <div></div> 
    ); 
    } 
}); 

export default Contacts; 

React.Component

Prendiamo la definizione React.createClass sopra e convertirlo per usare una classe ES6.

import React from 'react'; 

class Contacts extends React.Component { 
    constructor(props) { 
    super(props); 
    } 
    render() { 
    return (
    <div></div> 
); 
} 
} 

export default Contacts; 

Dal punto di vista JavaScript stiamo ora utilizzando le classi ES6, in genere questo sarebbe stato utilizzato con una cosa del genere Babel per compilare l'ES6 per ES5 a lavorare in altri browser. Con questo cambiamento, introduciamo il costruttore , dove dobbiamo chiamare il super() per passare gli oggetti di scena a React.Component.

Per i cambiamenti reagire, ora creare un classe chiamati “Contatti” e estendono da React.Component invece di accedere React.createClass direttamente, che utilizza meno Reagire boilerplate e più JavaScript. Questa è una modifica importante per notare ulteriori modifiche apportate da questo scambio di sintassi.

More

Problemi correlati