Eesti

Õppige, kuidas kasutada React Context Selectori mustrit, et optimeerida uuesti renderdamist ja parandada oma Reacti rakenduste jõudlust. Sisaldab praktilisi näiteid ja globaalseid parimaid tavasid.

React Context Selectori Muster: Jõudluse optimeerimine uuesti renderdamise kaudu

React Context API pakub võimsat viisi globaalse oleku haldamiseks teie rakendustes. Siiski tekib Contexti kasutamisel tavaline väljakutse: ebavajalikud uuesti renderdamised. Kui Contexti väärtus muutub, renderdatakse uuesti kõik komponendid, mis seda Contexti kasutavad, isegi kui nad sõltuvad ainult väikesest osast Contexti andmetest. See võib põhjustada jõudluse kitsaskohti, eriti suuremates ja keerukamates rakendustes. Context Selectori muster pakub lahenduse, võimaldades komponentidel tellida ainult need konkreetsed Contexti osad, mida nad vajavad, vähendades oluliselt ebavajalikke uuesti renderdamisi.

Probleemi mõistmine: Ebavajalikud uuesti renderdamised

Illustreerime seda näitega. Kujutage ette e-kaubanduse rakendust, mis salvestab kasutajateavet (nimi, e-posti aadress, riik, keele-eelistus, ostukorvi sisu) Contexti providerisse. Kui kasutaja uuendab oma keele-eelistust, renderdatakse uuesti kõik Contexti tarbivad komponendid, sealhulgas need, mis kuvavad ainult kasutaja nime. See on ebaefektiivne ja võib mõjutada kasutajakogemust. Mõelge kasutajatele erinevates geograafilistes asukohtades; kui Ameerika kasutaja uuendab oma profiili, ei tohiks Euroopa kasutaja andmeid kuvav komponent *mitte* uuesti renderduda.

Miks on uuesti renderdamine oluline

Tutvustame Context Selectori Mustrit

Context Selectori muster lahendab ebavajalike uuesti renderdamiste probleemi, võimaldades komponentidel tellida ainult need konkreetsed Contexti osad, mida nad vajavad. See saavutatakse selektorfunktsiooni abil, mis eraldab vajalikud andmed Contexti väärtusest. Kui Contexti väärtus muutub, võrdleb React selektorfunktsiooni tulemusi. Kui valitud andmed ei ole muutunud (kasutades ranget võrdsust, ===), siis komponenti uuesti ei renderdata.

Kuidas see töötab

  1. Määratlege Context: Looge React Context, kasutades React.createContext().
  2. Looge Provider: Mähi oma rakendus või asjakohane osa Context Provideriga, et muuta Contexti väärtus selle lastele kättesaadavaks.
  3. Rakendage Selektorid: Määratlege selektorfunktsioonid, mis eraldavad konkreetsed andmed Contexti väärtusest. Need funktsioonid on puhtad ja peaksid tagastama ainult vajalikud andmed.
  4. Kasutage Selektorit: Kasutage kohandatud hooki (või teeki), mis kasutab useContext'i ja teie selektorfunktsiooni valitud andmete hankimiseks ja tellib muudatusi ainult nendes andmetes.

Context Selectori Mustri rakendamine

Mitmed teegid ja kohandatud rakendused võivad hõlbustada Context Selectori mustri kasutamist. Uurime levinud lähenemist, kasutades kohandatud hooki.

Näide: Lihtne kasutajakontekst

Vaatleme kasutajakonteksti järgmise struktuuriga:

const UserContext = React.createContext({ name: 'John Doe', email: 'john.doe@example.com', country: 'USA', language: 'en', theme: 'light' });

1. Contexti loomine

const UserContext = React.createContext({ name: 'John Doe', email: 'john.doe@example.com', country: 'USA', language: 'en', theme: 'light' });

2. Provideri loomine

const UserProvider = ({ children }) => { const [user, setUser] = React.useState({ name: 'John Doe', email: 'john.doe@example.com', country: 'USA', language: 'en', theme: 'light' }); const updateUser = (updates) => { setUser(prevUser => ({ ...prevUser, ...updates })); }; const value = React.useMemo(() => ({ user, updateUser }), [user]); return ( {children} ); };

3. Kohandatud hooki loomine selektoriga

