Suomi

Tutustu edistyneisiin Reactin memoisaatio-tekniikoihin optimoidaksesi suorituskykyä globaaleissa sovelluksissa. Opi, milloin ja miten käyttää React.memoa, useCallbackia ja useMemonia tehokkaiden käyttöliittymien rakentamiseen.

React Memo: Syväsukellus optimointitekniikoihin globaaleille sovelluksille

React on tehokas JavaScript-kirjasto käyttöliittymien rakentamiseen, mutta sovellusten monimutkaistuessa suorituskyvyn optimointi muuttuu ratkaisevan tärkeäksi. Yksi olennainen työkalu Reactin optimointityökalupakissa on React.memo. Tämä blogikirjoitus tarjoaa kattavan oppaan React.memon ja siihen liittyvien tekniikoiden ymmärtämiseen ja tehokkaaseen käyttöön korkean suorituskyvyn React-sovellusten rakentamisessa globaalille yleisölle.

Mitä on React.memo?

React.memo on korkeamman asteen komponentti (HOC), joka memoizoi funktionaalisen komponentin. Yksinkertaisemmin sanottuna se estää komponenttia renderöitymästä uudelleen, jos sen propsit eivät ole muuttuneet. Oletuksena se tekee propseille pinnallisen vertailun (shallow comparison). Tämä voi parantaa suorituskykyä merkittävästi, erityisesti komponenteille, joiden renderöinti on laskennallisesti kallista tai jotka renderöityvät usein uudelleen, vaikka niiden propsit pysyisivät samoina.

Kuvittele komponentti, joka näyttää käyttäjän profiilin. Jos käyttäjän tiedot (esim. nimi, avatar) eivät ole muuttuneet, komponenttia ei tarvitse renderöidä uudelleen. React.memo antaa sinun ohittaa tämän tarpeettoman uudelleenrenderöinnin, säästäen arvokasta prosessointiaikaa.

Miksi käyttää React.memoa?

Tässä ovat React.memon keskeiset edut:

React.memon peruskäyttö

React.memon käyttäminen on suoraviivaista. Kääri vain funktionaalinen komponenttisi sillä:

import React from 'react';

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

Tässä esimerkissä MyComponent renderöidään uudelleen vain, jos data-propsi muuttuu. console.log-lauseke auttaa sinua varmistamaan, milloin komponentti todella renderöidään uudelleen.

Pinnallisen vertailun ymmärtäminen

Oletuksena React.memo suorittaa propseille pinnallisen vertailun. Tämä tarkoittaa, että se tarkistaa, ovatko propsien viittaukset muuttuneet, ei itse arvoja. Tämä on tärkeä ymmärtää käsiteltäessä objekteja ja taulukoita.

Tarkastellaan seuraavaa esimerkkiä:

import React, { useState } from 'react';

const MyComponent = (props) => {
 console.log('MyComponent renderöity');
 return (
 
{props.data.name}
); }; const MemoizedComponent = React.memo(MyComponent); const App = () => { const [user, setUser] = useState({ name: 'John', age: 30 }); const handleClick = () => { setUser({ ...user }); // Luodaan uusi objekti samoilla arvoilla }; return (
); }; export default App;

Tässä tapauksessa, vaikka user-objektin arvot (name ja age) pysyvät samoina, handleClick-funktio luo uuden objektiviittauksen joka kerta, kun sitä kutsutaan. Siksi React.memo näkee, että data-propsi on muuttunut (koska objektiviittaus on eri) ja renderöi MyComponentin uudelleen.

Mukautettu vertailufunktio

Objektien ja taulukoiden pinnallisen vertailun ongelman ratkaisemiseksi React.memo antaa sinun antaa mukautetun vertailufunktion toisena argumenttina. Tämä funktio saa kaksi argumenttia: prevProps ja nextProps. Sen tulisi palauttaa true, jos komponentin *ei* pitäisi renderöityä uudelleen (eli propsit ovat käytännössä samat) ja false, jos sen pitäisi renderöityä uudelleen.

Näin voit käyttää mukautettua vertailufunktiota edellisessä esimerkissä:

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

const MyComponent = (props) => {
 console.log('MyComponent renderöity');
 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;

Tässä päivitetyssä esimerkissä areEqual-funktio vertaa user-objektien name- ja age-ominaisuuksia. MemoizedComponent renderöidään nyt uudelleen vain, jos joko name tai age muuttuu.

Milloin käyttää React.memoa

React.memo on tehokkain seuraavissa tilanteissa:

On kuitenkin tärkeää huomata, että React.memo ei ole ihmelääke. Sen umpimähkäinen käyttö voi itse asiassa heikentää suorituskykyä, koska itse pinnallisella vertailulla on kustannuksensa. Siksi on ratkaisevan tärkeää profiloida sovelluksesi ja tunnistaa komponentit, jotka hyötyisivät eniten memoisaatiosta.

Vaihtoehtoja React.memolle

Vaikka React.memo on tehokas työkalu, se ei ole ainoa vaihtoehto React-komponenttien suorituskyvyn optimointiin. Tässä on joitain vaihtoehtoja ja täydentäviä tekniikoita:

1. PureComponent

Luokkakomponenteille PureComponent tarjoaa samanlaisen toiminnallisuuden kuin React.memo. Se suorittaa sekä propsien että tilan pinnallisen vertailun ja renderöi uudelleen vain, jos muutoksia on.

import React from 'react';

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

PureComponent on kätevä vaihtoehto shouldComponentUpdaten manuaaliselle toteuttamiselle, joka oli perinteinen tapa estää tarpeettomia uudelleenrenderöintejä luokkakomponenteissa.

2. shouldComponentUpdate

shouldComponentUpdate on elinkaarimetodi luokkakomponenteissa, jonka avulla voit määritellä mukautetun logiikan sen päättämiseksi, pitäisikö komponentin renderöityä uudelleen. Se tarjoaa eniten joustavuutta, mutta vaatii myös enemmän manuaalista työtä.

import React from 'react';

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

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

Vaikka shouldComponentUpdate on edelleen käytettävissä, PureComponent ja React.memo ovat yleensä suositeltavampia niiden yksinkertaisuuden ja helppokäyttöisyyden vuoksi.

3. useCallback

useCallback on React-hook, joka memoizoi funktion. Se palauttaa memoizoidun version funktiosta, joka muuttuu vain, jos jokin sen riippuvuuksista on muuttunut. Tämä on erityisen hyödyllistä, kun callback-funktioita välitetään propseina memoizoiduille komponenteille.

Tarkastellaan seuraavaa esimerkkiä:

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

const MyComponent = (props) => {
 console.log('MyComponent renderöity');
 return (
 
 );
};

const MemoizedComponent = memo(MyComponent);

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

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

 return (
 

Laskuri: {count}

); }; export default App;

Tässä esimerkissä useCallback varmistaa, että handleClick-funktio muuttuu vain, kun count-tila muuttuu. Ilman useCallbackia uusi funktio luotaisiin jokaisella App-komponentin renderöinnillä, mikä aiheuttaisi MemoizedComponentin tarpeettoman uudelleenrenderöinnin.

4. useMemo

useMemo on React-hook, joka memoizoi arvon. Se palauttaa memoizoidun arvon, joka muuttuu vain, jos jokin sen riippuvuuksista on muuttunut. Tämä on hyödyllistä kalliiden laskelmien välttämiseksi, joita ei tarvitse suorittaa uudelleen jokaisella renderöinnillä.

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

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

 const expensiveCalculation = (str) => {
 console.log('Lasketaan...');
 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)} />

Tulos: {memoizedResult}

); }; export default App;

Tässä esimerkissä useMemo varmistaa, että expensiveCalculation-funktio kutsutaan vain, kun input-tila muuttuu. Tämä estää laskelman suorittamisen uudelleen jokaisella renderöinnillä, mikä voi parantaa suorituskykyä merkittävästi.

Käytännön esimerkkejä globaaleille sovelluksille

Tarkastellaan joitain käytännön esimerkkejä siitä, miten React.memoa ja siihen liittyviä tekniikoita voidaan soveltaa globaaleissa sovelluksissa:

1. Kielenvalitsin

Kielenvalitsinkomponentti renderöi usein listan käytettävissä olevista kielistä. Lista saattaa olla suhteellisen staattinen, mikä tarkoittaa, ettei se muutu usein. React.memon käyttö voi estää kielenvalitsinta renderöitymästä tarpeettomasti, kun muut sovelluksen osat päivittyvät.

import React, { memo } from 'react';

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

    Tässä esimerkissä MemoizedLanguageItem renderöidään uudelleen vain, jos language- tai onSelect-propsi muuttuu. Tämä voi olla erityisen hyödyllistä, jos kielilista on pitkä tai jos onSelect-käsittelijä on monimutkainen.

    2. Valuuttamuunnin

    Valuuttamuunninkomponentti saattaa näyttää listan valuutoista ja niiden vaihtokursseista. Vaihtokurssit saattavat päivittyä säännöllisesti, mutta valuuttojen lista saattaa pysyä suhteellisen vakaana. React.memon käyttö voi estää valuuttalistan tarpeettoman uudelleenrenderöinnin, kun vaihtokurssit päivittyvät.

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

    Tässä esimerkissä MemoizedCurrencyItem renderöidään uudelleen vain, jos currency-, rate- tai onSelect-propsi muuttuu. Tämä voi parantaa suorituskykyä, jos valuuttalista on pitkä tai jos vaihtokurssien päivitykset ovat tiheitä.

    3. Käyttäjäprofiilin näyttö

    Käyttäjäprofiilin näyttäminen sisältää staattisen tiedon, kuten nimen, profiilikuvan ja mahdollisesti elämäkerran, esittämisen. `React.memon` käyttö varmistaa, että komponentti renderöidään uudelleen vain, kun käyttäjätiedot todella muuttuvat, ei jokaisen vanhempikomponentin päivityksen yhteydessä.

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

    {user.name}

    Profiili

    {user.bio}

    ); }; export default memo(UserProfile);

    Tämä on erityisen hyödyllistä, jos `UserProfile` on osa suurempaa, usein päivittyvää kojelautaa tai sovellusta, jossa käyttäjätiedot itsessään eivät muutu usein.

    Yleiset sudenkuopat ja miten välttää ne

    Vaikka React.memo on arvokas optimointityökalu, on tärkeää olla tietoinen yleisistä sudenkuopista ja niiden välttämisestä:

    Sovelluksen profilointi

    Paras tapa selvittää, parantaako React.memo todella suorituskykyä, on profiloida sovelluksesi. React tarjoaa useita työkaluja profilointiin, mukaan lukien React DevTools Profiler ja React.Profiler-API.

    React DevTools Profiler antaa sinun tallentaa sovelluksesi suorituskykyjälkiä ja tunnistaa komponentit, jotka renderöityvät usein uudelleen. React.Profiler-API antaa sinun mitata tiettyjen komponenttien renderöintiaikaa ohjelmallisesti.

    Profiloimalla sovelluksesi voit tunnistaa komponentit, jotka hyötyisivät eniten memoisaatiosta ja varmistaa, että React.memo todella parantaa suorituskykyä.

    Johtopäätös

    React.memo on tehokas työkalu React-komponenttien suorituskyvyn optimointiin. Estämällä tarpeettomia uudelleenrenderöintejä se voi parantaa sovellustesi nopeutta ja responsiivisuutta, mikä johtaa parempaan käyttäjäkokemukseen. On kuitenkin tärkeää käyttää React.memoa harkitusti ja profiloida sovelluksesi varmistaaksesi, että se todella parantaa suorituskykyä.

    Ymmärtämällä tässä blogikirjoituksessa käsitellyt käsitteet ja tekniikat voit tehokkaasti käyttää React.memoa ja siihen liittyviä tekniikoita rakentaaksesi korkean suorituskyvyn React-sovelluksia globaalille yleisölle, varmistaen, että sovelluksesi ovat nopeita ja responsiivisia käyttäjille ympäri maailmaa.

    Muista ottaa huomioon globaalit tekijät, kuten verkon viive ja laitteiden ominaisuudet, kun optimoit React-sovelluksiasi. Keskittymällä suorituskykyyn ja saavutettavuuteen voit luoda sovelluksia, jotka tarjoavat erinomaisen kokemuksen kaikille käyttäjille heidän sijainnistaan tai laitteestaan riippumatta.

    Lisälukemista ja resursseja

    React Memo: Syväsukellus optimointitekniikoihin globaaleille sovelluksille | MLOG