Í gegnum mörg viðtöl tók ég eftir því að jafnvel reyndir forritarar eiga í vandræðum með að greina Hooks, hvað þá þeirra flóknari eiginleika. Ég mun því reyna að útskýra í þessari grein hvernig best sé að nota Hooks.
Hér er tómt.
Mikilvægustu hlutirnir sem þú þarft að muna um Hooks:
Þau má aðeins nota í fallhlutverkum – flokkshlutverk hafa sína eigin framkvæmd lífsferils;
Þeir byrja alltaf á nota;
Þú getur notað eins marga Hooks og þú vilt, en þú þarft að muna að notkun þeirra hefur áhrif á heildarframmistöðuna;
Þau verða að vera keyrð í sama röð í hverri renderingu… en af hverju? Skoðum dæmi:
<code>srcFunctionComponent.js
Lína 11:5: React Hook "useEffect" er kallað skilyrt. <strong>React krókar</strong> verður að vera kallað í nákvæmlega sama röð í hverri íhlutarskipulagningu .eslintreact-hooks/rules-of-hooksHljóðskrift
Eins og þú sérð er þetta bara ESLint-viðvörun, svo þú getur slökkt á henni með því að bæta við skipuninni hér að neðan efst í Fallhlutverkseining
og það mun virka en aðeins þar til við uppfyllum skilyrðið sem keyrir Hook-inn okkar. Það sem við sjáum strax í kjölfarið er þessi villa.
Ógreind villa: Fleiri hooks voru keyrðir en í síðasta renderi.
React 5
FunctionComponent FunctionComponent.js:11
React 12
unstable_runWithPriority scheduler.development.js:468
React 17
javascript index.js:7
js main.chunk.js:905
Webpack 7
react-dom.development.js:15162
Hvers vegna gerist þetta? React treystir á röðina sem Hooks-arnir eru kallaðir í, því React myndi ekki vita hvað eigi að skila fyrir useEffect þar sem enginn slíkur Hook var í röðinni til að athuga.
Mundu að eslint er öflugt tól, það hjálpar okkur Greina marga mögulega galla og villur. Að slökkva á viðvörunum er hættulegt; athugaðu alltaf hvort að hunsa viðvörunina geti valdið því að forritið hrundi.
nota state
Þú veist líklega hvernig það lítur út 😉
Stofnaðu ástand (value) og aðgerð til að breyta því (setValue) með useState(0);Hljóðskrift
Þannig að þú hefur fjóra þætti: state (reactive gildi), update-fall (setter), actual hook (fall) og valfrjálst upphafsgildi. Hvers vegna skilar það fylki? Vegna þess að við getum endurskipulagt það eins og okkur hentar.
Nú vil ég einbeita mér að síðasta þættinum – upphafsgildinu. Það eru tvær leiðir til að senda upphafsástandið:
Með fastkóðuðu gildi eða einhverju slíku – sem verður kallað við hverja uppfærslu
Stofnaðu ástand (value) og aðgerð til að breyta því (setValue) með useState(0);Hljóðskrift
Með fallútgáfu. Þetta er mjög gagnlegt ef við viljum keyra upphafsástandið aðeins einu sinni, í fyrstu uppfærslunni. Kannski þarftu að framkvæma margar flóknar útreikningar til að fá upphafsástandið? Þetta mun draga úr auðlindanotkun, jibbí!
Annað sem getur valdið villum í flæði forritsins: þú veist líklega hvernig á að uppfæra ástand, ekki satt?
Settu gildi í 1;Hljóðskrift
Allt í lagi… en hvað ef ég vil uppfæra ástandið út frá fyrra ástandi?
setja gildið + 1;Hljóðskrift
Já… en nei… Hvað ef þú reynir að kalla setter-aðgerðina tvisvar sinnum í röð? Mælt er með að nota fall til að uppfæra ástand út frá fyrra ástandi. Það tryggir að þú sért að vísa til fyrra ástands.
Þessi Hook tekur tvö rök (hið seinna er valkvætt) og við notum hann til að meðhöndla aukaverkanir. Og eftir því hvaða gildi við sendum sem seinna rök, verður Hook-inn kallaður á mismunandi hátt:
án annars rökarguments – hver birting
useEffect(() => {
doSomething();
});Hljóðskrift
tóm fylki – aðeins við fyrstu birtingu
useEffect(() => {
doSomething();
}, []);
Röð með háðubreytum – í hvert sinn sem gildi í háðubreyturöðinni breytist
Notaðu `useEffect` til að framkvæma aðgerð sem fer fram eftir uppsetningu hlutans. `useEffect` er hringrás sem kallast einu sinni við upphaf hleðslu og síðan í hverri `useState`-breytingu.;Hljóðskrift
Hreinsun
Með useEffect getum við notað eitthvað sem kallast cleanup. Hvað er það til fyrir? Það er mjög gagnlegt, en ég tel að það henti best til að hreinsa viðburðastjóra. Segjum sem svo að þú viljir búa til atburðastjóra sem fer eftir ákveðnu ástandi. Þú vilt ekki bæta nýjum atburðastjóra við í hvert skipti sem ástandið breytist, því eftir nokkrar render-gerðir verða svo margir atburðastjórar að það mun hafa áhrif á frammistöðu forritsins. Frábær leið til að forðast slíkt er að nota hreinsunarvirknina. Hvernig gerirðu það? Bættu einfaldlega return-falli við useEffect.
Vegna þess að það er inni í useEffect-hookinu er return-kallið ákvarðað út frá dependency-raðnum – við hverja render-gerð, eingöngu við fyrstu render-gerðina, eða þegar gildi í dependency-raðnum breytist. En þegar komponentið er fjarlægt af kerfinu (unmounted) er hreinsun kölluð með öðrum rökstuddi, óháð öllu. Return-ið kóði er kallað áður en raunverulegi kóði frá Hook keyrir. Það er mjög rökrétt – fyrst hreinsa gamla útgáfuna, svo búa til nýja. Er það ekki?
Í fyrstu lítur það fínt út. Þú ert að sækja eitthvað gögn, og þegar gögnin berast, uppfærðu ástandið. Og hér er gildran:
Stundum færðu svona viðvörun: Ekki er hægt að framkvæma React-ástandsuppfærslu á óuppsettri íhlut. Þetta er engin aðgerð, en það bendir til minnisleka í forritinu þínu. Til að laga þetta skaltu aflýsa öllum áskriftum og ósamhverfum verkefnum í hreinsunarfalli useEffect.
Ástæðan er sú að í millitíðinni er hægt að fjarlægja þennan hluta úr sýningu, en forritið mun samt reyna að uppfæra ástand hans eftir að loforðið hefur verið uppfyllt. Hvernig á að takast á við þetta? Þú þarft að athuga hvort hlutinn sé til.
Athugið: Það er mjög svipaður Hook => useLayoutEffect() – callback-ið keyrir eftir að íhlutinn er birtur en áður en DOM-ið er sjónrænt uppfært. Hann er gagnlegur þegar unnið er með getBoundingClientRect(), en þú ættir að nota useEffect sem sjálfgefið. Af hverju? Vegna þess að hann getur hindrað sjónrænar uppfærslur – þegar þú hefur flókinn kóða inni í effect-Hookinu þínu.
Nota samhengi
Hvað er þetta til fyrir? Til að deila gögnum án þess að senda props. Samsett úr eftirfarandi þáttum:
Skapað samhengi – gögn
Samhengi veitandi – veitir samhengi fyrir alla undirstöðuþætti
Í child þarftu að flytja inn samhengi, kalla useContext-hookið og senda það samhengi sem rök.
import { UserContext } from "./App";
const { name } = useContext(UserContext);
return <h1>Hæ {name}<>
```
Svo þar. Lítur vel út. Aðallega til að senda áfram alþjóðleg gögn, eins og þemu o.s.frv. Ekki er mælt með notkun þess í verkefnum með mjög örtum breytingum.
Auðvitað getum við búið til sérsniðinn samhengi-veitanda og sérsniðið Hook til að draga úr endurtekningum í kóðanum… en ég mun fjalla um sérsniðna Hooks í næsta grein.
Notaðu reducer
Það gerir okkur kleift að stjórna ástandinu og endurteikna þegar ástandið breytist – eins og useState. Það er svipað og endur Reducer. Þetta er betra en useState þegar ástandsreiknireglan er flóknari.
Hvað er þetta til fyrir? Það má nota þegar við viljum endurstilla ástandið í upphafsgildi þess. Hér að neðan má finna gott dæmi:
// Foreldri
// Barn
function init(initialNumber) {
return { number: initialNumber };
}
function reducer(state, action) {
switch (action.type) {
case "breyta":
return { number: Math.random() };
case "endurstilla":
return init(action.payload);
default:
throw new Error();
}
}
export default function ChildComponent({ getFactorial }) {
const [state, dispatch] = useReducer(reducer, initialNumber, init);
return (
<>
<h2>Númer: {state.number}</h2>
<button
onclick="{()" > Endurstilla
</button>
<button onclick="{()" > dispatch({ type: "change" })}>Teikna</button>
</>
);
}
Númer: {state.number}
Notaðu callback-hnappinn
Hvenær á að nota það? Þegar við viljum ná vísitengdri jafngildi (og þar með fækka þeim fallum sem búin eru til). Þetta Hook skilar fallinu, ólíkt useMemo sem skilar gildinu.
Dæmi: Búðu til fall í foreldrisamsetningunni og sendu það síðan með props
Skoðaðu síðan í barnahlutanum hversu oft effect Hook verður kallaður eftir að þú bætir þessari aðgerð við háðnaraðgerðarröðina:
// Barn
useEffect(() => {
console.log("getSquaredValue", getSquaredValue());
}, [getSquaredValue]);Hljóðskrift
Það mun skrá í konsóluna í hverri rennsli! Jafnvel þó gildin inni í fá ferkvaðurgildið Funkían breyttist ekki. En við getum forðast þetta með því að pakka þeirri funkíu inn í useCallback.
`getSquaredValue` er `useCallback`-kall sem skilar gildinu `count * count` og tekur `count` sem argument.Hljóðskrift
Við getum einnig sent nokkra breytur til þessarar falli:
Það er ekki hlutlaust þegar litið er á kostnað auðlinda – useMemo þarf að kalla á í hverri render-ferli, það geymir gildið í minni og ber það saman (aukinn minnisþungi),
notar memoization – fínstillingartækni, sérstakt form skyndiminni.
Þú ættir að nota það eingöngu í tveimur aðstæðum:
Ef þú vilt koma í veg fyrir að kalla á flókinn kóða í hverri uppfærslu;
Ef þú vilt ná tilvísunarsamræmi.
Skoðum aðeins nánar seinna tilfellið. Við viljum nota useEffect með hlut sem háðubreytu. Þar sem hlutir eru bornir saman eftir vísun þeirra, er useEffect kallað við hverja uppfærslu. Til að forðast þetta getum við sameinað useEffect og useMemo til að memo-a slíka hluti og síðan sent þá memo-aða hluti í háðubreyturörið. Stutt dæmi:
'hobbit'-hluturinn veldur því að háð breytist í useEffect Hook (lína 49) við hverja uppfærslu. Færðu hann inn í useEffect callback-inn. Annars umkringdu upphafsvinnsluna fyrir 'hobbit' í eigin useMemo() Hook.eslintreact-hooks/exhaustive-deps
Það mikilvægasta: useRef kallar ekki fram endurteikningu (eins og useState), því það er ekki tengt teiknunarhringnum – það geymir sömu vísun milli teikninga.
`const ref = useRef(0);`;Hljóðskrift
Til að kalla á vistað gildi þarftu að nota núverandi eiginleika (ref er hlutur) – núverandi tilvísun
Annar tilgangurinn sem við getum notað þennan Hook er að vísa í þætti innan HTML. Hver þáttur hefur ref-eiginleika. Þannig getum við meðhöndlað fókus, atburði o.s.frv.
Í þriðja tilvikinu getum við notað refs til að takast á við óstýrða íhluti. Þú getur lesið meira um þá í react skjöl, En í stuttu máli lítur þetta svona út:
Eins og þú sérð er enginn atburðastjóri, hann geymir bara innsláttarverðgildið. Þetta er frábært til að meðhöndla einföld eyðublöð þegar þú vilt bara lesa varin gildi þegar þú þarft á þeim að halda (til dæmis við innsendingu).
Bónus: Það er frábært þegar þú þarft að muna fyrri gildi í state. Þú getur notað useEffect-hookið til þess; sendu bara state-ið til ref-sins.
Eins og þú sérð eru hókar ekki svo augljósir. Við getum sameinað þá til að leysa mörg vandamál. Þú munt án efa hagnast verulega á því að rannsaka þetta efni.
Og það eru líka sérsniðnir krókar…
Að lokum, React krókar hafa byltingarkennt leiðina React forritarar Nálgun byggingar vefur forrit . Með því að bjóða upp á innsæi og skilvirkari leið til að stjórna ástandi og lífsferli í virknihlutum hafa hooks orðið ómissandi hluti af React þróun.
Hvort sem þú ert reyndur forritari eða rétt að byrja með React, er mikilvægt að skilja vinsælustu hooks-ana og notkunartilvik þeirra. Með hooks-um eins og useState, useEffect, useContext og fleiri, React íhlutir má byggja með hreinni og endurnýtanlegri kóða. Ennfremur getan til að búa til sérsniðnir krókar Leyfir forriturum að fanga og deila skynsemi á milli margra þátta, sem eykur endurnýtanleika kóða og móduleiningaskipan. Þegar React heldur áfram að þróast og bætir við nýjum eiginleikum munu hooks án efa gegna miðlægu hlutverki við að nýta alla möguleika rammasins.
Svo, hvort sem þú ert að vinna að smáforriti eða stórfelldu vefumsókn, að tileinka þér React krókar mun bæta þróunarvinnuflæði þitt og opna fjölda möguleika til að búa til trausta og eiginleikaríka React-umsóknir .