Quand est - il important de passer props
à super()
, et pourquoi?
class MyComponent extends React.Component {
constructor(props) {
super(); // or super(props) ?
}
}
reactjs
ecmascript-6
Misha Moroshko
la source
la source
Réponses:
Il n'y a qu'une seule raison quand il faut passer
props
àsuper()
:Lorsque vous souhaitez accéder
this.props
au constructeur.Qui passe:
Ne passe pas:
Notez que passer ou ne pas passer
props
àsuper
n'a aucun effet sur les utilisations ultérieures de l'this.props
extérieurconstructor
. Autrement ditrender
,shouldComponentUpdate
ou les gestionnaires d'événements y ont toujours accès.Cela est dit explicitement dans une réponse de Sophie Alpert à une question similaire.
La documentation - État et cycle de vie, Ajout d'un état local à une classe, point 2 - recommande:
Cependant, aucune raison n'est fournie. Nous pouvons spéculer que c'est à cause du sous-classement ou pour une future compatibilité.
(Merci @MattBrowne pour le lien)
la source
this.props
estundefined
sauf si transmis àsuper()
. Dans tous les cas, cela n'affecte pas le rendu ou la disponibilité ultérieurs dethis.props
larender()
fonction.super
, vous y faites référence dans le constructeur.props
àsuper()
: facebook.github.io/react/docs/… . Je ne sais pas pourquoi, car comme vous le signalezthis.props
est accessible de toute façon ... peut-être qu'ils recommandent cela pour une compatibilité future au cas où les futures versions de React voudraient faire quelque chose avecprops
dans le constructeur?props
àsuper
quand, comme vous l' avez dit, leprops
paramètre est disponible là pour nous d'utiliser dans le constructeur , etthis.props
fonctionne partout ailleurs? Y a-t-il un avantage à utiliserthis.props
plus que justeprops
? Est-ce une mauvaise pratique de détruireprops
le constructeur? Je pense que je suis encore à défaut de voir un cas où vous auriez jamais besoin de passerprops
àsuper
, mais je suis prêt à parier que c'est juste mon ignorance, ha.super(props)
, vous pouvez appeler des méthodes qui utilisentthis.props
in depuis un constructeur , commethis.doStuffUsingThisDotProps()
, sans avoir à transmettre le paramètre props à ces méthodes / fonctions. Je viens d'écrire un constructeur faisant cela, ce qui me demanderait apparemment d'utiliser d'super(props)
abord, selon les réponses à cette question.Dans cet exemple, vous étendez la
React.Component
classe et, selon la spécification ES2015, un constructeur de classe enfant ne peut pas utiliserthis
avant d'super()
avoir été appelé; aussi, les constructeurs de classe ES2015 doivent appelersuper()
s'ils sont des sous-classes.Par contre:
Plus de détails selon cette excellente réponse de débordement de pile
Vous pouvez voir des exemples de composants créés en étendant la
React.Component
classe qui n'appelle pas,super()
mais vous remarquerez qu'ils n'en ont pasconstructor
, d'où pourquoi ce n'est pas nécessaire.Un point de confusion que j'ai vu de la part de certains développeurs à qui j'ai parlé est que les composants qui n'ont pas
constructor
et donc n'appellentsuper()
nulle part, sont toujoursthis.props
disponibles dans larender()
méthode. N'oubliez pas que cette règle et cette nécessité de créer unethis
liaison pour leconstructor
seul s'applique auconstructor
.la source
super()
etsuper(props)
).Lorsque vous passez
props
àsuper
, les accessoires sont affectés àthis
. Jetez un œil au scénario suivant:Comment quand vous le faites:
la source
Selon le code source
vous devez passer
props
chaque fois que vous avez des accessoires et vous ne les mettez pasthis.props
manuellement.la source
super(props)
et l'autre non. Mais leurs consommateurs ont tous deux mis des accessoires. Quelle est la différence?this.props = props
etsuper(props)
sont la même chose?this.props
de «l'extérieur» - indépendamment de ce qui est fait dans le constructeur.Dan Abramov a écrit un article sur ce sujet:
Pourquoi écrivons-nous des super (accessoires)?
Et l'essentiel est qu'il est utile d'avoir l'habitude de le passer pour éviter ce scénario, honnêtement, je ne pense pas que cela se produira:
la source
super()
est utilisé pour appeler le constructeur parent.super(props)
passeraitprops
au constructeur parent.De votre exemple,
super(props)
appellerait leReact.Component
constructeur passantprops
comme argument.Plus d'informations sur
super
: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/superla source
Lors de l'implémentation de la
constructor()
fonction à l'intérieur d'un composant React,super()
est une exigence. N'oubliez pas que votreMyComponent
composant étend ou emprunte des fonctionnalités à laReact.Component
classe de base.Cette classe de base a
constructor()
sa propre fonction qui contient du code pour configurer notre composant React pour nous.Lorsque nous définissons une
constructor()
fonction à l'intérieur de notreMyComponent
classe, nous remplaçons ou remplaçons essentiellement laconstructor()
fonction qui est à l'intérieur de laReact.Component
classe, mais nous devons toujours nous assurer que tout le code de configuration à l'intérieur de cette classeconstructor()
fonction est toujours appelé.Donc , pour faire en sorte que la
React.Component
de »constructor()
la fonction est appelée, nous appelonssuper(props)
.super(props)
est une référence à laconstructor()
fonction des parents , c'est tout.Nous devons ajouter
super(props)
chaque fois que nous définissons uneconstructor()
fonction à l'intérieur d'un composant basé sur une classe.Si nous ne le faisons pas, nous verrons une erreur indiquant que nous devons appeler
super(props)
.La raison de la définition de cette
constructor()
fonction est d'initialiser notre objet d'état.Donc, afin d'initialiser notre objet d'état, sous le super appel, je vais écrire:
Nous avons donc défini notre
constructor()
méthode, initialisé notre objet d'état en créant un objet JavaScript, en lui attribuant une propriété ou une paire clé / valeur, en attribuant le résultat àthis.state
. Maintenant, bien sûr, ce n'est qu'un exemple ici, donc je n'ai pas vraiment attribué de paire clé / valeur à l'objet d'état, c'est juste un objet vide.la source
Voici le violon que j'ai fait: jsfiddle.net . Il montre que les accessoires ne sont pas attribués par défaut dans le constructeur. Si je comprends bien, ils sont évalués dans la méthode
React.createElement
. Par conséquent, ilsuper(props)
ne devrait être appelé que lorsque le constructeur de la superclasse se connecte manuellementprops
àthis.props
. Si vous prolongez simplement l'React.Component
appel,super(props)
cela ne fera rien avec les accessoires. Peut-être que cela sera changé dans les prochaines versions de React.la source
Ici, nous n'obtiendrons pas cela dans le constructeur, il retournera donc indéfini, mais nous pourrons le récupérer en dehors de la fonction constructeur
Si nous utilisons super (), nous pouvons aussi récupérer la variable "this" à l'intérieur du constructeur
Donc, lorsque nous utilisons super (); nous pourrons récupérer ceci mais this.props ne sera pas défini dans le constructeur. Mais à part constructeur, this.props ne retournera pas indéfini.
Si nous utilisons super (props), nous pouvons également utiliser la valeur this.props à l'intérieur du constructeur
Réponse de Sophie Alpert
la source
Pour react version 16.6.3, nous utilisons super (props) pour initialiser le nom de l' élément state : this.props.name
la source