Pierwszą rzeczą, którą powinieneś zrobić, gdy masz zamiar nauczyć się czegoś nowego, jest zadanie sobie dwóch pytań:
Dlaczego to coś istnieje?
Jakie problemy rozwiązuje to coś?
Jeśli nigdy nie opracujesz przekonującej odpowiedzi na oba te pytania, nie będziesz mieć wystarczająco solidnych podstaw, na których można by się oprzeć, zagłębiając się w szczegóły. Te pytania są szczególnie interesujące w odniesieniu do React Hooks. Reakcja byłanajpopularniejszy i najbardziej lubiany framework frontendowyw ekosystemie JavaScript, kiedy zostały wydane hooki. Pomimo istniejących pochwał, zespół React nadal uważał za konieczne zbudowanie i wypuszczenie hooków. Przyczyną jest zagubienie się w różnych postach na Medium i przemyśleniach na blogu na temat Hooks(1) dlaczegoi po co(2) korzyść, mimo dużego uznania i popularności, zespół React postanowił wydać cenne zasoby na budowanie i wypuszczanie hooków. Aby lepiej zrozumieć odpowiedzi na oba te pytania, musimy najpierw przyjrzeć się bliżej temu, jak historycznie pisaliśmy aplikacje React.
utwórzKlasę
Jeśli grałeś w React wystarczająco długo, pamiętaszReact.createClass
API. To był oryginalny sposób, w jaki tworzyliśmy komponenty React. Wszystkie informacje, których użyjesz do opisania komponentu, zostaną przekazane jako obiektutwórzKlasę
.
konst ReposGrid = Reagować.utwórzKlasę({
getInitialState () {
powrót {
repo: [],
Ładowanie: PRAWDA
}
},
komponentDidMount () {
Ten.aktualizacjaRepos(Ten.rekwizyty.ID)
},
składnikDidUpdate (prevProps) {
Jeśli (prevProps.ID !== Ten.rekwizyty.ID) {
Ten.aktualizacjaRepos(Ten.rekwizyty.ID)
}
},
aktualizacjaRepos (ID) {
Ten.ustaw stan({ Ładowanie: PRAWDA })
fetchRepos(ID)
.Następnie((repo) => Ten.ustaw stan({
repo,
Ładowanie: FAŁSZ
}))
},
renderowanie() {
konst { Ładowanie, repo } = Ten.państwo
Jeśli (Ładowanie === PRAWDA) {
powrót <Ładowanie />
}
powrót (
<ul>
{repo.mapa(({ nazwa, uchwyt, gwiazdy, adres URL }) => (
<li klucz={nazwa}>
<ul>
<li><A href={adres URL}>{nazwa}A>li>
<li>@{uchwyt}li>
<li>{gwiazdy} gwiazdyli>
ul>
li>
))}
ul>
)
}
})
utwórzKlasę
był prostym i skutecznym sposobem tworzenia komponentów React. Powód, dla którego React początkowo użyłutwórzKlasę
API było spowodowane tym, że w tamtym czasie JavaScript nie miał wbudowanego systemu klas. Oczywiście w końcu to się zmieniło. Wraz z ES6, JavaScript wprowadziłklasa
słowo kluczowe, a wraz z nim natywny sposób tworzenia klas w JavaScript. To postawiło React w trudnej sytuacji. Kontynuuj używanieutwórzKlasę
i walcz z postępem JavaScript lub poddaj się woli standardu EcmaScript i obejmij klasy. Jak pokazała historia, wybrali to drugie.
Reaguj.Komponent
Uznaliśmy, że nie zajmujemy się projektowaniem systemu klas. Chcemy po prostu użyć idiomatycznego sposobu tworzenia klas w JavaScript. -Wydanie React v0.13.0
React v0.13.0 wprowadziłReaguj.Komponent
API, które umożliwiło tworzenie komponentów React z (teraz) natywnych klas JavaScript. To była duża wygrana, ponieważ lepiej dopasowała React do standardu EcmaScript.
klasa ReposGrid rozciąga się Reagować.Część {
konstruktor (rekwizyty) {
Super(rekwizyty)
Ten.państwo = {
repo: [],
Ładowanie: PRAWDA
}
Ten.aktualizacjaRepos = Ten.aktualizacjaRepos.wiązać(Ten)
}
komponentDidMount () {
Ten.aktualizacjaRepos(Ten.rekwizyty.ID)
}
składnikDidUpdate (prevProps) {
Jeśli (prevProps.ID !== Ten.rekwizyty.ID) {
Ten.aktualizacjaRepos(Ten.rekwizyty.ID)
}
}
aktualizacjaRepos (ID) {
Ten.ustaw stan({ Ładowanie: PRAWDA })
fetchRepos(ID)
.Następnie((repo) => Ten.ustaw stan({
repo,
(Video) Tygodniówka JS #13 Web Frameworks, React Hooks, Bad Front-endŁadowanie: FAŁSZ
}))
}
renderowanie() {
Jeśli (Ten.państwo.Ładowanie === PRAWDA) {
powrót <Ładowanie />
}
powrót (
<ul>
{Ten.państwo.repo.mapa(({ nazwa, uchwyt, gwiazdy, adres URL }) => (
<li klucz={nazwa}>
<ul>
<li><A href={adres URL}>{nazwa}A>li>
<li>@{uchwyt}li>
<li>{gwiazdy} gwiazdyli>
ul>
li>
))}
See Also10 redenen waarom React-hooks de toekomst van webontwikkeling zijnIntroductie van Hooks - Reageerul>
)
}
}
Choć wyraźny krok we właściwym kierunku,Reaguj.Komponent
nie było bez kompromisów.
konstruktor
W przypadku komponentów klasy inicjujesz stan komponentu wewnątrz plikukonstruktor
metoda jako Apaństwo
właściwość w instancji (Ten
). Jednak zgodnie ze specyfikacją ECMAScript, jeśli rozszerzasz podklasę (w tym przypadkuReaguj.Komponent
), musisz najpierw wywołaćSuper
zanim będziesz mógł użyćTen
. W szczególności, korzystając z React, musisz również pamiętać o zaliczeniurekwizyty
DoSuper
.
konstruktor (rekwizyty) {
Super(rekwizyty) // 🤮
...
}
Automatyczne wiązanie
Podczas używaniautwórzKlasę
, React automatycznie powiązałby wszystkie metody z instancją komponentu,Ten
. ZReaguj.Komponent
, tak nie było. Bardzo szybko,Reaguj programistów wszędziezdali sobie sprawę, że nie wiedzą jaksłowo kluczowe thispracował. Zamiast mieć wywołania metod, które „po prostu zadziałały”, trzeba było o tym pamiętać.wiązać
metody w klasiekonstruktor
. Jeśli tego nie zrobisz, otrzymasz popularną właściwość „Nie można odczytaćustaw stan
niezdefiniowanego" błędu.
konstruktor (rekwizyty) {
...
Ten.aktualizacjaRepos = Ten.aktualizacjaRepos.wiązać(Ten) // 😭
}
Teraz wiem, co możesz sobie pomyśleć. Po pierwsze, te kwestie są dość powierzchowne. Jasne, że dzwonięsuper (rekwizyty)
i pamiętając owiązać
Twoje metody są irytujące, ale nie ma w tym nic zasadniczo złego. Po drugie, niekoniecznie są to nawet problemy z Reactem w takim samym stopniu, jak ze sposobem projektowania klas JavaScript. Oba punkty są aktualne. Jesteśmy jednak programistami. Nawet najbardziej powierzchowne problemy stają się uciążliwe, gdy masz do czynienia z nimi ponad 20 razy dziennie. Na szczęście dla nas, wkrótce po zmianie zutwórzKlasę
DoReaguj.Komponent
,Pola klasypowstała propozycja.
Pola klasy
Pola klas umożliwiają dodawanie właściwości instancji bezpośrednio jako właściwości klasy bez konieczności ich używaniakonstruktor
. Dla nas oznacza to, że dzięki Class Fields oba nasze „powierzchowne” problemy, o których mówiliśmy wcześniej, zostaną rozwiązane. Nie musimy już używaćkonstruktor
aby ustawić stan początkowy komponentu i nie musimy już tego robić.wiązać
wkonstruktor
ponieważ moglibyśmy użyć funkcji strzałek dla naszych metod.
klasa ReposGrid rozciąga się Reagować.Część {
państwo = {
repo: [],
Ładowanie: PRAWDA
}
komponentDidMount () {
Ten.aktualizacjaRepos(Ten.rekwizyty.ID)
}
składnikDidUpdate (prevProps) {
Jeśli (prevProps.ID !== Ten.rekwizyty.ID) {
Ten.aktualizacjaRepos(Ten.rekwizyty.ID)
}
}
aktualizacjaRepos = (ID) => {
Ten.ustaw stan({ Ładowanie: PRAWDA })
fetchRepos(ID)
.Następnie((repo) => Ten.ustaw stan({
repo,
Ładowanie: FAŁSZ
}))
}
renderowanie() {
konst { Ładowanie, repo } = Ten.państwo
Jeśli (Ładowanie === PRAWDA) {
powrót <Ładowanie />
}
powrót (
<ul>
{repo.mapa(({ nazwa, uchwyt, gwiazdy, adres URL }) => (
<li klucz={nazwa}>
<ul>
<li><A href={adres URL}>{nazwa}A>li>
<li>@{uchwyt}li>
<li>{gwiazdy} gwiazdyli>
ul>
li>
))}
(Video) Marcin Hagmajer - Why we’ll all use React Hooks / FRONTEND CON 2018ul>
)
}
}
Więc teraz jesteśmy dobrzy, prawda? Niestety nie. Ruch odutwórzKlasę
DoReaguj.Komponent
wiązało się z pewnymi kompromisami, ale jak widzieliśmy, Class Fields zadbał o to. Niestety, we wszystkich poprzednich wersjach, które widzieliśmy, nadal istnieją pewne głębsze (ale mniej o nich mówione) problemy.
Cała idea React polega na tym, że możesz lepiej zarządzać złożonością aplikacji, dzieląc ją na oddzielne komponenty, które następnie możesz skomponować razem. Ten model komponentów sprawia, że React jest tak elegancki. To sprawia, że Reaguj, Reaguj. Problem nie leży jednak w modelu komponentowym, ale w sposobie implementacji modelu komponentowego.
Zduplikowana logika
W przeszłości struktura naszych komponentów React była powiązana z cyklem życia komponentu. Ten podział w naturalny sposób zmusza nas do rozproszenia powiązanej logiki w całym komponencie. Widzimy to wyraźnie wReposGrid
przykład, z którego korzystaliśmy. Potrzebujemy trzech oddzielnych metod (komponentDidMount
,składnikDidUpdate
, IaktualizacjaRepos
), aby osiągnąć to samo - zachowaćrepo
w synchronizacji z czymkolwiekrekwizyty.id
Jest.
komponentDidMount () {
Ten.aktualizacjaRepos(Ten.rekwizyty.ID)
}
składnikDidUpdate (prevProps) {
Jeśli (prevProps.ID !== Ten.rekwizyty.ID) {
Ten.aktualizacjaRepos(Ten.rekwizyty.ID)
}
}
aktualizacjaRepos = (ID) => {
Ten.ustaw stan({ Ładowanie: PRAWDA })
fetchRepos(ID)
.Następnie((repo) => Ten.ustaw stan({
repo,
Ładowanie: FAŁSZ
}))
}
Aby to naprawić, potrzebowalibyśmy zupełnie nowego paradygmatu sposobu, w jaki radzilibyśmy sobie z efektami ubocznymi w komponentach React.
Udostępnianie logiki niewizualnej
Kiedy myślisz o kompozycji w React, prawdopodobnie myślisz o kompozycji interfejsu użytkownika. Jest to naturalne, ponieważ React jest w tym tak dobry.
pogląd = fn(stan)
Realistycznie rzecz biorąc, tworzenie aplikacji to coś więcej niż tylko warstwa interfejsu użytkownika. Często zdarza się, że trzeba komponować i ponownie wykorzystywać logikę niewizualną. Jednak ponieważ React łączy interfejs użytkownika z komponentem, może to być trudne. Historycznie React nie miał na to dobrej odpowiedzi.
Trzymając się naszego przykładu, załóżmy, że musieliśmy stworzyć kolejny komponent, który również wymagałrepo
państwo. W tej chwili ten stan i logika jego obsługi znajdują się wewnątrzReposGrid
część. Jak byśmy do tego podeszli? Cóż, najprostszym podejściem byłoby skopiowanie całej logiki pobierania i obsługi naszegorepo
i wklej go do nowego komponentu. Kuszące, ale nie. Mądrzejszym podejściem byłoby utworzenie plikuKomponent wyższego rzęduktóry zawierał całą wspólną logikę i przeszedłŁadowanie
Irepo
jako rekwizyty do dowolnego komponentu, który tego potrzebował.
funkcjonować z repozytoriami (Część) {
powrót klasa WithRepos rozciąga się Reagować.Część {
państwo = {
repo: [],
Ładowanie: PRAWDA
}
komponentDidMount () {
Ten.aktualizacjaRepos(Ten.rekwizyty.ID)
}
składnikDidUpdate (prevProps) {
Jeśli (prevProps.ID !== Ten.rekwizyty.ID) {
Ten.aktualizacjaRepos(Ten.rekwizyty.ID)
}
}
aktualizacjaRepos = (ID) => {
Ten.ustaw stan({ Ładowanie: PRAWDA })
fetchRepos(ID)
.Następnie((repo) => Ten.ustaw stan({
repo,
Ładowanie: FAŁSZ
}))
}
renderowanie () {
powrót (
<Część
{...Ten.rekwizyty}
{...Ten.państwo}
/>
)
}
}
}
Teraz, gdy potrzebny jest dowolny komponent w naszej aplikacjirepo
(LubŁadowanie
), moglibyśmy zawinąć go w naszz repozytoriami
HOC.
// ReposGrid.js
funkcjonować ReposGrid ({ Ładowanie, repo }) {
...
}
eksport domyślny z repozytoriami(ReposGrid)
// Profil.js
funkcjonować Profil ({ Ładowanie, repo }) {
...
}
(Video) Zasady korzystania z hooków - React Hooks w 5 minut #3eksport domyślny z repozytoriami(Profil)
To działa i historycznie (wraz zRekwizyty renderowania) jest zalecanym rozwiązaniem do udostępniania logiki niewizualnej. Jednak oba te wzorce mają pewne wady.
Po pierwsze, jeśli nie jesteś z nimi zaznajomiony (a nawet jeśli je znasz), twój mózg może trochę nie działać zgodnie z logiką. Z naszymz repozytoriami
HOC, mamy funkcję, która przyjmuje ostatecznie wyrenderowany komponent jako pierwszy argument, ale zwraca nowy komponent klasy, w którym mieszka nasza logika. Co za zawiły proces.
Następnie, co by było, gdybyśmy mieli więcej niż jeden HOC, który konsumowaliśmy. Jak możesz sobie wyobrazić, dość szybko wymyka się spod kontroli.
eksport domyślny z najechaniem(
z motywem(
z autoryzacją(
z repozytoriami(Profil)
)
)
)
Gorsze niż ^ jest to, co ostatecznie zostanie wyrenderowane. HOC (i podobne wzorce) zmuszają do restrukturyzacji i pakowania komponentów. Może to ostatecznie doprowadzić do „piekła opakowania”, co ponownie utrudnia śledzenie.
<Z najechaniem>
<Z motywem unoszący się={FAŁSZ}>
<Z autoryzacją unoszący się={FAŁSZ} temat='ciemny'>
<WithRepos unoszący się={FAŁSZ} temat='ciemny' uwierzytelniony={PRAWDA}>
<Profil
ID='JavaScript'
Ładowanie={PRAWDA}
repo={[]}
uwierzytelniony={PRAWDA}
temat='ciemny'
unoszący się={FAŁSZ}
/>
WithRepos>
Z autoryzacją>
<Z motywem>
Z najechaniem>
Stan aktulany
Więc tutaj jesteśmy.
- React jest cholernie popularny.
- Używamy klas dla komponentów React, ponieważ to właśnie miało największy sens w tamtym czasie.
- Wywoływanie super(props) jest denerwujące.
- Nikt nie wie, jak to „to” działa.
- Dobra, uspokój się. Wiem, że TY wiesz, jak „to” działa, ale dla niektórych jest to niepotrzebna przeszkoda.
- Organizowanie naszych komponentów według metod cyklu życia zmusza nas do rozproszenia powiązanej logiki w naszych komponentach.
- React nie ma dobrego prymitywu do dzielenia się logiką niewizualną.
Teraz potrzebujemy nowego komponentu API, który rozwiązuje wszystkie te problemy, pozostając jednocześnieprosty,komponowalny,elastyczny, Irozsuwany. Nie lada zadanie, ale jakoś zespołowi React udało się je wykonać.
Haki reakcji
Od Reacta v0.14.0 mieliśmy dwa sposoby tworzenia komponentów – klasy lub funkcje. Różnica polegała na tym, że jeśli nasz komponent miał stan lub musiał korzystać z metody cyklu życia, musieliśmy użyć klasy. W przeciwnym razie, gdyby po prostu zaakceptował rekwizyty i wyrenderował interfejs użytkownika, moglibyśmy użyć funkcji.
A co jeśli tak nie było. Co by było, gdybyśmy zamiast konieczności używania klasy zawsze mogli użyć funkcji.
Czasami elegancka implementacja to tylko funkcja. Nie metoda. Nie klasa. Nie ramy. Po prostu funkcja.
- Johna Carmacka. Oculus VR CTO.
Pewnie, że musielibyśmy wymyślić sposób na dodanie zdolności komponentów funkcjonalnych do posiadania metod stanu i cyklu życia, ale zakładając, że to zrobimy, jakie korzyści byśmy zobaczyli?
Cóż, nie musielibyśmy już dzwonićsuper (rekwizyty)
, nie musielibyśmy się już martwićwiązać
ing naszych metod lubTen
słowo kluczowe i nie mielibyśmy już zastosowania dla pól klas. Zasadniczo wszystkie „powierzchowne” problemy, o których mówiliśmy wcześniej, zniknęłyby.
(NIE,_」Th)Noboru Reagować.Część 🗑
funkcjonować ヾ(Ő‿Ő✿)
Teraz trudniejsze kwestie.
- Państwo
- Metody cyklu życia
- Udostępnianie logiki niewizualnej
Państwo
Ponieważ nie używamy już klas lubTen
, potrzebujemy nowego sposobu dodawania i zarządzania stanem wewnątrz naszych komponentów. Począwszy od React v16.8.0, React daje nam ten nowy sposób poprzezstan użycia
metoda.
stan użycia
to pierwszy z wielu „haków”, które zobaczysz w tym kursie. Niech reszta tego wpisu posłuży jako miękkie wprowadzenie. Będziemy nurkować znacznie głębiejstan użycia
jak również inne haki w przyszłych sekcjach.
stan użycia
przyjmuje pojedynczy argument, początkową wartość stanu. To, co zwraca, to tablica, której pierwszym elementem jest element stanu, a drugim elementem jest funkcja aktualizująca ten stan.
konst ładowanieTuple = Reagować.stan użycia(PRAWDA)
konst Ładowanie = ładowanieTuple[0]
konst ładowanie zestawu = ładowanieTuple[1]
...
Ładowanie // PRAWDA
ładowanie zestawu(FAŁSZ)
Ładowanie // FAŁSZ
Jak widać, chwytanie każdego elementu w tablicy z osobna nie jest najlepszym doświadczeniem dla programistów. To tak dla zademonstrowania jakstan użycia
zwraca tablicę. Zazwyczaj używałbyś funkcji destrukturyzacji tablicy, aby pobrać wartości w jednym wierszu.
// const loadingTuple = React.useState(true)
// ładowanie const = loadingTuple[0]
// const setLoading = loadingTuple[1]
konst [ Ładowanie, ładowanie zestawu ] = Reagować.stan użycia(PRAWDA) // 👌
Teraz zaktualizujmy naszeReposGrid
komponent z naszą nowo odkrytą wiedzą na tematstan użycia
Hak.
funkcjonować ReposGrid ({ ID }) {
konst [ repo, setRepos ] = Reagować.stan użycia([])
konst [ Ładowanie, ładowanie zestawu ] = Reagować.stan użycia(PRAWDA)
Jeśli (Ładowanie === PRAWDA) {
powrót <Ładowanie />
}
powrót (
<ul>
{repo.mapa(({ nazwa, uchwyt, gwiazdy, adres URL }) => (
<li klucz={nazwa}>
<ul>
<li><A href={adres URL}>{nazwa}A>li>
<li>@{uchwyt}li>
<li>{gwiazdy} gwiazdyli>
(Video) Obsługa stanu z useState - React Hooks w 5 minut #1ul>
li>
))}
ul>
)
}
- Stan ✅
- Metody cyklu życia
- Udostępnianie logiki niewizualnej
Metody cyklu życia
Oto coś, co może cię zasmucić (lub uszczęśliwić?). Chcę, abyś podczas korzystania z React Hooks wziął wszystko, co wiesz o tradycyjnych metodach cyklu życia React, a także ten sposób myślenia, i zapomniał o tym. Widzieliśmy już problem myślenia w kategoriach cyklu życia komponentu - „To [cykl życia] podziału w naturalny sposób zmusza nas do rozproszenia powiązanej logiki w całym komponencie”. Zamiast tego myśl w kategoriachsynchronizacja.
Pomyśl o każdym przypadku, w którym kiedykolwiek użyłeś zdarzenia cyklu życia. Niezależnie od tego, czy chodziło o ustawienie stanu początkowego komponentu, pobranie danych, aktualizację DOM, cokolwiek - końcowym celem zawsze była synchronizacja. Zazwyczaj synchronizacja czegoś poza React land (żądanie API, DOM itp.) z czymś wewnątrz React land (stan komponentu) lub odwrotnie.
Kiedy myślimy w kategoriach synchronizacji zamiast zdarzeń w cyklu życia, pozwala nam to grupować powiązane elementy logiki. Aby to zrobić, React daje nam kolejny hook o nazwieUżyjEfekt
.
zdefiniowany,UżyjEfekt
pozwala na wykonywanie efektów ubocznych w składowych funkcji. Pobiera dwa argumenty, funkcję i opcjonalną tablicę. Funkcja określa, które efekty uboczne mają zostać uruchomione, a (opcjonalna) tablica określa, kiedy „ponownie zsynchronizować” (lub ponownie uruchomić) efekt.
Reagować.UżyjEfekt(() => {
dokument.tytuł = `Cześć, ${nazwa użytkownika}`
}, [nazwa użytkownika])
W powyższym kodzie funkcja przekazana doUżyjEfekt
będzie działać zawszenazwa użytkownika
zmiany. Dlatego synchronizacja tytułu dokumentu z czymkolwiekWitaj, ${nazwa użytkownika}
postanawia.
Teraz, jak możemy użyćUżyjEfekt
Podłącz nasz kod do synchronizacjirepo
z naszymfetchRepos
Żądanie interfejsu API?
funkcjonować ReposGrid ({ ID }) {
konst [ repo, setRepos ] = Reagować.stan użycia([])
konst [ Ładowanie, ładowanie zestawu ] = Reagować.stan użycia(PRAWDA)
Reagować.UżyjEfekt(() => {
ładowanie zestawu(PRAWDA)
fetchRepos(ID)
.Następnie((repo) => {
setRepos(repo)
ładowanie zestawu(FAŁSZ)
})
}, [ID])
Jeśli (Ładowanie === PRAWDA) {
powrót <Ładowanie />
}
powrót (
<ul>
{repo.mapa(({ nazwa, uchwyt, gwiazdy, adres URL }) => (
<li klucz={nazwa}>
<ul>
<li><A href={adres URL}>{nazwa}A>li>
<li>@{uchwyt}li>
<li>{gwiazdy} gwiazdyli>
ul>
li>
))}
ul>
)
}
Całkiem ślisko, prawda? Skutecznie się pozbyliśmyReaguj.Komponent
,konstruktor
,Super
,Ten
a co ważniejsze, nie mamy już rozproszonej (i powielonej) logiki efektów w całym komponencie.
- Stan ✅
- Metody cyklu życia ✅
- Udostępnianie logiki niewizualnej
Udostępnianie logiki niewizualnej
Wcześniej wspomnieliśmy, że powodem, dla którego React nie miał świetnej odpowiedzi na udostępnianie logiki innej niż wizualna, było to, że „React paruje interfejs użytkownika z komponentem”. Prowadzi to do zbyt skomplikowanych wzorców, takich jakKomponenty wyższego rzęduLubRenderuj rekwizyty. Jak już się pewnie domyślasz, Hooks ma na to odpowiedź. Jednak prawdopodobnie nie jest tak, jak myślisz. Nie ma wbudowanego hooka do udostępniania logiki niewizualnej, zamiast tego możesz tworzyć własne niestandardowe hooki, które są oddzielone od dowolnego interfejsu użytkownika.
Możemy to zobaczyć w akcji, tworząc własny customuseRepos
Hak. Ten hak przyjmieID
repozytoriów, które chcemy pobrać i (aby trzymać się podobnego API) zwróci tablicę z pierwszym elementem będącymŁadowanie
stan, a drugim elementem jestrepo
państwo.
funkcjonować useRepos (ID) {
konst [ repo, setRepos ] = Reagować.stan użycia([])
konst [ Ładowanie, ładowanie zestawu ] = Reagować.stan użycia(PRAWDA)
Reagować.UżyjEfekt(() => {
ładowanie zestawu(PRAWDA)
fetchRepos(ID)
.Następnie((repo) => {
setRepos(repo)
ładowanie zestawu(FAŁSZ)
})
}, [ID])
powrót [ Ładowanie, repo ]
}
Fajna jest jakakolwiek logika związana z pobieraniem naszegorepo
można wyodrębnić wewnątrz tego niestandardowego hooka. Teraz, niezależnie od tego, w jakim komponencie się znajdujemy i nawet jeśli jest to logika niewizualna, zawsze, gdy potrzebujemy danych dotyczącychrepo
, możemy konsumować naszeuseRepos
niestandardowy hak.
funkcjonować Profil ({ użytkownik }) {
konst [ Ładowanie, repo ] = useRepos(użytkownik.ID)
...
}
- Stan ✅
- Metody cyklu życia ✅
- Udostępnianie logiki niewizualnej ✅
Celem marketingowym hooków jest to, że możesz używać składowych funkcji stanu wewnątrz. W rzeczywistości hooki to znacznie więcej. Chodzi o ulepszone ponowne użycie kodu, kompozycję i lepsze ustawienia domyślne. Haki to jeszcze wiele innych rzeczy, które musimy jeszcze omówić, ale teraz, gdy już wiesz, DLACZEGO istnieją, mamy solidne podstawy, na których możemy budować.
FAQs
Should you always use React hooks? ›
Instead, always use Hooks at the top level of your React function, before any early returns. By following this rule, you ensure that Hooks are called in the same order each time a component renders. That's what allows React to correctly preserve the state of Hooks between multiple useState and useEffect calls.
Is React hooks hard to learn? ›In the long run, they become difficult to understand. Hooks solve this by allowing you to separate large components into various smaller functions, rather than having to force all the logic into a single component.
What is the disadvantage of hooks in React? ›Hooks are usually used for application logic, yet they cannot be called directly. Instead, they rely solely on property change but without the ability to actually see what was changed. These types of change-tracking hooks can be built, but they only magnify the problems in the long run.
What are the 2 rules that must be followed while using React hooks What is the reason behind such rules? ›- Hooks can only be called inside React function components.
- Hooks can only be called at the top level of a component.
- Hooks cannot be conditional.
Hooks should not be called within loops, conditions, or nested functions since conditionally executed Hooks can cause unexpected bugs. Avoiding such situations ensures that Hooks are called in the correct order each time the component renders.
Is React Hooks better than Redux? ›Redux and React Hooks should be viewed as both complementary and distinct concepts. Redux can be used to assist you manage the application data in projects of greater complexity, even though the new React Hooks additions useContext and useReducer allow you to control the global state.
How many hours does it take to learn React? ›For a programmer who is already familiar with HTML and at least one other programming language, learning React will take no more than a single day. React may be learned by a novice programmer in a matter of days. There are more libraries and technologies that may be used with React, such as Redux or Relay.
Should I learn Hooks or Redux? ›Both can be utilized if you're planning to construct an application. React Hooks features handle the local component state while Redux manages the global state and actions that can be dispatched.
Are React Hooks good practice? ›React Hooks are a powerful tool, but you should avoid overusing them. If you find yourself using multiple Hook in every component, you might be overusing them. React Hooks are most useful when you need to share state between multiple components.
Why use React Hooks over Redux? ›If you're thinking about building an application, both can be used. While Redux holds the global state and actions that can be dispatched, the React Hooks features to handle the local component state.
Are React Hooks better than classes? ›
The origin of React hooks
Hooks make React so much better because you have simpler code that implements similar functionalities faster and more effectively. You can also implement React state and lifecycle methods without writing classes. Below are code examples to illustrate React class and functional components.
The useEffect Hook is used to handle the lifecycle method in a functional component. If you're familiar with the React class lifecycle methods, you can think of the useEffect Hook as componentDidMount , componentDidUpdate , componentWillUnmount , and getDerivedStateFromProps combined as a beginner.
What is the best explanation of React Hooks? ›React Hooks are simple JavaScript functions that we can use to isolate the reusable part from a functional component. Hooks can be stateful and can manage side-effects. React provides a bunch of standard in-built hooks: useState : To manage states.
Can we call hook in another hook in React? ›You cannot call a hook inside from a nested loop, function, or condition. A hook should always be placed at the top level of your component. Hooks cannot work from a regular function. So, don't call a hook from a regular function.
What are the 4 types of Hooks? ›A hook is an opening statement (which is usually the first sentence) in an essay that attempts to grab the reader's attention so that they want to read on. It can be done by using a few different types of hooks, which are a question, quote, statistic, or anecdote.
What are the five types of Hooks? ›- 1 Statistic hook.
- 2 Quotation hook.
- 3 Anecdotal hook.
- 4 Question hook.
- 5 Statement hook.
Always use Hooks at the top level of your React function. By following this rule, you ensure that Hooks are called in the same order each time a component renders. That's what allows React to correctly preserve the state of Hooks between multiple useState and useEffect calls.
Do hooks make Redux obsolete? ›Additionally although Hooks have not made Redux obsolete some new thing always can, so its good to keep an eye out for that!
Is React Redux outdated? ›Now fast forward several years, the React ecosystem has grown so much, and the question arises, do we still need Redux? The answer for most cases is: No! You don't have to go to Redux as the default way to manage your React application's state anymore, and there are other alternatives that you can consider instead.
Is Redux still relevant 2023? ›Redux is no longer required to learn like it was in years past. The first reason for this is the release of the React Context API. In many cases, React developers used Redux to just pass data around their application's components. This is a job that React Context can do for us.
Can I master React in 3 months? ›
In short, becoming proficient with the basics of React will take you between one and six months. The exact time to master React depends on your prior software development experience and the time you are willing to dedicate toward learning.
Can I learn React in 2 weeks? ›You should be able to become proficient at React coding in a few months if you put in enough time each week. However, because React is updated so frequently with new enhancements to experience, your learning process will never truly be complete.
Can I learn React in 3 weeks? ›Let's start right away with the premise: If you have few years of experience in software development, you can learn any programming language or framework in 3 weeks. In 6 to 12 months no one will ever suspect that this is not your main language.
Why is Redux so tough? ›Single global state. Redux stores all data in a single variable called “store.” This is a problem because on large apps the store will grow, making it difficult to find specific values on it. Lazy loading is complicated in Redux.
Is Redux still worth learning? ›If your application becomes so complex that you are confused about where state is stored or how state changes, then it is a good time to learn Redux. We recommend that most new learners should focus on learning React first, and wait to learn Redux until after you're already comfortable with React.
Why should I use hooks instead of classes? ›Hooks allow you to use local state and other React features without writing a class. Hooks are special functions that let you “hook onto” React state and lifecycle features inside function components.
Can we learn React in 2 months? ›If you have less experience with the web development languages, learning React might take you a bit longer — perhaps a month or two. If you have no experience with programming at all, learning React could take up to a few months.
Can I learn ReactJS in one month? ›On average, you can expect to learn React within one to six months, depending on your prior experience. If you're a complete beginner, you'll need to spend more time learning the prerequisites before you learn React.
Is React easy to learn hard to master? ›Thankfully, React is easy to learn, but only once you have foundational knowledge in JavaScript. Of course, the difficulty that comes with learning anything new is somewhat subjective. Regardless of your prior experience, plenty of resources are available to help make React easier to learn.
What is the best practice in React? ›- Maintain Clear Folder Structure.
- Institute a Structured Import Order.
- Adhere To Naming Conventions.
- Use a Linter.
- Employ Snippet Libraries.
- Combine CSS and JavaScript.
- Limit Component Creation.
- Implement Lazy Loading.
What is the main advantage of React hooks? ›
Hooks are simpler to work with and test. Code would appear cleaner and easier to read. A related logic could be tightly coupled inside a custom hook. It simplifies how to make code more composable and reusable.
Is React hooks functional programming? ›Hooks are a powerful upgrade coming with React 16.8 and utilize the functional programming paradigm. React, however, also acknowledges the volume of class components already built, and therefore, comes with backward compatibility.
Can React hook replaces Redux? ›And yet, far too many React developers default to Redux for state management without considering other alternatives. In this tutorial, we'll introduce you to the React Context API for state management and explain how React Hooks and the Context API can replace Redux.
Should you combine Hooks with Redux? ›We recommend using the React-Redux hooks API as the default approach in your React components. The existing connect API still works and will continue to be supported, but the hooks API is simpler and works better with TypeScript.
Can custom Hooks replace Redux? ›A custom React hook could prove to be a less bloated alternative to Redux and managing the cross-component state, avoid prop-drilling and so on.
When did React stop using classes? ›Starting with version 16.8, React provides a way to use component and global state without the need for class components.
How many React hooks exist? ›You do not need to write an extra line of code in React. Hooks help write less coding functionality in React. React version 18 provides 15 hooks for developers. With 15 hooks, you achieve similar functionality to a class-based component.
How many lifecycle hooks are in React? ›A React component undergoes three phases in its lifecycle: mounting, updating, and unmounting. The mounting phase is when a new component is created and inserted into the DOM or, in other words, when the life of a component begins.
Why we use axios in React? ›Why Do We Need Axios in React? Axios allows us to communicate with APIs easily in our React apps. Though this can also be achieved by other methods like fetch or AJAX, Axios can provide a little more functionality that goes a long way with applications that use React. Axios is a promise-based library used with Node.
How do you write a good hook React? ›- Only call Hooks at the top level. Don't call Hooks inside loops, conditions, or nested functions.
- Only call Hooks from React function components.
- Don't call Hooks from regular JavaScript functions.
Why do we use useRef in React? ›
The useRef Hook allows you to persist values between renders. It can be used to store a mutable value that does not cause a re-render when updated. It can be used to access a DOM element directly.
What is the difference between React and React hooks? ›What is the difference between React and React Hooks? React is a library that helps us create interactive UIs in the browser. Hooks are a tool within React that provides ways to manage state and react to changes within our application.
When should I create a React hook? ›When would you use React custom Hooks? If you have one or multiple React hooks that will be used at multiple locations in a code, you should use custom React JS hooks. This helps in making the code more readable and make the code clean.
Do React Hooks replace hoc? ›HOC is a React independent pattern, but Hooks are part of the React. We can compose HOCs like functions but React Hooks are not composable. HOC adds one more component in the components hierarchy (we can check it in DevTools).
Why call Hooks at the top level? ›It is necessary to call Hooks at the top level of your functional component to ensure that every time your component renders, these Hooks are called in the same order. The call order is essential for Hooks to work correctly.
Do I still need Redux with React Hooks? ›Wrapping Up. State management is possible with React Hooks without a third-party tool such as Redux. In fact, it is a straightforward approach because you don't need to deal with the installation of a third-party tool. Also, it can be said that you write less code by implementing state management with Hooks.
Which is better React Hooks or classes? ›Hooks only work in function components, so if you want to use hooks, you cannot use class components. Aside from error boundaries, a function component with hooks can accomplish everything class components can with more readable and succinct code.
Should I learn React Hooks or classes? ›Even though React Hooks helped us solve many number of problems, there are still many reasons why one would still prefer class-based states due to the lifecycle methods. There is no hard and fast rule that you should be using Hooks only, but it depends on the individuals convenience and priority.
Why we should not use useEffect? ›Making API calls on useEffects can be error-prone or downright slow. So it's best to avoid it unless you certainly have to.
Do Hooks make Redux obsolete? ›Additionally although Hooks have not made Redux obsolete some new thing always can, so its good to keep an eye out for that!
What is the most used React hook? ›
The useState Hook # The useState hook is the most basic and useful React hook. Like other built-in hooks, this hook must be imported from react to be used in our application. To initialize the state, we must declare both the state and its updater function and pass an initial value.
What is the most popular React hook? ›🚀 useState :
It is the most important and often used hook. The purpose of this hook to handle reactive data, any data that changes in the application is called state, when any of the data changes, React re-renders the UI.
Both can be utilized if you're planning to construct an application. React Hooks features handle the local component state while Redux manages the global state and actions that can be dispatched.
Why should I use Hooks instead of classes? ›Hooks allow you to use local state and other React features without writing a class. Hooks are special functions that let you “hook onto” React state and lifecycle features inside function components.
Is it good practice to use multiple useEffect? ›It's perfectly fine to have have multiple useEffect.
Why is React query better than useEffect? ›The entire useEffect implementation was replaced with a single line in React Query. It erased a lot of boilerplate and makes your code easy to read. The loading, error and your data state is handled out of the box. In addition to this, it also helps with caching, background-sync and a bunch of other things.
Why use React query instead of useEffect? ›If you are familiar with data fetching in React, you know that the useEffect can be used to fetch data and reload the page. The difference between React-Query and the useEffect is that React-Query will initially return the previously fetched data and then re-fetch.