Quando é que é importante passar props
para super()
, e por quê?
class MyComponent extends React.Component {
constructor(props) {
super(); // or super(props) ?
}
}
reactjs
ecmascript-6
Misha Moroshko
fonte
fonte
Respostas:
Há apenas um motivo para passar
props
parasuper()
:Quando você deseja acessar
this.props
no construtor.Passagem:
Não passando:
Note que passar ou não passar
props
asuper
tem nenhum efeito sobre os usos posteriores dothis.props
lado de foraconstructor
. Ou sejarender
, osshouldComponentUpdate
manipuladores de eventos sempre têm acesso a ele.Isso é explicitamente dito na resposta de Sophie Alpert a uma pergunta semelhante.
A documentação - Estado e Ciclo de Vida, Adicionando Estado Local a uma Classe, ponto 2 - recomenda:
No entanto, nenhum motivo é fornecido. Podemos especular que seja por causa de subclassificação ou por compatibilidade futura.
(Obrigado @MattBrowne pelo link)
fonte
this.props
é, aundefined
menos que seja passado parasuper()
. De qualquer forma, não afeta a renderização ou a disponibilidade posteriorthis.props
darender()
função.super
, você tem referência a eles no construtor.props
parasuper()
: facebook.github.io/react/docs/... . Não sei por que, já que, como você menciona,this.props
é acessível de outros métodos de qualquer maneira ... talvez eles estejam recomendando isso para compatibilidade futura, caso versões futuras do React possam querer fazer algo comprops
o construtor?props
parasuper
quando, como você apontou, oprops
parâmetro está disponível para uso no construtor ethis.props
funciona em qualquer outro lugar? Existe algum benefício em usarthis.props
apenasprops
? É uma má prática desestruturarprops
o construtor? Acho que ainda estou deixando de ver um caso quando você já tinha precisa passarprops
parasuper
, mas eu estou disposto a apostar que é apenas a minha ignorância, ha.super(props)
, poderá chamar métodos que usamthis.props
do construtor , comothis.doStuffUsingThisDotProps()
, sem ter que passar o parâmetro props para esses métodos / funções. Acabei de escrever um construtor fazendo isso, o que aparentemente exigiria que eu o usassesuper(props)
primeiro, de acordo com as respostas a esta pergunta.Neste exemplo, você está estendendo a
React.Component
classe e, de acordo com a especificação do ES2015, um construtor de classe filho não pode usarthis
atésuper()
que seja chamado; Além disso, os construtores de classe do ES2015 precisam chamarsuper()
se forem subclasses.Por contraste:
Mais detalhes de acordo com esta excelente resposta de estouro de pilha
Você pode ver exemplos de componentes criados estendendo a
React.Component
classe que não chama,super()
mas notará que estes não possuem umconstructor
, portanto, por que não é necessário.Um ponto de confusão que vi de alguns desenvolvedores com quem conversei é que os componentes que não possuem
constructor
e, portanto, não chamam emsuper()
lugar algum, ainda estãothis.props
disponíveis norender()
método. Lembre-se de que esta regra e essa necessidade de criar umathis
ligação para oconstructor
único se aplicam aoconstructor
.fonte
super()
esuper(props)
).Quando você passa
props
parasuper
, os objetos são atribuídosthis
. Dê uma olhada no seguinte cenário:No entanto, quando você faz:
fonte
Conforme código fonte
você deve passar
props
toda vez que tiver adereços e não os colocarthis.props
manualmente.fonte
super(props)
e a outra não. Mas seus consumidores definem adereços. Qual é a diferença?this.props = props
esuper(props)
é a mesma coisa?this.props
partir de 'fora' - independentemente do que é feito no construtor.Dan Abramov escreveu um artigo sobre este tópico:
Por que escrevemos super (adereços)?
E a essência disso é que é útil ter o hábito de contorná- lo para evitar esse cenário. Honestamente, não acho improvável que isso aconteça:
fonte
super()
é usado para chamar o construtor pai.super(props)
passariaprops
para o construtor pai.Do seu exemplo,
super(props)
chamaria oReact.Component
construtor de passagemprops
como argumento.Mais informações em
super
: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/superfonte
Ao implementar a
constructor()
função dentro de um componente React,super()
é um requisito. Lembre-se de que seuMyComponent
componente está estendendo ou emprestando funcionalidades daReact.Component
classe base.Essa classe base tem uma
constructor()
função própria que possui algum código para configurar nosso componente React para nós.Quando definimos uma
constructor()
função dentro de nossaMyComponent
classe, estamos essencialmente substituindo ou substituindo aconstructor()
função que está dentro daReact.Component
classe, mas ainda precisamos garantir que todo o código de instalação dentro dessaconstructor()
função ainda seja chamado.Assim, para garantir que o
React.Component
'sconstructor()
função é chamada, chamamossuper(props)
.super(props)
é uma referência àconstructor()
função dos pais , isso é tudo.Temos que adicionar
super(props)
sempre que definirmos umaconstructor()
função dentro de um componente baseado em classe.Caso contrário, veremos um erro dizendo que temos que ligar
super(props)
.A razão inteira para definir essa função
constructor()
é inicializar nosso objeto de estado.Então, para inicializar nosso objeto de estado, sob a super chamada, vou escrever:
Assim, definimos nosso
constructor()
método, inicializamos nosso objeto de estado criando um objeto JavaScript, atribuindo uma propriedade ou um par de chave / valor a ele, atribuindo o resultado disso athis.state
. Agora é claro que este é apenas um exemplo aqui, então eu realmente não atribuí um par de chave / valor ao objeto de estado, é apenas um objeto vazio.fonte
Aqui está o violino que eu fiz: jsfiddle.net . Mostra que os adereços não estão atribuídos no construtor por padrão. Pelo que entendi, eles são avaliados no método
React.createElement
. Assimsuper(props)
deve ser chamado somente quando assings construtor manualmente da superclasseprops
parathis.props
. Se você apenas estender aReact.Component
chamadasuper(props)
, nada fará com adereços. Talvez isso seja alterado nas próximas versões do React.fonte
Aqui não conseguiremos isso no construtor, portanto ele retornará indefinido, mas poderemos buscá-lo fora da função do construtor
Se estivermos usando super (), também podemos buscar a variável "this" dentro do construtor
Então, quando estamos usando super (); seremos capazes de buscar isso, mas this.props será indefinido no construtor. Mas, além do construtor, this.props não retornará indefinido.
Se usarmos super (props), poderemos usar o valor this.props também dentro do construtor
Resposta de Sophie Alpert
fonte
Para a versão 16.6.3 do react, usamos super (props) para inicializar o nome do elemento de estado : this.props.name
fonte