¿Cuándo es importante para pasar props
a super()
, y por qué?
class MyComponent extends React.Component {
constructor(props) {
super(); // or super(props) ?
}
}
reactjs
ecmascript-6
Misha Moroshko
fuente
fuente
Respuestas:
Solo hay una razón por la que hay que pasar
props
asuper()
:Cuando quieras acceder
this.props
en constructor.Paso:
No pasa:
Tenga en cuenta que pasa o no pasa
props
asuper
tiene ningún efecto sobre los usos posteriores delthis.props
exteriorconstructor
. Es decirrender
,shouldComponentUpdate
o los controladores de eventos siempre tienen acceso a él.Esto se dice explícitamente en la respuesta de Sophie Alpert a una pregunta similar.
La documentación: Estado y ciclo de vida, Agregar estado local a una clase, punto 2, recomienda:
Sin embargo, no se proporciona ninguna razón. Podemos especular que es por subclases o por compatibilidad futura.
(Gracias @MattBrowne por el enlace)
fuente
this.props
es aundefined
menos que se pase asuper()
. De cualquier manera, no afecta la representación posterior o la disponibilidad dethis.props
larender()
función.super
, tiene referencia a ellos en el constructor.props
asuper()
: facebook.github.io/react/docs/… . No estoy seguro de por qué, ya que como señalathis.props
es accesible en otros métodos de cualquier manera ... ¿tal vez están recomendando esto para compatibilidad futura en caso de que futuras versiones de React quieran hacer algoprops
en el constructor?props
asuper
cuando, como usted ha señalado, elprops
parámetro está ahí disponible para nosotros para usar dentro del constructor , ythis.props
funciona en todas partes? ¿Hay algún beneficio en usarthis.props
soloprops
? ¿Es una mala práctica desestructurarprops
en el constructor? Creo que todavía estoy a falta de ver un caso en el que te vez tiene que pasarprops
asuper
, pero estoy dispuesto a apostar que es sólo mi ignorancia, ja.super(props)
, puede llamar a métodos que se usanthis.props
desde el constructor , comothis.doStuffUsingThisDotProps()
, sin tener que pasar el parámetro props a esos métodos / funciones. Acabo de escribir un constructor que hace esto, que aparentemente requeriría que lo usesuper(props)
primero, de acuerdo con las respuestas a esta pregunta.En este ejemplo, está extendiendo la
React.Component
clase y, según la especificación ES2015, un constructor de clase hijo no puede usarthis
hasta quesuper()
se haya llamado; Además, los constructores de clase ES2015 tienen que llamarsuper()
si son subclases.Por el contrario:
Más detalles según esta excelente respuesta de desbordamiento de pila
Puede ver ejemplos de componentes creados al extender la
React.Component
clase que no llama,super()
pero notará que estos no tienen unconstructor
, por lo que no es necesario.Un punto de confusión que he visto de algunos desarrolladores con los que he hablado es que los componentes que no tienen
constructor
y, por lo tanto, no llaman asuper()
ninguna parte, todavía estánthis.props
disponibles en elrender()
método. Recuerde que esta regla y esta necesidad de crear unathis
unión por elconstructor
sólo se aplica alconstructor
.fuente
super()
ysuper(props)
).Cuando pasas
props
asuper
, los accesorios se asignanthis
. Eche un vistazo al siguiente escenario:Como siempre que lo haces:
fuente
Según el código fuente
debes pasar
props
cada vez que tengas accesorios y no los pongasthis.props
manualmente.fuente
super(props)
y la otra no. Pero sus consumidores ambos establecen accesorios. ¿Cuál es la diferencia?this.props = props
ysuper(props)
son lo mismo?this.props
desde el 'exterior', independientemente de lo que se haga en el constructor.Dan Abramov escribió un artículo sobre este tema:
¿Por qué escribimos super (accesorios)?
Y lo esencial es que es útil tener el hábito de pasarlo para evitar este escenario, que honestamente, no veo que sea poco probable que suceda:
fuente
super()
se usa para llamar al constructor padre.super(props)
pasaríaprops
al constructor padre.Desde su ejemplo,
super(props)
llamaría alReact.Component
constructor pasandoprops
como argumento.Más información sobre
super
: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/superfuente
Al implementar la
constructor()
función dentro de un componente React,super()
es un requisito. Tenga en cuenta que suMyComponent
componente está ampliando o tomando prestada la funcionalidad de laReact.Component
clase base.Esta clase base tiene una
constructor()
función propia que tiene un código dentro de ella, para configurar nuestro componente React para nosotros.Cuando definimos una
constructor()
función dentro de nuestraMyComponent
clase, esencialmente estamos anulando o reemplazando laconstructor()
función que está dentro de laReact.Component
clase, pero aún debemos asegurarnos de que todavía se invoque todo el código de configuración dentro de estaconstructor()
función.Así que para asegurarse de que la
React.Component
'sconstructor()
función se llama, que llamamossuper(props)
.super(props)
es una referencia a laconstructor()
función de los padres , eso es todo.Tenemos que agregar
super(props)
cada vez que definimos unaconstructor()
función dentro de un componente basado en clases.Si no lo hacemos, veremos un error que dice que tenemos que llamar
super(props)
.La razón completa para definir esta
constructor()
función es inicializar nuestro objeto de estado.Entonces, para inicializar nuestro objeto de estado, debajo de la súper llamada voy a escribir:
Así que hemos definido nuestro
constructor()
método, inicializado nuestro objeto de estado creando un objeto JavaScript, asignándole una propiedad o un par clave / valor, asignándole el resultado de esothis.state
. Ahora, por supuesto, esto es solo un ejemplo aquí, así que realmente no he asignado un par clave / valor al objeto de estado, es solo un objeto vacío.fuente
Aquí está el violín que hice: jsfiddle.net . Muestra que los accesorios no están asignados en el constructor por defecto. Según tengo entendido, están asignados en el método
React.createElement
. Por lo tanto,super(props)
debería ser llamado sólo cuando assings constructor de la superclase manualmenteprops
athis.props
. Si solo extiende laReact.Component
llamadasuper(props)
, no hará nada con los accesorios. Tal vez se cambiará en las próximas versiones de React.fuente
Aquí no conseguiremos esto en el constructor, por lo que volverá indefinido, pero podremos recuperar esto fuera de la función del constructor
Si estamos usando super (), también podemos obtener la variable "this" dentro del constructor
Entonces, cuando estamos usando super (); podremos buscar esto pero this.props no estará definido en el constructor. Pero aparte del constructor, this.props no volverá indefinido.
Si usamos super (props), también podemos usar el valor this.props dentro del constructor
La respuesta de Sophie Alpert
fuente
Para la versión de reacción 16.6.3, utilizamos super (props) para inicializar el nombre del elemento de estado : this.props.name
fuente