Suomi

Kattava opas React-sovellusten suorituskyvyn optimointiin useMemo-, useCallback- ja React.memo-hookien avulla. Opi estämään turhat uudelleenrenderöinnit ja parantamaan käyttäjäkokemusta.

React-suorituskyvyn optimointi: useMemo-, useCallback- ja React.memo-hookien hallinta

React, suosittu JavaScript-kirjasto käyttöliittymien rakentamiseen, on tunnettu komponenttipohjaisesta arkkitehtuuristaan ja deklaratiivisesta tyylistään. Sovellusten monimutkaistuessa suorituskyvystä voi kuitenkin tulla huolenaihe. Komponenttien tarpeettomat uudelleenrenderöinnit voivat johtaa hitaaseen suorituskykyyn ja huonoon käyttäjäkokemukseen. Onneksi React tarjoaa useita työkaluja suorituskyvyn optimointiin, mukaan lukien useMemo, useCallback ja React.memo. Tämä opas syventyy näihin tekniikoihin, tarjoten käytännön esimerkkejä ja toimivia oivalluksia, jotka auttavat sinua rakentamaan korkean suorituskyvyn React-sovelluksia.

Reactin uudelleenrenderöintien ymmärtäminen

Ennen kuin syvennymme optimointitekniikoihin, on tärkeää ymmärtää, miksi uudelleenrenderöintejä tapahtuu Reactissa. Kun komponentin tila tai propsit muuttuvat, React käynnistää kyseisen komponentin ja mahdollisesti sen lapsikomponenttien uudelleenrenderöinnin. React käyttää virtuaalista DOMia päivittääkseen tehokkaasti todellisen DOMin, mutta liialliset uudelleenrenderöinnit voivat silti vaikuttaa suorituskykyyn, erityisesti monimutkaisissa sovelluksissa. Kuvittele maailmanlaajuinen verkkokauppa-alusta, jossa tuotteiden hinnat päivittyvät usein. Ilman optimointia pienikin hinnanmuutos saattaa käynnistää uudelleenrenderöintejä koko tuotelistauksessa, mikä vaikuttaa käyttäjän selauskokemukseen.

Miksi komponentit uudelleenrenderöityvät

Suorituskyvyn optimoinnin tavoitteena on estää tarpeettomat uudelleenrenderöinnit ja varmistaa, että komponentit päivittyvät vain, kun niiden data on todella muuttunut. Harkitse tilannetta, jossa on reaaliaikainen datan visualisointi pörssianalyysia varten. Jos kaaviokomponentit uudelleenrenderöityvät tarpeettomasti jokaisen pienen datapäivityksen myötä, sovelluksesta tulee reagoimaton. Uudelleenrenderöintien optimointi varmistaa sujuvan ja reagoivan käyttäjäkokemuksen.

Esittelyssä useMemo: Kalliiden laskutoimitusten memoisaatio

useMemo on React-hook, joka memoizoi laskutoimituksen tuloksen. Memoisaatio on optimointitekniikka, joka tallentaa kalliiden funktiokutsujen tulokset ja käyttää niitä uudelleen, kun samat syötteet esiintyvät jälleen. Tämä estää funktion tarpeettoman uudelleenajon.

Milloin käyttää useMemosia

Miten useMemo toimii

useMemo ottaa kaksi argumenttia:

  1. Funktio, joka suorittaa laskutoimituksen.
  2. Riippuvuuksien taulukko.

Funktio suoritetaan vain, kun jokin taulukon riippuvuuksista muuttuu. Muussa tapauksessa useMemo palauttaa aiemmin memoizoidun arvon.

Esimerkki: Fibonaccin sarjan laskeminen

Fibonaccin sarja on klassinen esimerkki laskennallisesti raskaasta toimenpiteestä. Luodaan komponentti, joka laskee n:nnen Fibonacci-luvun käyttäen useMemo-hookia.


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

function Fibonacci({ n }) {
  const fibonacciNumber = useMemo(() => {
    console.log('Calculating Fibonacci...'); // Osoittaa, milloin laskenta suoritetaan
    function calculateFibonacci(num) {
      if (num <= 1) {
        return num;
      }
      return calculateFibonacci(num - 1) + calculateFibonacci(num - 2);
    }
    return calculateFibonacci(n);
  }, [n]);

  return 

Fibonacci({n}) = {fibonacciNumber}

; } function App() { const [number, setNumber] = useState(5); return (
setNumber(parseInt(e.target.value))} />
); } export default App;

