Gdy jest to ważne, aby przejść props
do super()
i dlaczego?
class MyComponent extends React.Component {
constructor(props) {
super(); // or super(props) ?
}
}
reactjs
ecmascript-6
Misza Moroszko
źródło
źródło
Odpowiedzi:
Jest tylko jeden powód, dla którego należy przejść
props
dosuper()
:Gdy chcesz uzyskać dostęp
this.props
do konstruktora.Przechodzący:
Nie przechodzi:
Zauważ, że przechodząc lub nie przechodząc
props
dosuper
ma żadnego wpływu na późniejsze zastosowańthis.props
zewnątrzconstructor
. Oznacza torender
, żeshouldComponentUpdate
procedury obsługi zdarzeń zawsze mają do niego dostęp.Jest to wyraźnie powiedziane w jednej Sophie Alpert w odpowiedzi na podobne pytanie.
Dokumentacja - Stan i cykl życia, Dodawanie stanu lokalnego do klasy, punkt 2 - zaleca:
Jednak nie podano żadnego powodu. Możemy spekulować, że dzieje się tak z powodu podklasy lub ze względu na kompatybilność w przyszłości.
(Dzięki @MattBrowne za link)
źródło
this.props
jestundefined
chyba że przekazany dosuper()
. Tak czy inaczej, nie wpływa później renderingu lub dostępnościthis.props
wrender()
funkcji.super
, masz do nich odniesienie w konstruktorze.props
dosuper()
: facebook.github.io/react/docs/… . Nie jestem pewien, dlaczego, skoro, jak wskazałeś,this.props
jest dostępny w inny sposób w jakikolwiek sposób ... być może polecają to dla przyszłej kompatybilności na wypadek, gdyby przyszłe wersje React mogły chcieć coś zrobićprops
w konstruktorze?props
dosuper
kiedy, jak wspomniałem,props
parametr jest tam dostępne dla nas do wykorzystania wewnątrz konstruktora ithis.props
działa wszędzie? Czy w ogóle jest korzyść z używaniathis.props
tylko po prostuprops
? Czy złą praktyką jest rozkładanieprops
w konstruktorze? Chyba nadal nie widać przypadek, że kiedykolwiek trzeba przejśćprops
dosuper
, ale jestem gotów się założyć, że to tylko moja ignorancja, ha.super(props)
, możesz wywoływać metodythis.props
z konstruktora , na przykładthis.doStuffUsingThisDotProps()
, bez konieczności przekazywania parametru props do tych metod / funkcji. Właśnie napisałem konstruktor, który to robi, co, jak się wydaje, wymagasuper(props)
najpierw użycia , zgodnie z odpowiedziami na to pytanie.W tym przykładzie rozszerzasz
React.Component
klasę i zgodnie ze specyfikacją ES2015 konstruktor klasy potomnej nie może korzystać z niego,this
dopókisuper()
nie zostanie wywołany; także konstruktory klasy ES2015 muszą wywoływać,super()
jeśli są podklasami.Dla kontrastu:
Więcej szczegółów zgodnie z tą doskonałą odpowiedzią na przepełnienie stosu
Możesz zobaczyć przykłady komponentów utworzonych przez rozszerzenie
React.Component
klasy, które nie wywołują,super()
ale zauważysz, że nie mają oneconstructor
, dlatego nie jest to konieczne.Pewnym punktem zamieszania, który widziałem u niektórych programistów, z którymi rozmawiałem, jest to, że składniki, które nie mają,
constructor
a zatem nie wywołująsuper()
nigdzie, nadal sąthis.props
dostępne wrender()
metodzie. Pamiętaj, że ta reguła i ta potrzeba utworzeniathis
powiązaniaconstructor
dotyczy tylkoconstructor
.źródło
super()
isuper(props)
).Po przejściu
props
dosuper
rekwizyty zostaną przypisane dothis
. Spójrz na następujący scenariusz:Jakkolwiek, kiedy to robisz:
źródło
Zgodnie z kodem źródłowym
musisz zdać za
props
każdym razem, gdy masz rekwizyty i nie wkładasz ichthis.props
ręcznie.źródło
super(props)
a drugie nie. Ale ich konsumenci ustawiają rekwizyty. Jaka jest różnica?this.props = props
isuper(props)
to to samo?this.props
na „z zewnątrz” - niezależnie od tego, co dzieje się w konstruktorze.Dan Abramov napisał artykuł na ten temat:
Dlaczego piszemy super (rekwizyty)?
Istotą tego jest to, że warto mieć w zwyczaju przekazywanie go, aby uniknąć tego scenariusza, i szczerze mówiąc, nie widzę, aby miało to miejsce:
źródło
super()
służy do wywołania konstruktora nadrzędnego.super(props)
przejdzieprops
do konstruktora nadrzędnego.Z twojego przykładu
super(props)
wywołałbyReact.Component
konstruktorprops
jako argument.Więcej informacji na
super
: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/superźródło
Podczas implementacji
constructor()
funkcji w komponencie Reactsuper()
jest wymagane. Pamiętaj, że twójMyComponent
element rozszerza lub pożycza funkcjonalność zReact.Component
klasy podstawowej.Ta klasa bazowa ma własną
constructor()
funkcję, która zawiera w sobie trochę kodu, aby skonfigurować dla nas nasz komponent React.Kiedy zdefiniujemy
constructor()
funkcję w naszejMyComponent
klasie, w zasadzie zastępujemy lub zastępujemyconstructor()
funkcję wewnątrzReact.Component
klasy, ale nadal musimy upewnić się, że cały kod instalacyjny w tejconstructor()
funkcji jest nadal wywoływany.Tak aby zapewnić, że
React.Component
„sconstructor()
funkcja jest wywoływana, nazywamysuper(props)
.super(props)
jest odniesieniem doconstructor()
funkcji rodziców , to wszystko.Musimy dodawać za
super(props)
każdym razem, gdy definiujemyconstructor()
funkcję wewnątrz komponentu opartego na klasie.Jeśli tego nie zrobimy, pojawi się błąd informujący, że musimy zadzwonić
super(props)
.Cały powód tego zdefiniowania
constructor()
jest zainicjowanie naszego obiektu stanu.Aby więc zainicjować nasz obiekt stanu, pod super wywołaniem zamierzam napisać:
Zdefiniowaliśmy więc naszą
constructor()
metodę, zainicjowaliśmy nasz obiekt stanu, tworząc obiekt JavaScript, przypisując mu właściwość lub parę klucz / wartość, przypisując wynik tej operacjithis.state
. Teraz oczywiście jest to tylko przykład, więc tak naprawdę nie przypisałem pary klucz / wartość do obiektu stanu, jest to po prostu pusty obiekt.źródło
Oto skrzypce, które zrobiłem: jsfiddle.net . Pokazuje, że rekwizyty domyślnie nie są przypisane do konstruktora. Jak rozumiem, są one oparte na metodzie
React.createElement
. Stądsuper(props)
powinna być wywoływana tylko kiedy assings ręcznie konstruktor nadklasy wprops
celuthis.props
. Jeśli tylko przedłużyszReact.Component
połączeniesuper(props)
, nic nie zrobisz z rekwizytami. Może zostanie zmieniony w następnych wersjach React.źródło
Tutaj nie otrzymamy tego w konstruktorze, więc zwróci niezdefiniowane, ale będziemy mogli pobrać to poza funkcją konstruktora
Jeśli używamy super (), możemy pobrać również zmienną „this” wewnątrz konstruktora
Więc kiedy używamy super (); będziemy mogli to pobrać, ale this.props będzie niezdefiniowany w konstruktorze. Ale oprócz konstruktora this.props nie zwróci niezdefiniowanego.
Jeśli użyjemy super (rekwizyty), możemy również użyć wartości this.props wewnątrz konstruktora
Odpowiedź Sophie Alpert
źródło
Aby zareagować na wersję 16.6.3, używamy super (rekwizyty) do zainicjowania nazwy elementu stanu : this.props.name
źródło