Ez az új hook segíthet sok általános kód egyszerűsítésében.
Az Ön által kifejlesztett React-alkalmazások gyakran külső API-ból kérnek le adatokat, és a React csapata gondoskodott ennek az igénynek a kielégítéséről. A használat() hook leegyszerűsíti az adatlekérési folyamatot.
Ezzel a horoggal csökkentheti az ígéretek meghatározásához és az alkalmazás állapotának frissítéséhez szükséges alapkód mennyiségét. Tudjon meg mindent a React-ról használat() horog, és hogyan használhatja azt a React projektekben.
Az alapkomponens
Vegyük például a következő összetevőt:
import {useEffect, useState} from"react"
exportfunctionData({ url }) {
const [isLoading, setIsLoading] = useState(true)
const [isError, setIsError] = useState(false)
const [data, setData] = useState()useEffect(() => {
setIsError(false)
setIsLoading(true)
setData(undefined)fetch(url)
.then(res => res.json())
.then(setData)
.catch(() => setIsError(true))
.finally(() => setIsLoading(false))
})
return isLoading? (
Loading...</h1>
): isError? (Error</h1>
): ({JSON.stringify(data, null, 2)}</pre>
)
}
Miután a React megjeleníti ezt az összetevőt, az használja az API-t a fetch() segítségével. Ezután vagy elmenti az adatokat az összetevő állapotába, ha a kérés sikeres volt, vagy beállítja a isError változóból igaz, ha nem így van.
Az állapottól függően vagy az API-ból származó adatokat, vagy hibaüzenetet jelenít meg. Amíg az API-kérés függőben van, a "Betöltés..." szöveg jelenik meg az oldalon.
A useHook() megvalósítás
A fenti komponens egy kicsit nehézkes, mivel tele van alapkóddal. A probléma megoldásához hozza be a használat() hook and refaktorálja a kódját.
A use() hook segítségével a fenti komponens mindössze két sornyi kódra redukálható. Mielőtt azonban ezt megtenné, vegye figyelembe, hogy ez a horog meglehetősen új, így csak a React kísérleti verziójában használhatja. Tehát győződjön meg róla, hogy ezt a verziót használja:
// package.json
"dependencies": {
"react": "experimental",
"react-dom": "experimental"
}
...
Most már készen áll a horog használatára, először a horog cseréjével useState és useEffect import csak használat:
import {use} from"react"
Benne Adat komponens, az egyetlen dolog, amit meg fog tartani, az a lekérési kérés. De a lekérési kérelmet a saját belsejébe kell csomagolnia használat() horog; vagy JSON-adatokat, vagy hibát ad vissza. Ezután állítsa be a választ egy meghívott változóra adat:
exportfunctionData({ url }) {
const data = use(fetch(url).then(res => res.json()))
return<pre>{JSON.stringify(data, null, 2)}pre>
}
Ez minden! Mint látható, a fenti kód csak két sornyi kódra redukálja az összetevőt. Ez azt mutatja, hogy a use() hook mennyire hasznos lehet az ehhez hasonló forgatókönyvekben.
Betöltési állapot (felfüggesztés)
Fontos része a használat() hook kezeli a terhelési és hibaállapotokat. Ezt megteheti a szülőkomponensen belül Adat.
A betöltési funkció megvalósításához csomagolja be a Adat összetevővel Suspense. Ez az összetevő tartalék támasztékot vesz fel, amelyet bármikor megjelenít, amikor betöltési állapotban van:
exportdefaultfunctionApp () {
const [url, setUrl] = useState(URL.USERS)
return (
<>Loading...</div>}>
</Suspense>
</>
)
}
A használat() az Adat komponensben lévő horog hatására ez a feszültség betöltődik. Míg az ígéret még megoldásra vár, a App összetevő a tartalék állapotot jeleníti meg. Aztán amikor a Adat komponens fogadja a válaszadatokat, a betöltési állapot helyett a tartalmat jeleníti meg.
Hibakezelés hibahatárral
Ha a hibák elkapásáról van szó, tudnia kell hogyan működik az Error Boundary használni. Általában akkor használja, amikor a Suspense-szal dolgozik.
Egy példa a hibahatárra a következő kódban:
import React from"react"
classErrorBoundaryextendsReact.Component{
state = { hasError: false, error: null }static getDerivedStateFromError(error) {
return {
hasError: true,
error
}
}render() {
if (this.state.hasError) {
returnthis.props.fallback
}returnthis.props.children
}
}
exportdefault ErrorBoundary;
Ebben a hibahatár-példában van egy állapotobjektum, amely nyomon követi a hibaállapotot és a hibát. Ezután megkapja a hibából származtatott állapotot. A Vakol() függvény hiba esetén a tartalék elemet jeleníti meg. Ellenkező esetben azt jeleníti meg, ami benne van .
A fenti komponens nagyjából ugyanúgy működik, mint a Suspense. Tehát az App komponensben mindent becsomagolhat az alkalmazásba ErrorBoundary ilyen komponens:
exportdefaultfunctionApp () {
const [url, setUrl] = useState(URL.USERS)
return (
<>Oops! There's an error.
</Suspense>
</ErrorBoundary>
</>
)
}
Ha a beágyazott kódok bármelyike hibát jelez, a hibahatár ezen keresztül fogja el getDerivedStateFromError() és frissítse az állapotot, ami viszont a tartalék szöveget jeleníti meg: "Hoppá! Hiba van."
A use() Hook szabályok
Tehát a use() hook segíthet csökkenteni a kazánkód mennyiségét, és megkönnyíti a betöltést és a hibaállapotokat. De a use() hook-nak van egy másik nagyon praktikus felhasználási módja is.
Tegyük fel, hogy Ön a kelleneFetch boolean, mint egy kellék a Adat összetevőt, és csak akkor szeretné futtatni a lekérést, ha kelleneFetch van igaz.
Nem tudod becsomagolni a hagyományos React horgok belsejében egy ha kijelentést, de a használat() a horog más. Szinte bárhol használhatod (becsomagolva a számára hurok, ha nyilatkozat stb.):
exportfunctionData({ url, shouldFetch }) {
let data = "Default data"if (shouldFetch) {
const data = use(fetch(url).then(res => res.json()))
}
return<pre>{JSON.stringify(data, null, 2)}pre>
}
A fenti kóddal a React alapértelmezés szerint "Alapértelmezett adatokat" jelenít meg. De ha azt mondod neki, hogy hajtsa végre a letöltést azáltal, hogy átadja a kelleneFetch a szülőtől származó támasztékot, akkor benyújtja a kérést, és hozzárendeli a választ adat.
Még egy érdekesség a használat() a horog az, hogy nem csak ígéretekkel kell használni. Például az írás idején átadhatja kontextusban:
exportfunctionData({ url, shouldFetch }) {
let data = "Default data"if (shouldFetch) {
const data = use(Context)
}
return<pre>{JSON.stringify(data, null, 2)}pre>
}
Míg a useContext() használata teljesen rendben van, nem használhatja az if utasításokon és ciklusokon belül. De becsomagolhatod a use() hook-ot az if utasításokba és a for ciklusokba.
A React Hook legjobb gyakorlatai
A use() hook csak egy a React által biztosított sok horog közül. A React ismeretek fejlesztéséhez elengedhetetlen, hogy ismerkedjen ezekkel a horgokkal és a legjobb használatukkal.