Norsk

Utforsk avanserte React memoization-teknikker for å optimalisere ytelsen i globale applikasjoner. Lær når og hvordan du bruker React.memo, useCallback, useMemo og mer for å bygge effektive brukergrensesnitt.

React Memo: Et dybdedykk i optimaliseringsteknikker for globale applikasjoner

React er et kraftig JavaScript-bibliotek for å bygge brukergrensesnitt, men etter hvert som applikasjoner blir mer komplekse, blir ytelsesoptimalisering avgjørende. Et essensielt verktøy i Reacts optimaliseringsverktøykasse er React.memo. Dette blogginnlegget gir en omfattende guide til å forstå og effektivt bruke React.memo og relaterte teknikker for å bygge høyytelses React-applikasjoner for et globalt publikum.

Hva er React.memo?

React.memo er en høyere-ordens komponent (HOC) som memoiserer en funksjonell komponent. Enklere forklart forhindrer den en komponent fra å re-rendere hvis dens props ikke har endret seg. Som standard utfører den en overfladisk sammenligning av props. Dette kan forbedre ytelsen betydelig, spesielt for komponenter som er beregningsmessig kostbare å rendre eller som re-renderer ofte selv når deres props forblir de samme.

Tenk deg en komponent som viser en brukers profil. Hvis brukerens informasjon (f.eks. navn, avatar) ikke har endret seg, er det ingen grunn til å re-rendere komponenten. React.memo lar deg hoppe over denne unødvendige re-rendringen og sparer verdifull prosesseringstid.

Hvorfor bruke React.memo?

Her er de viktigste fordelene ved å bruke React.memo:

Grunnleggende bruk av React.memo

Å bruke React.memo er enkelt. Bare pakk inn den funksjonelle komponenten din med den:

import React from 'react';

const MyComponent = (props) => {
 console.log('MyComponent rendret');
 return (
 
{props.data}
); }; export default React.memo(MyComponent);

I dette eksempelet vil MyComponent kun re-rendere hvis data-propen endres. console.log-setningen vil hjelpe deg med å verifisere når komponenten faktisk re-renderer.

Forståelse av overfladisk sammenligning

Som standard utfører React.memo en overfladisk sammenligning av props. Dette betyr at den sjekker om referansene til props har endret seg, ikke selve verdiene. Dette er viktig å forstå når man jobber med objekter og arrays.

Vurder følgende eksempel:

import React, { useState } from 'react';

const MyComponent = (props) => {
 console.log('MyComponent rendret');
 return (
 
{props.data.name}
); }; const MemoizedComponent = React.memo(MyComponent); const App = () => { const [user, setUser] = useState({ name: 'John', age: 30 }); const handleClick = () => { setUser({ ...user }); // Oppretter et nytt objekt med de samme verdiene }; return (
); }; export default App;

I dette tilfellet, selv om verdiene til user-objektet (name og age) forblir de samme, oppretter handleClick-funksjonen en ny objektreferanse hver gang den kalles. Derfor vil React.memo se at data-propen har endret seg (fordi objektreferansen er annerledes) og vil re-rendere MyComponent.

Egendefinert sammenligningsfunksjon

For å håndtere problemet med overfladisk sammenligning med objekter og arrays, lar React.memo deg oppgi en egendefinert sammenligningsfunksjon som sitt andre argument. Denne funksjonen tar to argumenter: prevProps og nextProps. Den bør returnere true hvis komponenten *ikke* skal re-rendere (dvs. at props i praksis er de samme) og false hvis den skal re-rendere.

Her er hvordan du kan bruke en egendefinert sammenligningsfunksjon i det forrige eksempelet:

import React, { useState, memo } from 'react';

const MyComponent = (props) => {
 console.log('MyComponent rendret');
 return (
 
{props.data.name}
); }; const areEqual = (prevProps, nextProps) => { return prevProps.data.name === nextProps.data.name && prevProps.data.age === nextProps.data.age; }; const MemoizedComponent = memo(MyComponent, areEqual); const App = () => { const [user, setUser] = useState({ name: 'John', age: 30 }); const handleClick = () => { setUser({ ...user }); }; return (
); }; export default App;

I dette oppdaterte eksempelet sammenligner areEqual-funksjonen name- og age-egenskapene til user-objektene. MemoizedComponent vil nå kun re-rendere hvis enten name eller age endres.

