Was ist der Unterschied zwischen der Verwendung von Konstruktor vs. Zustand = {}, um den Zustand in der Reaktionskomponente zu deklarieren?

Lesezeit: 2 Minuten

Was ist der Unterschied zwischen der Verwendung von Konstruktor vs
Träume

Ich habe festgestellt, dass es zwei Möglichkeiten gibt, den Zustand in der Klassenkomponente wie unten zu deklarieren

class App extends Component {
    constructor(props) {
        super(props);
        this.state = {
            name: 'John'
        }
    }

    render() {
        return  <div>{this.state.name}</div>
    }

}

und

class App extends Component {
    state = {
       name: 'John'
    }

    render() {
        return  <div>{this.state.name}</div>
    }

}

Was ist der Unterschied zwischen diesen beiden?

Was ist der Unterschied zwischen der Verwendung von Konstruktor vs
Alik

Sie sind ungefähr gleichwertig. Der wesentliche Unterschied besteht darin, dass der Initialisierer im zweiten Beispiel vorher ausgeführt wird constructor.

Der zweite Ansatz verwendet Klassenfelder Vorschlag.

Es ist noch kein Teil des ECMAScript-Standards, daher müssen Sie den Transpiler richtig einrichten, um den zweiten Ansatz zu verwenden.

UPD Schauen Sie sich an Babel-Ausgabe um besser zu verstehen, wie öffentliche Instanzfelder funktionieren.

Verwenden Sie den Konstruktor, wenn Sie speichern möchten props Daten hinein state

class App extends Component {
  constructor(props){
    super(props);
    this.state = {
      name: 'John'
    }
  }
}

Andernfalls können Sie die direkt einstellen state für hartcodierte Daten

class App extends Component {
  state = {
    name: 'John'
  }
}

  • Anscheinend gilt das nicht mehr. Ich kann dem Zustand direkt in der Klasse den Props-Wert zuweisen state = { time: this.props.time, };

    – Dawid Adach

    14. Januar 19 um 11:37 Uhr

  • Das Hinzufügen einer Stütze zum Zustand wird normalerweise als Anti-Muster angesehen: Reactjs.org/docs/react-component.html#constructor. Es sei denn, Sie möchten den Zustand explizit ableiten

    – Remi

    22. Juli 19 um 9:11 Uhr

Wenn Sie einer Klasse eine Methode hinzufügen, wird sie tatsächlich zum Prototyp der Funktion hinzugefügt. so:

class Same{
  thing() {}
}

// Equivalent to:

function Same() {}
Same.prototype.thing = function () {}

Sache wird einmal definiert und von allen Instanzen der Klasse gemeinsam genutzt.

Wenn Sie es umgestalten, um Klassenfelder wie folgt zu verwenden:

class Animal {
  thing() {}
  anotherThing = () => {} // Class Field
}

// Equivalent to:

function Animal () {
  this.anotherThing = function () {}
}

Animal.prototype.thing = function () {}

etwas anderes wird auf jeder neu erstellten Instanz und nicht auf dem Prototyp definiert.

Entwicklungserfahrung vs. Leistung

Es ist ein Kompromiss, den Sie berücksichtigen sollten. Klassenfelder lassen Ihren Code lesbar und sauber aussehen. Class Fields behält jedoch eine Kopie von etwas anderes in jedem Ihrer Fälle.

Daher sollten Sie sorgfältig überlegen, ob Sie sie verwenden möchten.

  • „Klassenfelder bewahren in jeder Ihrer Instanzen eine Kopie von anotherThing auf“ ist das nicht auch das, was ein Konstruktor tut?

    – Vikrant

    26. Februar 19 um 9:13 Uhr

  • Hallo @vikrant! Ihre Frage leitet sich von der OOP-Vererbung (wie in Java) ab, wenn ich sie richtig verstanden habe. In Java erstellen Konstruktoren tatsächlich ein anderes Ding für jede Instanz. In Javascript verhalten sich die Dinge “etwas” anders. Die Prototyp-Kette behält für jede Instanz einen Verweis auf ein anderes Ding, was sie leicht und schlank macht. Eine großartige Buchreihe (von Kyle Simpson) wirft Licht auf die nackten Knochen der Javascript-Grundlagen. Ich empfehle Ihnen dringend, diesen Abschnitt speziell zu lesen: github.com/getify/You-Dont-Know-JS/blob/master/…

    – Tomer

    26. Februar 19 um 10:14 Uhr


.

584760cookie-checkWas ist der Unterschied zwischen der Verwendung von Konstruktor vs. Zustand = {}, um den Zustand in der Reaktionskomponente zu deklarieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy