Wann ist es wichtig , passieren props
zu super()
, und warum?
class MyComponent extends React.Component {
constructor(props) {
super(); // or super(props) ?
}
}
Wann ist es wichtig , passieren props
zu super()
, und warum?
class MyComponent extends React.Component {
constructor(props) {
super(); // or super(props) ?
}
}
Antworten:
Es gibt nur einen Grund , wenn man passieren muss , props
um super()
:
Wenn Sie this.props
im Konstruktor zugreifen möchten .
Vorbeigehen:
class MyComponent extends React.Component {
constructor(props) {
super(props)
console.log(this.props)
// -> { icon: 'home', … }
}
}
Nicht vorbei:
class MyComponent extends React.Component {
constructor(props) {
super()
console.log(this.props)
// -> undefined
// Props parameter is still available
console.log(props)
// -> { icon: 'home', … }
}
render() {
// No difference outside constructor
console.log(this.props)
// -> { icon: 'home', … }
}
}
Beachten Sie, dass vorbei oder nicht vorbei props
an super
hat keinen Einfluss auf die spätere Verwendungen von this.props
außen constructor
. Das heißt render
, shouldComponentUpdate
oder Ereignishandler haben immer Zugriff darauf.
Dies wird ausdrücklich in einer Antwort von Sophie Alpert auf eine ähnliche Frage gesagt .
In der Dokumentation - Status und Lebenszyklus, Hinzufügen eines lokalen Status zu einer Klasse, Punkt 2 - wird empfohlen:
Klassenkomponenten sollten immer den Basiskonstruktor mit aufrufen
props
.
Es wird jedoch kein Grund angegeben. Wir können spekulieren, dass dies entweder auf Unterklassen oder auf zukünftige Kompatibilität zurückzuführen ist.
(Danke @MattBrowne für den Link)
this.props
ist undefined
es sei denn, an übergeben super()
. In beiden Fällen hat dies keinen Einfluss auf das spätere Rendern oder die Verfügbarkeit this.props
der render()
Funktion.
super
, haben Sie im Konstruktor einen Verweis darauf.
props
an super()
folgende Adresse übergeben : facebook.github.io/react/docs/… . Ich bin mir nicht sicher, warum, da, wie Sie hervorheben, this.props
auf andere Weise auf beide Methoden zugegriffen werden kann. Vielleicht empfehlen sie dies aus Gründen der zukünftigen Kompatibilität, falls zukünftige Versionen von React möglicherweise etwas props
im Konstruktor tun möchten .
props
super
props
ich jemals darauf übergehen , wenn, wie Sie betont haben, der Parameter genau dort verfügbar ist, damit wir ihn im Konstruktor verwenden können , und this.props
überall anders funktioniert? Gibt es überhaupt einen Vorteil, wenn man this.props
mehr als nur verwendet props
? Ist es eine schlechte Praxis, props
im Konstruktor abzubrechen? Ich glaube , ich bin immer noch nicht um einen Fall zu sehen , wenn Sie jemals passieren bräuchten props
zu super
, aber ich bin bereit , es ist nur meine Unwissenheit zu wetten, ha.
super(props)
, können Sie Methoden aufrufen, die this.props
vom Konstruktor aus verwendet werden this.doStuffUsingThisDotProps()
, ohne den Parameter props an diese Methoden / Funktionen übergeben zu müssen. Ich habe gerade einen Konstruktor geschrieben, der dies tut, was anscheinend erfordern würde, dass ich super(props)
zuerst gemäß den Antworten auf diese Frage benutze .
In diesem Beispiel erweitern Sie die React.Component
Klasse, und gemäß der ES2015-Spezifikation kann ein untergeordneter Klassenkonstruktor erst dann verwendet werden, this
wenn super()
er aufgerufen wurde. Außerdem müssen ES2015-Klassenkonstruktoren aufrufen, super()
wenn sie Unterklassen sind.
class MyComponent extends React.Component {
constructor() {
console.log(this); // Reference Error
}
render() {
return <div>Hello {this.props.name}</div>;
}
}
Im Gegensatz:
class MyComponent extends React.Component {
constructor() {
super();
console.log(this); // this logged to console
}
render() {
return <div>Hello {this.props.name}</div>;
}
}
Weitere Details finden Sie in dieser hervorragenden Antwort zum Stapelüberlauf
Möglicherweise sehen Sie Beispiele für Komponenten, die durch Erweitern der React.Component
Klasse erstellt wurden und nicht aufgerufen werden. super()
Sie werden jedoch feststellen, dass diese keine haben constructor
, weshalb dies nicht erforderlich ist.
class MyOtherComponent extends React.Component {
render() {
return <div>Hi {this.props.name}</div>;
}
}
Ein Punkt der Verwirrung, den ich von einigen Entwicklern gesehen habe, mit denen ich gesprochen habe, ist, dass die Komponenten, die keine haben constructor
und daher super()
nirgendwo aufrufen , immer noch this.props
in der render()
Methode verfügbar sind . Denken Sie daran, dass diese Regel und die Notwendigkeit, eine this
Bindung für die zu erstellen, constructor
nur für die gilt constructor
.
super()
und super(props)
).
Wenn Sie props
an übergeben super
, werden die Requisiten zugewiesen this
. Schauen Sie sich das folgende Szenario an:
constructor(props) {
super();
console.log(this.props) //undefined
}
Wie auch immer, wenn Sie:
constructor(props) {
super(props);
console.log(this.props) //props will get logged.
}
Wie pro Quellcode
function ReactComponent(props, context) {
this.props = props;
this.context = context;
}
Sie müssen props
jedes Mal bestehen, wenn Sie Requisiten haben, und Sie setzen sie nicht this.props
manuell ein.
super(props)
und den anderen nicht. Aber ihre Verbraucher setzen beide Requisiten. Was ist der Unterschied?
this.props = props
und super(props)
ist dasselbe?
this.props
von außen festgelegt - unabhängig davon, was im Konstruktor ausgeführt wird.
Dan Abramov hat einen Artikel zu diesem Thema geschrieben:
Warum schreiben wir super (Requisiten)?
Und das Wesentliche dabei ist, dass es hilfreich ist, die Gewohnheit zu haben , es zu bestehen, um dieses Szenario zu vermeiden. Ehrlich gesagt sehe ich es nicht als unwahrscheinlich an:
// Inside React
class Component {
constructor(props) {
this.props = props;
// ...
}
}
// Inside your code
class Button extends React.Component {
constructor(props) {
super(); // 😬 We forgot to pass props
console.log(props); // ✅ {}
console.log(this.props); // 😬 undefined
}
// ...
}
super()
wird verwendet, um den übergeordneten Konstruktor aufzurufen.
super(props)
würde props
an den übergeordneten Konstruktor übergeben.
In Ihrem Beispiel super(props)
würde der übergebende React.Component
Konstruktor props
als Argument aufgerufen .
Weitere Informationen unter super
:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super
Bei der Implementierung der constructor()
Funktion in einer React-Komponente super()
ist dies erforderlich. Beachten Sie, dass Ihre MyComponent
Komponente Funktionen aus der React.Component
Basisklasse erweitert oder ausleiht .
Diese Basisklasse hat eine eigene constructor()
Funktion, die Code enthält, um unsere React-Komponente für uns einzurichten.
Wenn wir eine constructor()
Funktion innerhalb unserer MyComponent
Klasse definieren , überschreiben oder ersetzen wir im Wesentlichen die constructor()
Funktion innerhalb der React.Component
Klasse, müssen jedoch sicherstellen, dass der gesamte Setup-Code innerhalb dieser constructor()
Funktion weiterhin aufgerufen wird.
So , um sicherzustellen , dass die React.Component
s‘ constructor()
Funktion aufgerufen wird, rufen wir super(props)
. super(props)
ist ein Hinweis auf die Elternfunktion constructor()
, das ist alles was es ist.
Wir müssen super(props)
jedes Mal hinzufügen, wenn wir eine constructor()
Funktion innerhalb einer klassenbasierten Komponente definieren.
Wenn wir dies nicht tun, wird ein Fehler angezeigt, der besagt, dass wir anrufen müssen super(props)
.
Der gesamte Grund für die Definition dieser constructor()
Funktion besteht darin, unser Statusobjekt zu initialisieren.
Um unser Statusobjekt zu initialisieren, schreibe ich unter den Superaufruf:
class App extends React.Component {
constructor(props) {
super(props);
this.state = {};
}
// React says we have to define render()
render() {
return <div>Hello world</div>;
}
};
Also haben wir unsere constructor()
Methode definiert, unser Statusobjekt initialisiert, indem wir ein JavaScript-Objekt erstellt, ihm eine Eigenschaft oder ein Schlüssel / Wert-Paar zugewiesen und das Ergebnis davon zugewiesen haben this.state
. Dies ist hier natürlich nur ein Beispiel, daher habe ich dem Statusobjekt nicht wirklich ein Schlüssel / Wert-Paar zugewiesen, es ist nur ein leeres Objekt.
Hier ist die Geige, die ich gemacht habe: jsfiddle.net . Es zeigt, dass Requisiten standardmäßig nicht im Konstruktor zugewiesen sind. Soweit ich weiß, werden sie in der Methode bewertet React.createElement
. Daher super(props)
sollte nur dann , wenn die übergeordnete Klasse Konstruktor manuell assings aufgerufen werden props
zu this.props
. Wenn Sie nur den React.Component
Anruf verlängern , super(props)
wird nichts mit Requisiten tun. Vielleicht wird es in den nächsten Versionen von React geändert.
Hier erhalten wir dies nicht im Konstruktor, so dass es undefiniert zurückgibt, aber wir können dies außerhalb der Konstruktorfunktion abrufen
class MyComponent extends React.Component {
constructor() {
console.log(this); // Reference Error i.e return undefined
}
render() {
return <div>Hello {this.props.name}</div>;
}
}
Wenn wir super () verwenden, können wir die Variable "this" auch im Konstruktor abrufen
class MyComponent extends React.Component {
constructor() {
super();
console.log(this); // this logged to console
}
render() {
return <div>Hello {this.props.name}</div>;
}
}
Also, wenn wir super () verwenden; Wir werden dies abrufen können, aber this.props sind im Konstruktor undefiniert. Anders als der Konstruktor gibt this.props jedoch nicht undefiniert zurück.
Wenn wir super (Requisiten) verwenden, können wir diesen.props-Wert auch im Konstruktor verwenden
Wenn Sie this.props im Konstruktor verwenden möchten, müssen Sie Requisiten an super übergeben. Andernfalls spielt es keine Rolle, da React unmittelbar nach dem Aufruf des Konstruktors .props von außen auf die Instanz setzt.
Für die Reaktionsversion 16.6.3 verwenden wir super (Requisiten) , um den Namen des Statuselements zu initialisieren : this.props.name
constructor(props){
super(props);
}
state = {
name:this.props.name
//otherwise not defined
};