Når bør man bruke React.memo

React.memo er mest effektiv i følgende scenarier:

Det er imidlertid viktig å merke seg at React.memo ikke er et universalmiddel. Å bruke det ukritisk kan faktisk skade ytelsen fordi den overfladiske sammenligningen i seg selv har en kostnad. Derfor er det avgjørende å profilere applikasjonen din og identifisere komponentene som vil ha størst nytte av memoisering.

Alternativer til React.memo

Selv om React.memo er et kraftig verktøy, er det ikke det eneste alternativet for å optimalisere ytelsen til React-komponenter. Her er noen alternativer og komplementære teknikker:

1. PureComponent

For klassekomponenter gir PureComponent lignende funksjonalitet som React.memo. Den utfører en overfladisk sammenligning av både props og state, og re-renderer kun hvis det er endringer.

import React from 'react';

class MyComponent extends React.PureComponent {
 render() {
 console.log('MyComponent rendret');
 return (
 
{this.props.data}
); } } export default MyComponent;

PureComponent er et praktisk alternativ til å manuelt implementere shouldComponentUpdate, som var den tradisjonelle måten å forhindre unødvendige re-rendringer i klassekomponenter.

2. shouldComponentUpdate

shouldComponentUpdate er en livssyklusmetode i klassekomponenter som lar deg definere egendefinert logikk for å bestemme om en komponent skal re-rendere. Den gir mest fleksibilitet, men krever også mer manuell innsats.

import React from 'react';

class MyComponent extends React.Component {
 shouldComponentUpdate(nextProps, nextState) {
 return nextProps.data !== this.props.data;
 }

 render() {
 console.log('MyComponent rendret');
 return (
 
{this.props.data}
); } } export default MyComponent;

Selv om shouldComponentUpdate fortsatt er tilgjengelig, foretrekkes generelt PureComponent og React.memo for deres enkelhet og brukervennlighet.

3. useCallback

useCallback er en React-hook som memoiserer en funksjon. Den returnerer en memorisert versjon av funksjonen som kun endres hvis en av dens avhengigheter har endret seg. Dette er spesielt nyttig for å sende callbacks som props til memoiserte komponenter.

Vurder følgende eksempel:

import React, { useState, useCallback, memo } from 'react';

const MyComponent = (props) => {
 console.log('MyComponent rendret');
 return (
 
 );
};

const MemoizedComponent = memo(MyComponent);

const App = () => {
 const [count, setCount] = useState(0);

 const handleClick = useCallback(() => {
 setCount(count + 1);
 }, [count]);

 return (
 

Antall: {count}

); }; export default App;

I dette eksempelet sikrer useCallback at handleClick-funksjonen kun endres når count-state endres. Uten useCallback ville en ny funksjon blitt opprettet ved hver rendering av App, noe som ville ført til at MemoizedComponent re-rendret unødvendig.

4. useMemo

useMemo er en React-hook som memoiserer en verdi. Den returnerer en memorisert verdi som kun endres hvis en av dens avhengigheter har endret seg. Dette er nyttig for å unngå kostbare beregninger som ikke trenger å kjøres på nytt ved hver rendering.

import React, { useState, useMemo } from 'react';

const App = () => {
 const [input, setInput] = useState('');

 const expensiveCalculation = (str) => {
 console.log('Beregner...');
 let result = 0;
 for (let i = 0; i < str.length * 1000000; i++) {
 result++;
 }
 return result;
 };

 const memoizedResult = useMemo(() => expensiveCalculation(input), [input]);

 return (
 
setInput(e.target.value)} />

Resultat: {memoizedResult}

); }; export default App;

I dette eksempelet sikrer useMemo at expensiveCalculation-funksjonen kun kalles når input-state endres. Dette forhindrer at beregningen kjøres på nytt ved hver rendering, noe som kan forbedre ytelsen betydelig.

Praktiske eksempler for globale applikasjoner

La oss se på noen praktiske eksempler på hvordan React.memo og relaterte teknikker kan brukes i globale applikasjoner:

1. Språkvelger

En språkvelgerkomponent renderer ofte en liste over tilgjengelige språk. Listen kan være relativt statisk, noe som betyr at den ikke endres ofte. Bruk av React.memo kan forhindre at språkvelgeren re-renderer unødvendig når andre deler av applikasjonen oppdateres.

import React, { memo } from 'react';

