Quand est - il important de passer props
à super()
, et pourquoi?
class MyComponent extends React.Component {
constructor(props) {
super(); // or super(props) ?
}
}
Quand est - il important de passer props
à super()
, et pourquoi?
class MyComponent extends React.Component {
constructor(props) {
super(); // or super(props) ?
}
}
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:
class MyComponent extends React.Component {
constructor(props) {
super(props)
console.log(this.props)
// -> { icon: 'home', … }
}
}
Ne passe pas:
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', … }
}
}
Notez que passer ou ne pas passer props
à super
n'a aucun effet sur les utilisations ultérieures de l' this.props
extérieur constructor
. Autrement dit render
, 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:
Les composants de classe doivent toujours appeler le constructeur de base avec
props
.
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)
this.props
est undefined
sauf si transmis à super()
. Dans tous les cas, cela n'affecte pas le rendu ou la disponibilité ultérieurs de this.props
la render()
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 signalez this.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 avec props
dans le constructeur?
props
à super
quand, comme vous l' avez dit, le props
paramètre est disponible là pour nous d'utiliser dans le constructeur , et this.props
fonctionne partout ailleurs? Y a-t-il un avantage à utiliser this.props
plus que juste props
? Est-ce une mauvaise pratique de détruire props
le constructeur? Je pense que je suis encore à défaut de voir un cas où vous auriez jamais besoin de passer props
à super
, mais je suis prêt à parier que c'est juste mon ignorance, ha.
super(props)
, vous pouvez appeler des méthodes qui utilisent this.props
in depuis un constructeur , comme this.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 utiliser this
avant d' super()
avoir été appelé; aussi, les constructeurs de classe ES2015 doivent appeler super()
s'ils sont des sous-classes.
class MyComponent extends React.Component {
constructor() {
console.log(this); // Reference Error
}
render() {
return <div>Hello {this.props.name}</div>;
}
}
Par contre:
class MyComponent extends React.Component {
constructor() {
super();
console.log(this); // this logged to console
}
render() {
return <div>Hello {this.props.name}</div>;
}
}
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 pas constructor
, d'où pourquoi ce n'est pas nécessaire.
class MyOtherComponent extends React.Component {
render() {
return <div>Hi {this.props.name}</div>;
}
}
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'appellent super()
nulle part, sont toujours this.props
disponibles dans la render()
méthode. N'oubliez pas que cette règle et cette nécessité de créer une this
liaison pour le constructor
seul s'applique au constructor
.
super()
et super(props)
).
Lorsque vous passez props
à super
, les accessoires sont affectés à this
. Jetez un œil au scénario suivant:
constructor(props) {
super();
console.log(this.props) //undefined
}
Comment quand vous le faites:
constructor(props) {
super(props);
console.log(this.props) //props will get logged.
}
Selon le code source
function ReactComponent(props, context) {
this.props = props;
this.context = context;
}
vous devez passer props
chaque fois que vous avez des accessoires et vous ne les mettez pas this.props
manuellement.
super(props)
et l'autre non. Mais leurs consommateurs ont tous deux mis des accessoires. Quelle est la différence?
this.props = props
et super(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:
// 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()
est utilisé pour appeler le constructeur parent.
super(props)
passerait props
au constructeur parent.
De votre exemple, super(props)
appellerait le React.Component
constructeur passantprops
comme argument.
Plus d'informations sur super
:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super
Lors de l'implémentation de la constructor()
fonction à l'intérieur d'un composant React, super()
est une exigence. N'oubliez pas que votre MyComponent
composant étend ou emprunte des fonctionnalités à la React.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 notre MyComponent
classe, nous remplaçons ou remplaçons essentiellement la constructor()
fonction qui est à l'intérieur de la React.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 appelons super(props)
. super(props)
est une référence à la constructor()
fonction des parents , c'est tout.
Nous devons ajouter super(props)
chaque fois que nous définissons une constructor()
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:
class App extends React.Component {
constructor(props) {
super(props);
this.state = {};
}
// React says we have to define render()
render() {
return <div>Hello world</div>;
}
};
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.
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, il super(props)
ne devrait être appelé que lorsque le constructeur de la superclasse se connecte manuellement props
à 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.
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
class MyComponent extends React.Component {
constructor() {
console.log(this); // Reference Error i.e return undefined
}
render() {
return <div>Hello {this.props.name}</div>;
}
}
Si nous utilisons super (), nous pouvons aussi récupérer la variable "this" à l'intérieur du constructeur
class MyComponent extends React.Component {
constructor() {
super();
console.log(this); // this logged to console
}
render() {
return <div>Hello {this.props.name}</div>;
}
}
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
Si vous souhaitez utiliser this.props dans le constructeur, vous devez passer props à super. Sinon, cela n'a pas d'importance parce que React définit .props sur l'instance de l'extérieur immédiatement après avoir appelé le constructeur.
Pour react version 16.6.3, nous utilisons super (props) pour initialiser le nom de l' élément state : this.props.name
constructor(props){
super(props);
}
state = {
name:this.props.name
//otherwise not defined
};