Optimeerige React Contexti jÔudlust valijamustri abil. Parandage uuesti renderdamist ja rakenduse efektiivsust praktiliste nÀidete ja parimate tavadega.
Reacti konteksti optimeerimine: valijamuster ja jÔudlus
Reacti kontekst pakub vĂ”imsat mehhanismi rakenduse oleku haldamiseks ja selle jagamiseks komponentide vahel ilma rekvisiitide sĂŒgavale suunamise vajaduseta. Kuid konteksti naiivsed rakendused vĂ”ivad viia jĂ”udluse kitsaskohtadeni, eriti suurtes ja keerulistes rakendustes. Iga kord, kui konteksti vÀÀrtus muutub, renderdatakse uuesti kĂ”ik seda konteksti kasutavad komponendid, isegi kui need sĂ”ltuvad ainult vĂ€ikesest osast andmetest.
See artikkel sĂŒveneb valijamustrisse kui strateegiasse Reacti konteksti jĂ”udluse optimeerimiseks. Uurime, kuidas see toimib, selle eeliseid ja esitame praktilisi nĂ€iteid selle kasutamise illustreerimiseks. Samuti arutleme seotud jĂ”udluse kaalutluste ja alternatiivsete optimeerimistehnikate ĂŒle.
Probleemi mÔistmine: mittevajalik uuesti renderdamine
PĂ”hiprobleem tuleneb asjaolust, et Reacti Contexti API kĂ€ivitab vaikimisi kĂ”igi konteksti kasutavate komponentide uuesti renderdamise, kui konteksti vÀÀrtus muutub. MĂ”elge stsenaariumile, kus teie kontekst sisaldab suurt objekti, mis sisaldab kasutajaprofiili andmeid, teemaseadeid ja rakenduse konfiguratsiooni. Kui vĂ€rskendate kasutajaprofiili ĂŒhte omadust, renderdatakse uuesti kĂ”ik konteksti kasutavad komponendid, isegi kui need sĂ”ltuvad ainult teemaseadetest.
See vĂ”ib viia mĂ€rkimisvÀÀrse jĂ”udluse halvenemiseni, eriti keeruliste komponentide hierarhiate ja sagedaste konteksti vĂ€rskenduste puhul. Tarbetud uuesti renderdamised raiskavad vÀÀrtuslikke protsessori tsĂŒkleid ja vĂ”ivad pĂ”hjustada aeglaseid kasutajaliideseid.
Valijamuster: sihipÀrased vÀrskendused
Valijamuster pakub lahendust, vÔimaldades komponentidel tellida ainult neid konteksti vÀÀrtuse osi, mida nad vajavad. Selle asemel, et kasutada kogu konteksti, kasutavad komponendid valijafunktsioone asjakohaste andmete ekstraheerimiseks. See vÀhendab uuesti renderdamise ulatust, tagades, et vÀrskendatakse ainult komponente, mis tegelikult sÔltuvad muudetud andmetest.
Kuidas see toimib:
- Konteksti pakkuja: Konteksti pakkuja hoiab rakenduse olekut.
- Valijafunktsioonid: Need on puhtad funktsioonid, mis vÔtavad konteksti vÀÀrtuse sisendina ja tagastavad tuletatud vÀÀrtuse. Need toimivad filtritena, ekstraheerides kontekstist konkreetseid andmeosi.
- Kasutavad komponendid: Komponendid kasutavad kohandatud konksu (sageli nimega `useContextSelector`), et tellida valijafunktsiooni vÀljund. See konks vastutab valitud andmete muutuste tuvastamise ja uuesti renderdamise kÀivitamise eest ainult vajadusel.
Valijamustri rakendamine
Siin on pÔhinÀide valijamustri rakendamisest:
1. Konteksti loomine
Esiteks mÀÀratleme oma konteksti. Kujutleme konteksti kasutaja profiili ja teemaseadete haldamiseks.
import React, { createContext, useState, useContext } from 'react';
const AppContext = createContext({});
const AppProvider = ({ children }) => {
const [user, setUser] = useState({
name: 'John Doe',
email: 'john.doe@example.com',
location: 'New York'
});
const [theme, setTheme] = useState({
primaryColor: '#007bff',
secondaryColor: '#6c757d'
});
const updateUserName = (name) => {
setUser(prevUser => ({ ...prevUser, name }));
};
const updateThemeColor = (primaryColor) => {
setTheme(prevTheme => ({ ...prevTheme, primaryColor }));
};
const value = {
user,
theme,
updateUserName,
updateThemeColor
};
return (
{children}
);
};
export { AppContext, AppProvider };
2. Valijafunktsioonide loomine
JÀrgmisena mÀÀratleme valijafunktsioonid soovitud andmete kontekstist ekstraheerimiseks. NÀiteks:
const selectUserName = (context) => context.user.name;
const selectPrimaryColor = (context) => context.theme.primaryColor;
3. Kohandatud konksu loomine (`useContextSelector`)
See on valijamustri tuum. `useContextSelector` konks vÔtab sisendina valijafunktsiooni ja tagastab valitud vÀÀrtuse. Samuti haldab see tellimist kontekstile ja kÀivitab uuesti renderdamise ainult siis, kui valitud vÀÀrtus muutub.
import { useContext, useState, useEffect, useRef } from 'react';
const useContextSelector = (context, selector) => {
const [selected, setSelected] = useState(() => selector(useContext(context)));
const latestSelector = useRef(selector);
const contextValue = useContext(context);
useEffect(() => {
latestSelector.current = selector;
});
useEffect(() => {
const nextSelected = latestSelector.current(contextValue);
if (!Object.is(selected, nextSelected)) {
setSelected(nextSelected);
}
}, [contextValue]);
return selected;
};
export default useContextSelector;
Selgitus:
- `useState`: lÀhtesta `selected` valijaga tagastatud algvÀÀrtusega.
- `useRef`: salvesta uusim `selector` funktsioon, tagades, et kasutatakse kÔige ajakohasemat valijat, isegi kui komponent uuesti renderdatakse.
- `useContext`: hanki praegune konteksti vÀÀrtus.
- `useEffect`: see efekt kĂ€ivitub alati, kui `contextValue` muutub. Sees uuesti arvutatakse valitud vÀÀrtus, kasutades `latestSelectorit`. Kui uus valitud vÀÀrtus erineb praegusest `selected` vÀÀrtusest (kasutades sĂŒgavaks vĂ”rdluseks `Object.is`), siis `selected` olekut uuendatakse, mis kĂ€ivitab uuesti renderdamise.
4. Konteksti kasutamine komponentides
NĂŒĂŒd saavad komponendid kasutada konksu `useContextSelector`, et tellida konteksti konkreetseid osi:
import React from 'react';
import { AppContext, AppProvider } from './AppContext';
import useContextSelector from './useContextSelector';
const UserName = () => {
const userName = useContextSelector(AppContext, selectUserName);
return User Name: {userName}
;
};
const ThemeColorDisplay = () => {
const primaryColor = useContextSelector(AppContext, selectPrimaryColor);
return Theme Color: {primaryColor}
;
};
const App = () => {
return (
);
};
export default App;
Selles nÀites renderdatakse `UserName` uuesti ainult siis, kui kasutaja nimi muutub, ja `ThemeColorDisplay` renderdatakse uuesti ainult siis, kui pÔhivÀrv muutub. Kasutaja e-posti aadressi vÔi asukoha muutmine *ei* pÔhjusta `ThemeColorDisplay` uuesti renderdamist ja vastupidi.
Valijamustri eelised
- VÀhendatud uuesti renderdamine: Peamine eelis on tarbetute uuesti renderdamiste mÀrkimisvÀÀrne vÀhenemine, mis toob kaasa parema jÔudluse.
- Parem jÔudlus: Uuesti renderdamise minimeerimisega muutub rakendus reageerivamaks ja tÔhusamaks.
- Koodi selgus: Valijafunktsioonid edendavad koodi selgust ja hooldatavust, mÀÀrates selgelt komponentide andmesÔltuvused.
- Testitavus: Valijafunktsioonid on puhtad funktsioonid, mistÔttu neid on lihtne testida ja pÔhjustada.
Kaalutlused ja optimeerimised
1. Memoization
Memoization vÔib veelgi suurendada valijafunktsioonide jÔudlust. Kui sisendi konteksti vÀÀrtus pole muutunud, vÔib valijafunktsioon tagastada vahemÀllu salvestatud tulemuse, vÀltides tarbetuid arvutusi. See on eriti kasulik keeruliste valijafunktsioonide puhul, mis teostavad kalleid arvutusi.
Saate kasutada `useMemo` konksu oma `useContextSelector` rakenduses valitud vÀÀrtuse memoiseerimiseks. See lisab veel ĂŒhe optimeerimise kihi, vĂ€ltides tarbetuid uuesti renderdamisi isegi siis, kui konteksti vÀÀrtus muutub, kuid valitud vÀÀrtus jÀÀb samaks. Siin on uuendatud `useContextSelector` koos memoizationiga:
import { useContext, useState, useEffect, useRef, useMemo } from 'react';
const useContextSelector = (context, selector) => {
const latestSelector = useRef(selector);
const contextValue = useContext(context);
useEffect(() => {
latestSelector.current = selector;
}, [selector]);
const selected = useMemo(() => latestSelector.current(contextValue), [contextValue]);
return selected;
};
export default useContextSelector;
2. Objekti muutumatus
Konteksti vÀÀrtuse muutumatuse tagamine on valijamustri Ă”igeks toimimiseks ĂŒlioluline. Kui konteksti vÀÀrtust muteeritakse otse, ei pruugi valijafunktsioonid muutusi tuvastada, mis viib valede renderdusteni. Looge konteksti vÀÀrtuse vĂ€rskendamisel alati uued objektid vĂ”i massiivid.
3. SĂŒgavad vĂ”rdlused
Konks `useContextSelector` kasutab valitud vÀÀrtuste vĂ”rdlemiseks `Object.is`. See teostab pinnalise vĂ”rdluse. Keeruliste objektide puhul peate vĂ”ib-olla kasutama sĂŒgavat vĂ”rdlusfunktsiooni muutuste tĂ€pseks tuvastamiseks. Kuid sĂŒgavad vĂ”rdlused vĂ”ivad olla arvutuslikult kulukad, seega kasutage neid mĂ”istlikult.
4. Alternatiivid `Object.is`
Kui `Object.is` ei ole piisav (nt teil on oma kontekstis sĂŒgavalt pesastatud objekte), kaaluge alternatiive. Raamatukogud, nagu `lodash`, pakuvad sĂŒgavate vĂ”rdluste jaoks `_.isEqual`, kuid pidage meeles jĂ”udluse mĂ”ju. MĂ”nel juhul vĂ”ivad struktuurilised jagamistehnikad, kasutades muutumatuid andmestruktuure (nt Immer), olla kasulikud, kuna need vĂ”imaldavad teil muuta pesastatud objekti, ilma et originaali muteeritaks, ja neid saab sageli vĂ”rrelda `Object.is` abil.
5. `useCallback` valijate jaoks
Funktsioon `selector` ise vÔib olla tarbetu uuesti renderdamise allikas, kui seda ei memoiseerita Ôigesti. Andke `selector` funktsioon `useCallbackile`, et tagada selle uuesti loomine ainult siis, kui selle sÔltuvused muutuvad. See hoiab Àra kohandatud konksu tarbetud vÀrskendused.
const UserName = () => {
const userName = useContextSelector(AppContext, useCallback(selectUserName, []));
return User Name: {userName}
;
};
6. Raamatukogude, nagu `use-context-selector`, kasutamine
Raamatukogud nagu `use-context-selector` pakuvad eelnevalt ehitatud konksu `useContextSelector`, mis on optimeeritud jÔudluseks ja sisaldab selliseid funktsioone nagu pinnaline vÔrdlus. Selliste raamatukogude kasutamine vÔib teie koodi lihtsustada ja vÀhendada vigade tekkimise ohtu.
import { useContextSelector } from 'use-context-selector';
import { AppContext } from './AppContext';
const UserName = () => {
const userName = useContextSelector(AppContext, selectUserName);
return User Name: {userName}
;
};
Globaalsed nÀited ja parimad tavad
Valijamuster on rakendatav erinevates kasutusalades globaalsetes rakendustes:
- Lokaliseerimine: Kujutage ette e-kaubanduse platvormi, mis toetab mitut keelt. Kontekst vÔib sisaldada praegust lokaati ja tÔlkeid. Teksti kuvavad komponendid saavad kasutada valijaid, et ekstraheerida asjakohane tÔlge praeguse lokaadi jaoks.
- Teema haldamine: Sotsiaalmeedia rakendus vÔib lubada kasutajatel teemat kohandada. Kontekst vÔib salvestada teemaseaded ja UI elemente kuvavad komponendid saavad kasutada valijaid asjakohaste teemaomaduste (nt vÀrvid, fondid) ekstraheerimiseks.
- Autentimine: Globaalne ettevÔtte rakendus vÔib kasutada konteksti kasutaja autentimise oleku ja Ôiguste haldamiseks. Komponendid saavad kasutada valijaid, et mÀÀrata, kas praegusel kasutajal on juurdepÀÀs konkreetsetele funktsioonidele.
- Andmete hankimise olek: Paljud rakendused kuvavad laadimisolekuid. Kontekst vÔib hallata API-kÔnede olekut ja komponendid saavad selektiivselt tellida konkreetsete lÔpp-punktide laadimisoleku. NÀiteks kasutajaprofiili kuvav komponent vÔib tellida ainult `GET /user/:id` lÔpp-punkti laadimisoleku.
Alternatiivsed optimeerimistehnikad
Kuigi valijamuster on vÔimas optimeerimistehnika, pole see ainus saadaolev tööriist. Kaaluge neid alternatiive:
- `React.memo`: MÀhkige funktsionaalsed komponendid `React.memo` abil, et vÀltida uuesti renderdamist, kui rekvisiidid pole muutunud. See on kasulik rekvisiite otse saavate komponentide optimeerimiseks.
- `PureComponent`: Kasutage klassikomponentide jaoks `PureComponenti`, et teha rekvisiitide ja oleku pinnaline vÔrdlus enne uuesti renderdamist.
- Koodi jagamine: Lammutage rakendus vĂ€iksemateks tĂŒkkideks, mida saab nĂ”udmisel laadida. See vĂ€hendab algset laadimisaega ja parandab ĂŒldist jĂ”udlust.
- Virtualiseerimine: Suurte andmeloendite kuvamiseks kasutage virtualiseerimistehnikaid, et renderdada ainult nĂ€htavad ĂŒksused. See parandab oluliselt jĂ”udlust suurte andmekogumitega tegelemisel.
JĂ€reldus
Valijamuster on vÀÀrtuslik tehnika Reacti konteksti jÔudluse optimeerimiseks, minimeerides tarbetuid uuesti renderdamisi. VÔimaldades komponentidel tellida ainult neid konteksti vÀÀrtuse osi, mida nad vajavad, parandab see rakenduse reageerimisvÔimet ja tÔhusust. Kombineerides seda teiste optimeerimistehnikatega, nagu memoization ja koodi jagamine, saate luua suure jÔudlusega Reacti rakendusi, mis pakuvad sujuvat kasutuskogemust. Pidage meeles, et valige Ôige optimeerimisstrateegia vastavalt oma rakenduse konkreetsetele vajadustele ja kaaluge hoolikalt kaasnevaid kompromisse.
See artikkel pakkus pÔhjaliku juhendi valijamustrile, sealhulgas selle rakendamisele, eelistele ja kaalutlustele. JÀrgides selles artiklis kirjeldatud parimaid tavasid, saate oma Reacti konteksti kasutamist tÔhusalt optimeerida ja luua globaalsele publikule suure jÔudlusega rakendusi.