const LanguageItem = ({ language, onSelect }) => {
 console.log(`LanguageItem ${language} rendret`);
 return (
 
  • onSelect(language)}>{language}
  • ); }; const MemoizedLanguageItem = memo(LanguageItem); const LanguageSelector = ({ languages, onSelect }) => { return (
      {languages.map((language) => ( ))}
    ); }; export default LanguageSelector;

    I dette eksempelet vil MemoizedLanguageItem kun re-rendere hvis language- eller onSelect-propen endres. Dette kan være spesielt gunstig hvis språklisten er lang eller hvis onSelect-handleren er kompleks.

    2. Valutakalkulator

    En valutakalkulatorkomponent kan vise en liste over valutaer og deres vekslingskurser. Vekslingskursene kan oppdateres periodisk, men listen over valutaer kan forbli relativt stabil. Bruk av React.memo kan forhindre at valutalisten re-renderer unødvendig når vekslingskursene oppdateres.

    import React, { memo } from 'react';
    
    const CurrencyItem = ({ currency, rate, onSelect }) => {
     console.log(`CurrencyItem ${currency} rendret`);
     return (
     
  • onSelect(currency)}>{currency} - {rate}
  • ); }; const MemoizedCurrencyItem = memo(CurrencyItem); const CurrencyConverter = ({ currencies, onSelect }) => { return (
      {Object.entries(currencies).map(([currency, rate]) => ( ))}
    ); }; export default CurrencyConverter;

    I dette eksempelet vil MemoizedCurrencyItem kun re-rendere hvis currency-, rate- eller onSelect-propen endres. Dette kan forbedre ytelsen hvis valutalisten er lang eller hvis oppdateringene av vekslingskursene er hyppige.

    3. Visning av brukerprofil

    Visning av en brukerprofil innebærer å vise statisk informasjon som navn, profilbilde og potensielt en biografi. Bruk av `React.memo` sikrer at komponenten kun re-renderer når brukerdataene faktisk endres, ikke ved hver oppdatering av foreldrekomponenten.

    import React, { memo } from 'react';
    
    const UserProfile = ({ user }) => {
     console.log('UserProfile rendret');
     return (
     

    {user.name}

    Profil

    {user.bio}

    ); }; export default memo(UserProfile);

    Dette er spesielt nyttig hvis `UserProfile` er en del av et større, hyppig oppdatert dashbord eller en applikasjon der selve brukerdataene ikke endres ofte.

    Vanlige fallgruver og hvordan unngå dem

    Selv om React.memo er et verdifullt optimaliseringsverktøy, er det viktig å være klar over vanlige fallgruver og hvordan man unngår dem:

    Profilering av applikasjonen din

    Den beste måten å avgjøre om React.memo faktisk forbedrer ytelsen, er å profilere applikasjonen din. React tilbyr flere verktøy for profilering, inkludert React DevTools Profiler og React.Profiler-APIet.

    React DevTools Profiler lar deg ta opp ytelsessporinger av applikasjonen din og identifisere komponenter som re-renderer ofte. React.Profiler-APIet lar deg måle renderingstiden til spesifikke komponenter programmatisk.

    Ved å profilere applikasjonen din kan du identifisere komponentene som vil ha størst nytte av memoisering og sikre at React.memo faktisk forbedrer ytelsen.

    Konklusjon

    React.memo er et kraftig verktøy for å optimalisere ytelsen til React-komponenter. Ved å forhindre unødvendige re-rendringer kan det forbedre hastigheten og responsiviteten til applikasjonene dine, noe som fører til en bedre brukeropplevelse. Det er imidlertid viktig å bruke React.memo med omhu og å profilere applikasjonen din for å sikre at den faktisk forbedrer ytelsen.

    Ved å forstå konseptene og teknikkene som er diskutert i dette blogginnlegget, kan du effektivt bruke React.memo og relaterte teknikker for å bygge høyytelses React-applikasjoner for et globalt publikum, og sikre at applikasjonene dine er raske og responsive for brukere over hele verden.

    Husk å vurdere globale faktorer som nettverkslatens og enhetskapasiteter når du optimaliserer React-applikasjonene dine. Ved å fokusere på ytelse og tilgjengelighet kan du skape applikasjoner som gir en flott opplevelse for alle brukere, uavhengig av deres plassering eller enhet.

    Videre lesing og ressurser