import React from 'react'; function useUserContext() { const context = React.useContext(UserContext); if (!context) { throw new Error('useUserContext must be used within a UserProvider'); } return context; } function useUserSelector(selector) { const context = useUserContext(); const [selected, setSelected] = React.useState(() => selector(context.user)); React.useEffect(() => { setSelected(selector(context.user)); // Initial selection const unsubscribe = context.updateUser; return () => {}; // No actual unsubscription needed in this simple example, see below for memoizing. }, [context.user, selector]); return selected; }

Oluline märkus: Ülaltoodud `useEffect`'il puudub korrektne memoisatsioon. Kui `context.user` muutub, käivitub see *alati* uuesti, isegi kui valitud väärtus on sama. Tugeva, memoiseeritud selektori jaoks vaadake järgmist jaotist või teeke nagu `use-context-selector`.

4. Selektori hooki kasutamine komponendis

function UserName() { const name = useUserSelector(user => user.name); return

Nimi: {name}

; } function UserEmail() { const email = useUserSelector(user => user.email); return

E-post: {email}

; } function UserCountry() { const country = useUserSelector(user => user.country); return

Riik: {country}

; }

Selles näites renderdatakse komponendid UserName, UserEmail ja UserCountry uuesti ainult siis, kui nende valitud konkreetsed andmed (vastavalt nimi, e-posti aadress, riik) muutuvad. Kui kasutaja keele-eelistust uuendatakse, siis neid komponente *ei* renderdata uuesti, mis toob kaasa märkimisväärse jõudluse paranemise.

Selektorite ja väärtuste memoisatsioon: Optimeerimise jaoks hädavajalik

Selleks, et Context Selectori muster oleks tõeliselt tõhus, on memoisatsioon ülioluline. Ilma selleta võivad selektorfunktsioonid tagastada uusi objekte või massiive isegi siis, kui alusandmed pole semantiliselt muutunud, mis põhjustab ebavajalikke uuesti renderdamisi. Samamoodi on oluline tagada, et ka provideri väärtus oleks memoiseeritud.

Provideri väärtuse memoisatsioon useMemo abil

useMemo hooki saab kasutada väärtuse memoisatsiooniks, mis edastatakse UserContext.Provider'ile. See tagab, et provideri väärtus muutub ainult siis, kui aluseks olevad sõltuvused muutuvad.

const UserProvider = ({ children }) => { const [user, setUser] = React.useState({ name: 'John Doe', email: 'john.doe@example.com', country: 'USA', language: 'en', theme: 'light' }); const updateUser = (updates) => { setUser(prevUser => ({ ...prevUser, ...updates })); }; // Memoiseeri väärtus, mis edastatakse providerile const value = React.useMemo(() => ({ user, updateUser }), [user, updateUser]); return ( {children} ); };

Selektorite memoisatsioon useCallback abil

Kui selektorfunktsioonid on määratletud otse komponendi sees, luuakse need igal renderdamisel uuesti, isegi kui need on loogiliselt samad. See võib nullida Context Selectori mustri eesmärgi. Selle vältimiseks kasutage selektorfunktsioonide memoisatsiooniks useCallback hooki.

function UserName() { // Memoiseeri selektorfunktsioon const nameSelector = React.useCallback(user => user.name, []); const name = useUserSelector(nameSelector); return

Nimi: {name}

; }

Süvavõrdlus ja muutumatud andmestruktuurid

Keerulisemate stsenaariumide puhul, kus Contexti andmed on sügavalt pesastatud või sisaldavad muutuvaid objekte, kaaluge muutumatute andmestruktuuride (nt Immutable.js, Immer) kasutamist või süvavõrdlusfunktsiooni rakendamist oma selektoris. See tagab, et muudatused tuvastatakse õigesti, isegi kui aluseks olevaid objekte on kohapeal muudetud.

Teegid Context Selectori Mustri jaoks

Mitmed teegid pakuvad valmislahendusi Context Selectori mustri rakendamiseks, lihtsustades protsessi ja pakkudes lisafunktsioone.

use-context-selector

use-context-selector on populaarne ja hästi hooldatud teek, mis on spetsiaalselt selleks otstarbeks loodud. See pakub lihtsat ja tõhusat viisi konkreetsete väärtuste valimiseks Contextist ja ebavajalike uuesti renderdamiste vältimiseks.

Paigaldamine:

npm install use-context-selector

Kasutamine:

import { useContextSelector } from 'use-context-selector'; function UserName() { const name = useContextSelector(UserContext, user => user.name); return

Nimi: {name}

; }

Valtio

Valtio on laiahaardelisem olekuhalduse teek, mis kasutab proksisid tõhusate olekuuuenduste ja valikuliste uuesti renderdamiste jaoks. See pakub olekuhaldusele teistsugust lähenemist, kuid sellega on võimalik saavutada sarnaseid jõudluseeliseid nagu Context Selectori mustriga.

Context Selectori Mustri eelised

Millal kasutada Context Selectori Mustrit

Context Selectori muster on eriti kasulik järgmistes stsenaariumides:

Alternatiivid Context Selectori Mustrile

Kuigi Context Selectori muster on võimas tööriist, ei ole see ainus lahendus uuesti renderdamiste optimeerimiseks Reactis. Siin on mõned alternatiivsed lähenemised:

Kaalutlused globaalsete rakenduste jaoks

Globaalsele sihtrühmale rakenduste arendamisel arvestage Context Selectori mustri rakendamisel järgmiste teguritega:

Kokkuvõte

React Context Selectori muster on väärtuslik tehnika uuesti renderdamiste optimeerimiseks ja jõudluse parandamiseks Reacti rakendustes. Lubades komponentidel tellida ainult need konkreetsed Contexti osad, mida nad vajavad, saate oluliselt vähendada ebavajalikke uuesti renderdamisi ja luua reageerivama ja tõhusama kasutajaliidese. Maksimaalse optimeerimise saavutamiseks ärge unustage oma selektoreid ja provideri väärtusi memoiseerida. Kaaluge teekide nagu use-context-selector kasutamist rakendamise lihtsustamiseks. Mida keerukamaid rakendusi te ehitate, seda olulisemaks muutub selliste tehnikate nagu Context Selectori mustri mõistmine ja kasutamine, et säilitada jõudlus ja pakkuda suurepärast kasutajakogemust, eriti globaalsele sihtrühmale.