Suorituskyvyn Optimointi UseMemo-Hookin Avulla
useMemo-hookin avulla voidaan muistaa funktion tulos, mikä optimoi raskaat laskutoimitukset tallentamalla tuloksen välimuistiin. Tämä on hyödyllistä, kun suoritetaan usein toistuvia ja paljon resursseja vaativia laskelmia, jotka tuottavat saman tuloksen, jos data ei muutu. Näin vältetään tarpeettomat uudelleenlaskennat ja parannetaan suorituskykyä.
Syntaksi:
Määritellään uusi muuttuja, kuten cachedValue, ja asetetaan sille arvoksi useMemo-hook. Koukussa annetaan sulkujen sisällä funktio (esim. calculateValue), joka suoritetaan muistiin tallennetun arvon laskemiseksi. Tämä funktio voi olla mikä tahansa kelvollinen JavaScript-funktio. Lisäksi annetaan toinen argumentti—taulukko nimeltä dependencies—joka sisältää arvot, joista muistiin tallennettu arvo riippuu.
const cachedValue = useMemo(calculateValue, dependencies)
Kun jokin dependencies-taulukossa määritellyistä riippuvuuksista muuttuu, muistiin tallennettu arvo lasketaan uudelleen. Jos riippuvuudet pysyvät samoina renderöintien välillä, React palauttaa aiemmin lasketun arvon ilman uudelleenlaskentaa.
Huomio
Tämä optimointi parantaa suorituskykyä välttämällä tarpeettomat laskutoimitukset ja johtaa tehokkaampaan käyttökokemukseen.
Esimerkki 1
Luodaan ShoppingCart-komponentti, joka tallentaa tiedot käyttäjän valitsemien tuotteiden määrästä. Lisäksi komponentti huolehtii kokonaissumman laskemisesta, eli siitä summasta, jonka käyttäjän tulee maksaa. Tavoitteena on käyttää muistissa pidettävää (memoized) kokonaissummaa ja laskea se uudelleen vain silloin, kun tälle komponentille välitetty products-prop muuttuu.
import React, { useMemo } from "react";
const ShoppingCart = ({ products }) => {
const totalPrice = useMemo(() => {
let sum = 0;
for (const item of products) {
sum += item.price * item.quantity;
}
return sum;
}, [products]);
return (
<div>
<h2>Shopping Cart</h2>
<ul>
{products.map(({ id, name, price, quantity }) => (
<li key={id}>
<p>
<span>{name} -</span>
<span>
${price} x {quantity}
</span>
</p>
</li>
))}
</ul>
<h3>
Total Price: <span>${totalPrice}</span>
</h3>
</div>
);
};
totalPrice-arvon laskenta suoritetaan useMemo-hookin sisällä, mikä estää tarpeettomat uudelleenlaskennat komponentin jokaisella uudelleenrenderöinnillä.
Rivikohtainen selitys:
- Rivi 1: Tuodaan
useMemo-hook React-kirjastosta sen toiminnallisuuden hyödyntämiseksi; - Rivi 3:
ShoppingCart-komponentti määritellään tavanomaisella funktiosyntaksilla; - Rivit 4-10: Luodaan
totalPrice-muuttuja, joka vastaa käyttäjän maksettavasta kokonaissummasta.useMemo-hookia käytetään, jotta laskentaa ei suoriteta jokaisella renderöinnillä;- Rivit 5-9: Nuolifunktiossa, joka välitetään
useMemo:lle, toteutetaan logiikka kokonaissumman (sum) laskemiseksi. Jokainenproducts-taulukon alkio käydään läpi, ja hinta kerrotaanquantity-arvolla ja lisätäänsum-muuttujaan; - Rivi 10: Riippuvuuslista
[products]annetaanuseMemo-hookille. Tämä tarkoittaa, että muistissa pidettävä arvo lasketaan uudelleen vain, josproducts-taulukko muuttuu.
- Rivit 5-9: Nuolifunktiossa, joka välitetään
- Rivit 12-31: Komponentin merkkaus renderöidään.
- Rivi 16:
map-metodia käytetään jokaisen tuotteen renderöintiinproducts-taulukosta, jolloin jokaiselle tuotteelle luodaan oma JSX-elementti; - Rivi 17:
key-attribuutti asetetaan, jotta taulukon alkiot renderöidään tehokkaasti ja React tunnistaa jokaisen alkion yksilöllisesti; - Rivi 28:
totalPrice-muuttujan arvo renderöidään JSX:ään, jolloin laskettu kokonaishinta näytetään.
- Rivi 16:
Koko sovelluksen koodi:
Huomio
On suositeltavaa olla sekoittamatta
useEffect- jauseMemo-hookeja selkeyden ja väärinkäsitysten välttämiseksi. Keskeinen ero on niiden käyttötarkoituksessa:useEffecton tarkoitettu sivuvaikutusten ja komponentin elinkaaren hallintaan, kun taasuseMemomuistaa raskaat laskutoimitukset suorituskyvyn parantamiseksi.
1. Mikä on useMemo-hookin päätarkoitus Reactissa?
2. Milloin useMemo-hook laskee uudelleen muistissa olevan arvonsa?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Can you explain when I should use useMemo instead of useEffect?
What are some common mistakes to avoid when using useMemo?
Can you show another example of useMemo in a different context?
Awesome!
Completion rate improved to 2.17
Suorituskyvyn Optimointi UseMemo-Hookin Avulla
Pyyhkäise näyttääksesi valikon
useMemo-hookin avulla voidaan muistaa funktion tulos, mikä optimoi raskaat laskutoimitukset tallentamalla tuloksen välimuistiin. Tämä on hyödyllistä, kun suoritetaan usein toistuvia ja paljon resursseja vaativia laskelmia, jotka tuottavat saman tuloksen, jos data ei muutu. Näin vältetään tarpeettomat uudelleenlaskennat ja parannetaan suorituskykyä.
Syntaksi:
Määritellään uusi muuttuja, kuten cachedValue, ja asetetaan sille arvoksi useMemo-hook. Koukussa annetaan sulkujen sisällä funktio (esim. calculateValue), joka suoritetaan muistiin tallennetun arvon laskemiseksi. Tämä funktio voi olla mikä tahansa kelvollinen JavaScript-funktio. Lisäksi annetaan toinen argumentti—taulukko nimeltä dependencies—joka sisältää arvot, joista muistiin tallennettu arvo riippuu.
const cachedValue = useMemo(calculateValue, dependencies)
Kun jokin dependencies-taulukossa määritellyistä riippuvuuksista muuttuu, muistiin tallennettu arvo lasketaan uudelleen. Jos riippuvuudet pysyvät samoina renderöintien välillä, React palauttaa aiemmin lasketun arvon ilman uudelleenlaskentaa.
Huomio
Tämä optimointi parantaa suorituskykyä välttämällä tarpeettomat laskutoimitukset ja johtaa tehokkaampaan käyttökokemukseen.
Esimerkki 1
Luodaan ShoppingCart-komponentti, joka tallentaa tiedot käyttäjän valitsemien tuotteiden määrästä. Lisäksi komponentti huolehtii kokonaissumman laskemisesta, eli siitä summasta, jonka käyttäjän tulee maksaa. Tavoitteena on käyttää muistissa pidettävää (memoized) kokonaissummaa ja laskea se uudelleen vain silloin, kun tälle komponentille välitetty products-prop muuttuu.
import React, { useMemo } from "react";
const ShoppingCart = ({ products }) => {
const totalPrice = useMemo(() => {
let sum = 0;
for (const item of products) {
sum += item.price * item.quantity;
}
return sum;
}, [products]);
return (
<div>
<h2>Shopping Cart</h2>
<ul>
{products.map(({ id, name, price, quantity }) => (
<li key={id}>
<p>
<span>{name} -</span>
<span>
${price} x {quantity}
</span>
</p>
</li>
))}
</ul>
<h3>
Total Price: <span>${totalPrice}</span>
</h3>
</div>
);
};
totalPrice-arvon laskenta suoritetaan useMemo-hookin sisällä, mikä estää tarpeettomat uudelleenlaskennat komponentin jokaisella uudelleenrenderöinnillä.
Rivikohtainen selitys:
- Rivi 1: Tuodaan
useMemo-hook React-kirjastosta sen toiminnallisuuden hyödyntämiseksi; - Rivi 3:
ShoppingCart-komponentti määritellään tavanomaisella funktiosyntaksilla; - Rivit 4-10: Luodaan
totalPrice-muuttuja, joka vastaa käyttäjän maksettavasta kokonaissummasta.useMemo-hookia käytetään, jotta laskentaa ei suoriteta jokaisella renderöinnillä;- Rivit 5-9: Nuolifunktiossa, joka välitetään
useMemo:lle, toteutetaan logiikka kokonaissumman (sum) laskemiseksi. Jokainenproducts-taulukon alkio käydään läpi, ja hinta kerrotaanquantity-arvolla ja lisätäänsum-muuttujaan; - Rivi 10: Riippuvuuslista
[products]annetaanuseMemo-hookille. Tämä tarkoittaa, että muistissa pidettävä arvo lasketaan uudelleen vain, josproducts-taulukko muuttuu.
- Rivit 5-9: Nuolifunktiossa, joka välitetään
- Rivit 12-31: Komponentin merkkaus renderöidään.
- Rivi 16:
map-metodia käytetään jokaisen tuotteen renderöintiinproducts-taulukosta, jolloin jokaiselle tuotteelle luodaan oma JSX-elementti; - Rivi 17:
key-attribuutti asetetaan, jotta taulukon alkiot renderöidään tehokkaasti ja React tunnistaa jokaisen alkion yksilöllisesti; - Rivi 28:
totalPrice-muuttujan arvo renderöidään JSX:ään, jolloin laskettu kokonaishinta näytetään.
- Rivi 16:
Koko sovelluksen koodi:
Huomio
On suositeltavaa olla sekoittamatta
useEffect- jauseMemo-hookeja selkeyden ja väärinkäsitysten välttämiseksi. Keskeinen ero on niiden käyttötarkoituksessa:useEffecton tarkoitettu sivuvaikutusten ja komponentin elinkaaren hallintaan, kun taasuseMemomuistaa raskaat laskutoimitukset suorituskyvyn parantamiseksi.
1. Mikä on useMemo-hookin päätarkoitus Reactissa?
2. Milloin useMemo-hook laskee uudelleen muistissa olevan arvonsa?
Kiitos palautteestasi!