Quando è importante passare props
a super()
, e perché?
class MyComponent extends React.Component {
constructor(props) {
super(); // or super(props) ?
}
}
Quando è importante passare props
a super()
, e perché?
class MyComponent extends React.Component {
constructor(props) {
super(); // or super(props) ?
}
}
Risposte:
C'è solo una ragione per cui si deve passare props
a super()
:
Quando si desidera accedere this.props
al costruttore.
passando:
class MyComponent extends React.Component {
constructor(props) {
super(props)
console.log(this.props)
// -> { icon: 'home', … }
}
}
Non passando:
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', … }
}
}
Nota che passare o non passare props
a nonsuper
ha alcun effetto sugli usi successivi this.props
dell'esterno constructor
. Che è render
, shouldComponentUpdate
o gestori di eventi sempre hanno accesso ad esso.
Questo è esplicitamente detto in una risposta di Sophie Alpert a una domanda simile.
La documentazione - Stato e ciclo di vita, Aggiunta di stato locale a una classe, punto 2 - raccomanda:
I componenti di classe devono sempre chiamare il costruttore di base con
props
.
Tuttavia, non viene fornito alcun motivo. Possiamo ipotizzare che sia per sottoclasse o per compatibilità futura.
(Grazie a @MattBrowne per il link)
this.props
è a undefined
meno che non venga passato a super()
. In entrambi i casi, non influisce sul rendering successivo o sulla disponibilità di this.props
nella render()
funzione.
super
, hai riferimento a loro nel costruttore.
props
a super()
: facebook.github.io/react/docs/… . Non sono sicuro del perché, dal momento che come sottolineato this.props
è accessibile in altri modi in entrambi i modi ... forse lo stanno raccomandando per la compatibilità futura nel caso in cui le versioni future di React potrebbero voler fare qualcosa con props
il costruttore?
props
a super
, quando hai sottolineato, il props
parametro è proprio lì disponibile per noi da usare all'interno del costruttore e this.props
funziona ovunque? C'è un vantaggio nell'usare this.props
solo oltre props
? È una cattiva pratica da distruggere props
nel costruttore? Penso che sto ancora non riuscendo a vedere un caso in cui avessi mai bisogno di passare props
a super
, ma io sono pronto a scommettere che è solo la mia ignoranza, ah.
super(props)
, puoi chiamare i metodi che usano this.props
in dal costruttore , come this.doStuffUsingThisDotProps()
, senza dover passare il parametro props a quei metodi / funzioni. Ho appena scritto un costruttore facendo questo, che apparentemente mi richiederebbe di usare super(props)
prima, secondo le risposte a questa domanda.
In questo esempio, si sta estendendo la React.Component
classe e, in base alle specifiche ES2015, un costruttore di classi figlio non può utilizzare this
fino a quando non super()
viene chiamato; inoltre, i costruttori di classe ES2015 devono chiamare super()
se sono sottoclassi.
class MyComponent extends React.Component {
constructor() {
console.log(this); // Reference Error
}
render() {
return <div>Hello {this.props.name}</div>;
}
}
Al contrario:
class MyComponent extends React.Component {
constructor() {
super();
console.log(this); // this logged to console
}
render() {
return <div>Hello {this.props.name}</div>;
}
}
Maggiori dettagli su questa eccellente risposta di overflow dello stack
Potresti vedere esempi di componenti creati estendendo la React.Component
classe che non chiama super()
ma noterai che questi non hanno un constructor
, quindi perché non è necessario.
class MyOtherComponent extends React.Component {
render() {
return <div>Hi {this.props.name}</div>;
}
}
Un punto di confusione che ho visto da alcuni sviluppatori con cui ho parlato è che i componenti che non hanno constructor
e quindi non chiamano da super()
nessuna parte, sono ancora this.props
disponibili nel render()
metodo. Ricorda che questa regola e questa necessità di creare un'associazione this
per l' constructor
unica si applica al constructor
.
super()
e super(props)
).
Quando passi props
a super
, gli oggetti di scena vengono assegnati a this
. Dai un'occhiata al seguente scenario:
constructor(props) {
super();
console.log(this.props) //undefined
}
Come mai quando lo fai:
constructor(props) {
super(props);
console.log(this.props) //props will get logged.
}
Secondo il codice sorgente
function ReactComponent(props, context) {
this.props = props;
this.context = context;
}
devi passare props
ogni volta che hai oggetti di scena e non li metti this.props
manualmente.
super(props)
e l'altra no. Ma i loro consumatori hanno entrambi puntellato. Qual è la differenza?
this.props = props
e super(props)
sono la stessa cosa?
this.props
dall'esterno, indipendentemente da ciò che viene fatto nel costruttore.
Dan Abramov ha scritto un articolo su questo argomento:
Perché scriviamo super (oggetti di scena)?
E l'essenza di ciò è che è utile avere l'abitudine di passarlo per evitare questo scenario, che onestamente, non vedo improbabile che accada:
// 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()
viene utilizzato per chiamare il costruttore principale.
super(props)
passerebbe props
al costruttore principale.
Dal tuo esempio, super(props)
chiamerei il React.Component
costruttore passando props
come argomento.
Ulteriori informazioni su super
:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super
Quando si implementa la constructor()
funzione all'interno di un componente React, super()
è un requisito. Tieni presente che il MyComponent
componente estende o prende in prestito funzionalità dalla React.Component
classe base.
Questa classe base ha una sua constructor()
funzione che contiene del codice al suo interno, per impostare il nostro componente React per noi.
Quando definiamo una constructor()
funzione all'interno della nostra MyComponent
classe, essenzialmente, sovrascriviamo o sostituiamo la constructor()
funzione che si trova all'interno della React.Component
classe, ma dobbiamo ancora assicurarci che tutto il codice di installazione all'interno di questa constructor()
funzione venga ancora chiamato.
Quindi, per garantire che la React.Component
's constructor()
funzione viene chiamata, noi chiamiamo super(props)
. super(props)
è un riferimento alla constructor()
funzione dei genitori , questo è tutto.
Dobbiamo aggiungere super(props)
ogni volta che definiamo una constructor()
funzione all'interno di un componente di classe.
Altrimenti vedremo un errore che dice che dobbiamo chiamare super(props)
.
L'intero motivo per definire questa constructor()
funzione è inizializzare il nostro oggetto stato.
Quindi, al fine di inizializzare il nostro oggetto di stato, sotto la super chiamata scriverò:
class App extends React.Component {
constructor(props) {
super(props);
this.state = {};
}
// React says we have to define render()
render() {
return <div>Hello world</div>;
}
};
Quindi abbiamo definito il nostro constructor()
metodo, inizializzato il nostro oggetto stato creando un oggetto JavaScript, assegnandogli una proprietà o una coppia chiave / valore, assegnandone il risultato this.state
. Ora ovviamente questo è solo un esempio qui, quindi non ho assegnato una coppia chiave / valore all'oggetto stato, è solo un oggetto vuoto.
Ecco il violino che ho realizzato: jsfiddle.net . Mostra che gli oggetti di scena sono assegnati non nel costruttore per impostazione predefinita. A quanto ho capito, sono valutati nel metodo React.createElement
. Quindi super(props)
dovrebbe essere chiamato solo quando assegna l'costruttore manualmente della superclasse props
a this.props
. Se estendi semplicemente la React.Component
chiamata super(props)
non farà nulla con i puntelli. Forse sarà cambiato nelle prossime versioni di React.
Qui non lo avremo nel costruttore, quindi tornerà indefinito, ma saremo in grado di recuperarlo al di fuori della funzione del costruttore
class MyComponent extends React.Component {
constructor() {
console.log(this); // Reference Error i.e return undefined
}
render() {
return <div>Hello {this.props.name}</div>;
}
}
Se stiamo usando super (), allora possiamo recuperare anche la variabile "this" all'interno del costruttore
class MyComponent extends React.Component {
constructor() {
super();
console.log(this); // this logged to console
}
render() {
return <div>Hello {this.props.name}</div>;
}
}
Quindi quando stiamo usando super (); saremo in grado di recuperarlo, ma this.props non sarà definito nel costruttore. Ma a parte il costruttore, this.props non tornerà indefinito.
Se usiamo super (oggetti di scena), allora possiamo usare questo valore anche all'interno del costruttore
Se vuoi usare this.props nel costruttore, devi passare oggetti di scena a super. Altrimenti, non importa perché React imposta .props sull'istanza dall'esterno immediatamente dopo aver chiamato il costruttore.
Per la versione di reazione 16.6.3, utilizziamo super (props) per inizializzare il nome dell'elemento state : this.props.name
constructor(props){
super(props);
}
state = {
name:this.props.name
//otherwise not defined
};