Was ist der Unterschied zwischen "super()" und "super" (Requisiten)" Reagieren, wenn mit es6-Klassen?
Wann ist es wichtig, pass props
zu super()
, und warum?
class MyComponent extends React.Component {
constructor(props) {
super(); //or super(props) ?
}
}
InformationsquelleAutor Misha Moroshko | 2015-06-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es nur einen Grund, wenn man braucht, um pass
props
zusuper()
:, Wenn Sie zugreifen möchten
this.props
im Konstruktor.Vorbei:
Nicht vorbei:
Beachten Sie, dass die Weitergabe oder nicht Weitergabe
props
zusuper
hat keine Wirkung auf späteren Nutzung desthis.props
außerhalbconstructor
. Das istrender
,shouldComponentUpdate
oder event-Handler immer Zugriff darauf haben.Dies ist ausdrücklich gesagt in eine Sophie Alpert ist Antwort zu einer ähnlichen Frage.
Dokumentation—Zustand und Lebenszyklus, Hinzufügen von Lokalen Zustand zu einer Klasse, Punkt 2—empfiehlt:
Allerdings kein Grund ist, zur Verfügung gestellt. Wir können spekulieren, es ist entweder, weil der Unterklassen oder für zukünftige Kompatibilität.
(Danke @MattBrowne für den link)
this.props
istundefined
es sei denn, übergebensuper()
. So oder so, ist es nicht auf später-rendering oder die Verfügbarkeit vonthis.props
imrender()
Funktion.Nein, dem rest der Klasse hängt nicht von diesem Konstrukt, das ist der Punkt. Komponente erhält den Requisiten eine andere Weise, die durch parameter des Konstruktors. Und da Sie passieren erste Requisiten, um
super
Sie haben Verweis auf Sie in den Konstruktor.Entsprechend Reagieren die Dokumentation, Sie sollte immer passieren
props
zusuper()
: facebook.github.io/reagieren/docs/.... Ich bin mir nicht sicher, warum, da, wie duthis.props
zugänglich ist, das in anderen Methoden oder so...vielleicht sind Sie zu empfehlen dieses für die künftige Kompatibilität bei zukünftigen Versionen Reagieren, vielleicht möchten etwas zu tun mitprops
im Konstruktor?Vielleicht bin ich auch nur das öffnen einer Dose Würmer hier, aber warum immer übergeben
props
zusuper
wenn, wie gesagt, dieprops
parameter ist richtig, es für uns zu verwenden, innerhalb des Konstruktors, undthis.props
funktioniert überall sonst? Ist es ein Vorteil, bei der alle mitthis.props
über nurprops
? Ist es schlechte Praxis, um destructure aus derprops
im Konstruktor? Ich glaube, ich bin noch immer nicht zu sehen, wenn Sie jemals brauchen, um passierenprops
zusuper
, aber ich bin bereit zu Wetten, es ist einfach meine Unwissenheit, ha.Wenn Sie
super(props)
können Sie Methoden aufrufen, die Verwendungthis.props
im Konstruktor von, wiethis.doStuffUsingThisDotProps()
ohne pass auf die Requisiten, die parameter für diese Methoden/Funktionen. Ich schrieb gerade einen Konstruktor, dies zu tun, die scheinbar würde von mir verlangen, zu verwendensuper(props)
ersten, nach den Antworten auf diese Frage.InformationsquelleAutor Robin Pokorny
In diesem Beispiel erweitern Sie die
React.Component
Klasse, und pro die ES2015 spec, eine Kind-Klasse-Konstruktor nicht nutzen kannthis
bissuper()
genannt worden ist; auch, ES2015 Klasse Konstruktoren aufrufensuper()
wenn Sie Unterklassen.Dagegen:
Mehr detail als pro diese ausgezeichnete stack overflow-Antwort
Können Sie sehen Beispiele für Komponenten erstellt durch die Verlängerung der
React.Component
Klasse, nicht nennensuper()
aber Sie werden feststellen, diese nicht über eineconstructor
, also warum es nicht notwendig ist.Einem Punkt der Verwirrung, die ich gesehen habe von einigen Entwicklern, die ich gesprochen habe, ist, dass die Komponenten, die keine
constructor
und daher nichtsuper()
überall, nochthis.props
erhältlich in denrender()
Methode. Denken Sie daran, dass diese Regel und diese müssen zum erstellen einerthis
verbindlich für dieconstructor
gilt nur für dieconstructor
.super()
undsuper(props)
).InformationsquelleAutor Dave
Wenn Sie übergeben
props
zusuper
die Requisiten zugewiesen bekommenthis
. Werfen Sie einen Blick auf das folgende Szenario:Wie immer, wenn Sie das tun :
InformationsquelleAutor Nahush Farkande
Als pro source code
müssen Sie passieren
props
jedes mal, wenn Sie die Requisiten und die Sie nicht setzen Sie Sie inthis.props
manuell.super(props)
und der andere nicht. Aber Ihre Verbraucher eingestellt und Requisiten. Was ist der Unterschied?Bedeutet das, dass
this.props = props
undsuper(props)
sind die gleiche Sache?Das ist nicht wahr. ReactElement tatsächlich setzt
this.props
von "außerhalb" –unabhängig davon, was geschieht im Konstruktor.InformationsquelleAutor zerkms
super()
wird verwendet, um den Aufruf des übergeordneten Konstruktors.super(props)
würde passierenprops
zu den übergeordneten Konstruktor.Aus deinem Beispiel
super(props)
nennen würde, dieReact.Component
Konstruktor übergebenprops
als argument.Mehr Informationen auf
super
:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super
InformationsquelleAutor kspence
Bei der Umsetzung der
constructor()
Funktion innerhalb einer Reagieren Komponentesuper()
ist eine Voraussetzung. Beachten Sie, dass IhreMyComponent
Komponente ist die Verlängerung oder übernahme von Funktionen derReact.Component
Basisklasse.Diese Basisklasse hat eine
constructor()
eigene Funktion, code, in der es, um das setup unserer Reagieren Komponente für uns.Wenn wir definieren eine
constructor()
Funktion innerhalb unsererMyComponent
Klasse, wir sind im wesentlichen, überschreiben oder ersetzen derconstructor()
Funktion, die innerhalb derReact.Component
Klasse, aber wir müssen noch um sicherzustellen, dass alle setup-code, der in dieserconstructor()
Funktion noch aufgerufen wird.So, um sicherzustellen, dass die
React.Component
'sconstructor()
Funktion aufgerufen wird, nennen wirsuper(props)
.super(props)
ist ein Verweis auf die Elternconstructor()
Funktion, das ist alles.Fügen wir
super(props)
jedes einzelne mal, wenn wir definieren eineconstructor()
- Funktion innerhalb einer Klasse-basierte Komponente.Wenn wir nicht wir werden sehen, eine Fehlermeldung besagt, dass wir haben, zu nennen
super(props)
.Der ganze Grund für die Definition dieser
constructor()
funciton ist die Initialisierung unseres Staates-Objekt.So, in Reihenfolge zu initialisieren, unsere state-Objekt, unter dem super-Aufruf werde ich schreiben:
So haben wir bestimmt unsere
constructor()
Methode, initialisiert unserer state-Objekt durch das erstellen eines JavaScript-Objekts, das zuordnen einer Eigenschaft oder eines Schlüssel/Wert-paar, weisen das Ergebnis, dassthis.state
. Nun dies ist natürlich nur ein Beispiel, damit ich hier wirklich nicht zugewiesenen Schlüssel/Wert-paar an den Staat Objekt, es ist nur ein leeres Objekt.InformationsquelleAutor Daniel
Dan Abramov schrieb einen Artikel zu diesem Thema:
https://overreacted.io/why-do-we-write-super-props/
Und der Kern von ihm ist, dass es hilfreich ist, um eine Gewohnheit vorbei es um dieses Szenario zu vermeiden, dass ehrlich gesagt, ich sehe es nicht unwahrscheinlich:
InformationsquelleAutor Alfonso Pérez
Hier ist die Geige, die ich gemacht habe: https://jsfiddle.net/beshanoe/zpxbLw4j/1/. Es zeigt, dass die Requisiten zugeordnet sind, nicht im Konstruktor standardmäßig. Wie ich verstehe, Sie entsprechen in der Methode
React.createElement
. Dahersuper(props)
sollte nur aufgerufen werden, wenn der superclass-Konstruktor manuell assingsprops
zuthis.props
. Wenn Sie nur die Erweiterung derReact.Component
aufrufensuper(props)
wird nichts tun, mit Requisiten. Vielleicht wird Es geändert werden in den nächsten Versionen zu Reagieren.InformationsquelleAutor beshanoe
Hier werden wir nicht bekommen, diese im Konstruktor, so wird undefined zurück, aber wir werden in der Lage sein zu Holen dieses außerhalb der Konstruktor-Funktion
Wenn wir mit super(), dann können wir Sie Holen sich das "diese" variable innerhalb des Konstruktors als auch
So, wenn wir mit super(); wir werden in der Lage sein zu Holen dieses aber das.Requisiten werden nicht-definierten Konstruktor. Aber anders als Konstruktor.Requisiten werden nicht undefined zurück.
Wenn wir mit super(Requisiten), dann können wir diesen verwenden.Requisiten-Wert im inneren der Konstruktor als auch
Sophie Alpert Antwort
InformationsquelleAutor VIKAS KOHLI
Für reagieren version 16.6.3, verwenden wir super(Requisiten) zu initialisieren element state name : das.Requisiten.name
InformationsquelleAutor shubham kapoor