Tässä esimerkissä calculateFibonacci-funktio suoritetaan vain, kun n-propsin arvo muuttuu. Ilman useMemo-hookia funktio suoritettaisiin jokaisella Fibonacci-komponentin uudelleenrenderöinnillä, vaikka n pysyisi samana. Kuvittele tämän laskennan tapahtuvan globaalilla rahoituskojelautalla - jokainen markkinoiden heilahdus aiheuttaisi täyden uudelleenlaskennan, mikä johtaisi merkittävään viiveeseen. useMemo estää tämän.

Esittelyssä useCallback: Funktioiden memoisaatio

useCallback on toinen React-hook, joka memoizoi funktioita. Se estää uuden funktioinstanssin luomisen jokaisella renderöinnillä, mikä voi olla erityisen hyödyllistä välitettäessä takaisinkutsufunktioita (callback) propseina lapsikomponenteille.

Milloin käyttää useCallbackia

Miten useCallback toimii

useCallback ottaa kaksi argumenttia:

  1. Memoizoitava funktio.
  2. Riippuvuuksien taulukko.

Funktio luodaan uudelleen vain, kun jokin taulukon riippuvuuksista muuttuu. Muussa tapauksessa useCallback palauttaa saman funktioinstanssin.

Esimerkki: Painikkeen napsautuksen käsittely

Luodaan komponentti, jossa on painike, joka käynnistää takaisinkutsufunktion. Käytämme useCallback-hookia takaisinkutsufunktion memoizointiin.


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

function Button({ onClick, children }) {
  console.log('Button re-rendered'); // Osoittaa, milloin painike uudelleenrenderöityy
  return ;
}

const MemoizedButton = React.memo(Button);

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

  const handleClick = useCallback(() => {
    console.log('Button clicked');
    setCount((prevCount) => prevCount + 1);
  }, []); // Tyhjä riippuvuustaulukko tarkoittaa, että funktio luodaan vain kerran

  return (
    

Count: {count}

Increment
); } export default App;

Tässä esimerkissä handleClick-funktio luodaan vain kerran, koska riippuvuustaulukko on tyhjä. Kun App-komponentti uudelleenrenderöityy count-tilan muutoksen vuoksi, handleClick-funktio pysyy samana. MemoizedButton-komponentti, joka on kääritty React.memo-funktiolla, uudelleenrenderöityy vain, jos sen propsit muuttuvat. Koska onClick-props (handleClick) pysyy samana, Button-komponentti ei uudelleenrenderöidy tarpeettomasti. Kuvittele interaktiivinen karttasovellus. Joka kerta kun käyttäjä on vuorovaikutuksessa, se voi vaikuttaa kymmeniin painikekomponentteihin. Ilman useCallback-hookia nämä painikkeet uudelleenrenderöityisivät tarpeettomasti, mikä loisi viiveisen kokemuksen. useCallback-hookin käyttö varmistaa sujuvamman vuorovaikutuksen.

Esittelyssä React.memo: Komponenttien memoisaatio

React.memo on korkeamman asteen komponentti (HOC), joka memoizoi funktionaalisen komponentin. Se estää komponenttia uudelleenrenderöitymästä, jos sen propsit eivät ole muuttuneet. Tämä on samankaltainen kuin PureComponent luokkakomponenteille.

Milloin käyttää React.memoa

Miten React.memo toimii

React.memo käärii funktionaalisen komponentin ja vertailee pinnallisesti edellisiä ja seuraavia propseja. Jos propsit ovat samat, komponentti ei uudelleenrenderöidy.

Esimerkki: Käyttäjäprofiilin näyttäminen

Luodaan komponentti, joka näyttää käyttäjäprofiilin. Käytämme React.memo-funktiota estääksemme tarpeettomat uudelleenrenderöinnit, jos käyttäjän tiedot eivät ole muuttuneet.


import React from 'react';

function UserProfile({ user }) {
  console.log('UserProfile re-rendered'); // Osoittaa, milloin komponentti uudelleenrenderöityy
  return (
    

Name: {user.name}

Email: {user.email}

); } const MemoizedUserProfile = React.memo(UserProfile, (prevProps, nextProps) => { // Mukautettu vertailufunktio (valinnainen) return prevProps.user.id === nextProps.user.id; // Uudelleenrenderöi vain, jos käyttäjän ID muuttuu }); function App() { const [user, setUser] = React.useState({ id: 1, name: 'John Doe', email: 'john.doe@example.com', }); const updateUser = () => { setUser({ ...user, name: 'Jane Doe' }); // Nimen muuttaminen }; return (
); } export default App;

