2016-06-13 13 views
25

Nach this babel Dokumentation, die richtige Art und Weise mit ES6 + zu verwenden Reagieren auf Ausgangskomponenten ist wie folgt:Ist es besser, den Status im Konstruktor zu definieren oder Eigenschaftsinitialisierungen zu verwenden?

class Video extends React.Component { 
    static defaultProps = { 
    autoPlay: false, 
    maxLoops: 10, 
    } 
    static propTypes = { 
    autoPlay: React.PropTypes.bool.isRequired, 
    maxLoops: React.PropTypes.number.isRequired, 
    posterFrameSrc: React.PropTypes.string.isRequired, 
    videoSrc: React.PropTypes.string.isRequired, 
    } 
    state = { 
    loopsRemaining: this.props.maxLoops, 
    } 
} 

Aber einige offizielle Beispiele, wie Dan Abramov eigenen React DnD Modul verwendet ES6 + sondern definiert noch Staat innerhalb der Konstruktor:

constructor(props) { 
    super(props); 
    this.moveCard = this.moveCard.bind(this); 
    this.state = { 
     // state stuff 
    } 
} 

Jetzt Dan Abramov, einen bedeutenden Beitrag zu sein, weiß wahrscheinlich zu reagieren, dass er Staat außerhalb der Konstruktor definieren, noch setzt sie noch im Konstruktor zu tun.

Also frage ich mich nur, welcher Weg besser ist und warum?

+1

Es gibt keine schlechte oder gute, sie sind gleichwertig, es ist eine Frage der Präferenz –

+3

Klasse Eigenschaften sind ein ** Vorschlag **. Sie sind ** nicht ** Teil von ES7. Bitte lesen Sie mindestens die Beschreibung des Tags: [tag: ecmascript-7]. –

Antwort

40
+2

Huh, ordentlich. Danke für die REPL! – abustamam

0

Dans Code hat tatsächlich einen subtilen Fehler, weshalb ich die initializers empfehlen die Verwendung, wenn möglich. React Komponentenkonstruktoren nehmen zwei Argumente - Requisiten und den Kontext. Er übergibt es nicht an den übergeordneten Konstruktor, und es könnte leicht von einem anderen Entwickler übersehen werden, der es benötigt.

Manchmal haben Sie keine Wahl, wie wenn der initializer hängt von den Konstruktor Argumente, so dass nur alle Argumente an die Eltern weitergeben erinnern.

Nachdem ich ein paar Dinge ausprobiert habe, sieht es so aus, als hätte React nicht das Problem, an das ich gedacht habe. Sie können alles, was Sie wollen, an den Elternkonstruktor übergeben, und es ist in Ordnung. Z.B .:

class MyComponent extends React.Component { 
    constructor(props) { 
    super({}) 
    } 

    render() { 
    // this.props will still be set correctly here 
    } 
} 

Ich empfehle immer noch die initializers Verwendung als nicht den übergeordneten Konstruktor aufrufen zu müssen ist eine Sache weniger, um darüber nachzudenken.

+0

Ich hatte keine Ahnung, dass React-Konstruktoren zwei Argumente hatten. Was ist der Kontext? – abustamam

+1

Es ist eine Möglichkeit, Daten an Komponenten weiter unten in der Hierarchie weiterzugeben, ohne Requisiten für alle Intermediäre festlegen zu müssen. Ich habe ein paar Tests ausprobiert und sieht aus, als ob React nicht das Problem hat, das ich erwähnte. Punkt ist jedoch immer noch gültig. – Gunchars

+0

"Sie können übergeben, was Sie wollen, an den Elternkonstruktor und es wird gut" - NOPE. https://facebook.github.io/react/docs/react-component.html#constructor und auch: https://facebook.github.io/react/docs/state-and-lifecycle.html – Tomasz

Verwandte Themen