Tässä esimerkissä MemoizedUserProfile-komponentti uudelleenrenderöityy vain, jos user.id-propsin arvo muuttuu. Vaikka muut user-olion ominaisuudet (esim. nimi tai sähköposti) muuttuisivat, komponentti ei uudelleenrenderöidy, ellei ID ole erilainen. Tämä mukautettu vertailufunktio `React.memo`:n sisällä mahdollistaa hienojakoisen hallinnan siitä, milloin komponentti uudelleenrenderöidään. Harkitse sosiaalisen median alustaa, jossa käyttäjäprofiilit päivittyvät jatkuvasti. Ilman `React.memo`-funktiota käyttäjän tilan tai profiilikuvan muuttaminen aiheuttaisi profiilikomponentin täydellisen uudelleenrenderöinnin, vaikka käyttäjän ydintiedot pysyisivät samoina. `React.memo` mahdollistaa kohdennetut päivitykset ja parantaa merkittävästi suorituskykyä.

useMemo-, useCallback- ja React.memo-hookien yhdistäminen

Nämä kolme tekniikkaa ovat tehokkaimpia, kun niitä käytetään yhdessä. useMemo memoizoi kalliit laskutoimitukset, useCallback memoizoi funktiot ja React.memo memoizoi komponentit. Yhdistämällä nämä tekniikat voit vähentää merkittävästi tarpeettomien uudelleenrenderöintien määrää React-sovelluksessasi.

Esimerkki: Monimutkainen komponentti

Luodaan monimutkaisempi komponentti, joka havainnollistaa, miten näitä tekniikoita yhdistetään.


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

function ListItem({ item, onUpdate, onDelete }) {
  console.log(`ListItem ${item.id} re-rendered`); // Osoittaa, milloin komponentti uudelleenrenderöityy
  return (
    
  • {item.text}
  • ); } const MemoizedListItem = React.memo(ListItem); function List({ items, onUpdate, onDelete }) { console.log('List re-rendered'); // Osoittaa, milloin komponentti uudelleenrenderöityy return (
      {items.map((item) => ( ))}
    ); } const MemoizedList = React.memo(List); function App() { const [items, setItems] = useState([ { id: 1, text: 'Item 1' }, { id: 2, text: 'Item 2' }, { id: 3, text: 'Item 3' }, ]); const handleUpdate = useCallback((id) => { setItems((prevItems) => prevItems.map((item) => item.id === id ? { ...item, text: `Updated ${item.text}` } : item ) ); }, []); const handleDelete = useCallback((id) => { setItems((prevItems) => prevItems.filter((item) => item.id !== id)); }, []); const memoizedItems = useMemo(() => items, [items]); return (
    ); } export default App;

    Tässä esimerkissä:

    Tämä tekniikoiden yhdistelmä varmistaa, että komponentit uudelleenrenderöityvät vain tarvittaessa, mikä johtaa merkittäviin suorituskykyparannuksiin. Kuvittele laajamittaista projektinhallintatyökalua, jossa tehtävälistoja päivitetään, poistetaan ja järjestellään jatkuvasti uudelleen. Ilman näitä optimointeja pienikin muutos tehtävälistaan käynnistäisi uudelleenrenderöintien ketjureaktion, mikä tekisi sovelluksesta hitaan ja reagoimattoman. Käyttämällä strategisesti useMemo-, useCallback- ja React.memo-työkaluja sovellus voi pysyä suorituskykyisenä myös monimutkaisen datan ja tiheiden päivitysten kanssa.

    Muita optimointitekniikoita

    Vaikka useMemo, useCallback ja React.memo ovat tehokkaita työkaluja, ne eivät ole ainoita vaihtoehtoja React-suorituskyvyn optimointiin. Tässä on muutamia muita tekniikoita harkittavaksi:

    Globaalit näkökohdat optimoinnissa

    Kun optimoidaan React-sovelluksia globaalille yleisölle, on tärkeää ottaa huomioon tekijöitä, kuten verkon viive, laitteiden ominaisuudet ja lokalisointi. Tässä on muutamia vinkkejä:

    Yhteenveto

    React-sovellusten suorituskyvyn optimointi on ratkaisevan tärkeää sujuvan ja reagoivan käyttäjäkokemuksen tarjoamiseksi. Hallitsemalla tekniikoita, kuten useMemo, useCallback ja React.memo, ja ottamalla huomioon globaalit optimointistrategiat, voit rakentaa korkean suorituskyvyn React-sovelluksia, jotka skaalautuvat vastaamaan moninaisen käyttäjäkunnan tarpeita. Muista profiloida sovelluksesi tunnistaaksesi suorituskyvyn pullonkaulat ja soveltaa näitä optimointitekniikoita strategisesti. Älä optimoi ennenaikaisesti – keskity alueisiin, joilla voit saavuttaa merkittävimmän vaikutuksen.

    Tämä opas tarjoaa vankan perustan React-suorituskyvyn optimointien ymmärtämiseen ja toteuttamiseen. Kun jatkat React-sovellusten kehittämistä, muista asettaa suorituskyky etusijalle ja etsiä jatkuvasti uusia tapoja parantaa käyttäjäkokemusta.