Optimera Prestanda med useMemo-Hooken
Hooken useMemo gör det möjligt att memorera resultatet av en funktion, vilket optimerar resurskrävande beräkningar genom att cacha resultatet. Detta är fördelaktigt när vi har frekventa och resursintensiva beräkningar som ger samma resultat när datan inte förändras. Det eliminerar behovet av onödiga omberäkningar och leder till förbättrad prestanda.
Syntax:
En ny variabel, till exempel cachedValue, deklareras och tilldelas hooken useMemo. Inuti parenteserna för hooken anges en funktion (t.ex. calculateValue), som kommer att köras för att beräkna det memorerade värdet. Denna funktion kan vara vilken giltig JavaScript-funktion som helst. Dessutom inkluderas ett andra argument—en array kallad dependencies—som består av de värden som det memorerade värdet är beroende av.
const cachedValue = useMemo(calculateValue, dependencies)
När någon av beroendena som anges i arrayen dependencies ändras, kommer det memorerade värdet att beräknas om. Om beroendena däremot förblir oförändrade mellan renderingar, returnerar React det tidigare beräknade värdet utan omberäkning.
Note
Denna optimering bidrar till förbättrad prestanda genom att undvika onödiga beräkningar och resulterar i en mer effektiv användarupplevelse.
Exempel 1
Skapa komponenten ShoppingCart, som lagrar information om antalet produkter användaren väljer. Dessutom hanterar den logiken för att beräkna den totala summan, vilket visar det belopp användaren ska betala. Huvudmålet är att memorisera den totala summan och endast beräkna om den när användaren ändrar products-propen som skickas till denna komponent.
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>
);
};
Beräkningen av totalPrice utförs inom useMemo-hooken, vilket förhindrar onödig omberäkning vid varje omrendering av komponenten.
Rad-för-rad-förklaring:
- Rad 1: Vi importerar
useMemo-hooken från React-biblioteket för att använda dess funktionalitet; - Rad 3: Komponentet
ShoppingCartdefinieras med konventionell funktionssyntax; - Rad 4-10: Variabeln
totalPriceskapas, ansvarig för det totala priset användaren ska betala.useMemo-hooken används för att undvika beräkningar vid varje rendering;- Rad 5-9: Inuti pilfunktionen som skickas till
useMemoimplementeras logiken för att beräkna den totalasum. Varje objekt iproducts-arrayen itereras, priset multipliceras medquantityoch adderas till variabelnsum; - Rad 10: Beroende-arrayen
[products]skickas tilluseMemo-hooken. Detta indikerar att det memorerade värdet ska beräknas om omproducts-arrayen ändras.
- Rad 5-9: Inuti pilfunktionen som skickas till
- Rad 12-31: Komponentens markup renderas.
- Rad 16:
map-metoden används för att rendera varje produkt iproducts-arrayen och skapa motsvarande JSX-element;
- Rad 16:
- Rad 17: Attributet
keyanges för att säkerställa effektiv rendering av arrayens objekt och hjälpa React att identifiera varje objekt unikt; - Rad 28: Värdet av variabeln
totalPricerenderas i JSX och visar det beräknade totalpriset.
Full app code:
Obs
Det är tillrådligt att inte blanda
useEffectochuseMemo-hookarna för att säkerställa tydlighet och undvika förvirring. Den viktigaste skillnaden ligger i deras respektive syften:useEffectanvänds för att hantera sid-effekter och komponentlivscykel, medanuseMemomemorerar kostsamma beräkningar för att förbättra prestandan.
1. Vad är huvudsyftet med useMemo-hooken i React?
2. När beräknar hooken useMemo om sitt memorerade värde?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
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
Optimera Prestanda med useMemo-Hooken
Svep för att visa menyn
Hooken useMemo gör det möjligt att memorera resultatet av en funktion, vilket optimerar resurskrävande beräkningar genom att cacha resultatet. Detta är fördelaktigt när vi har frekventa och resursintensiva beräkningar som ger samma resultat när datan inte förändras. Det eliminerar behovet av onödiga omberäkningar och leder till förbättrad prestanda.
Syntax:
En ny variabel, till exempel cachedValue, deklareras och tilldelas hooken useMemo. Inuti parenteserna för hooken anges en funktion (t.ex. calculateValue), som kommer att köras för att beräkna det memorerade värdet. Denna funktion kan vara vilken giltig JavaScript-funktion som helst. Dessutom inkluderas ett andra argument—en array kallad dependencies—som består av de värden som det memorerade värdet är beroende av.
const cachedValue = useMemo(calculateValue, dependencies)
När någon av beroendena som anges i arrayen dependencies ändras, kommer det memorerade värdet att beräknas om. Om beroendena däremot förblir oförändrade mellan renderingar, returnerar React det tidigare beräknade värdet utan omberäkning.
Note
Denna optimering bidrar till förbättrad prestanda genom att undvika onödiga beräkningar och resulterar i en mer effektiv användarupplevelse.
Exempel 1
Skapa komponenten ShoppingCart, som lagrar information om antalet produkter användaren väljer. Dessutom hanterar den logiken för att beräkna den totala summan, vilket visar det belopp användaren ska betala. Huvudmålet är att memorisera den totala summan och endast beräkna om den när användaren ändrar products-propen som skickas till denna komponent.
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>
);
};
Beräkningen av totalPrice utförs inom useMemo-hooken, vilket förhindrar onödig omberäkning vid varje omrendering av komponenten.
Rad-för-rad-förklaring:
- Rad 1: Vi importerar
useMemo-hooken från React-biblioteket för att använda dess funktionalitet; - Rad 3: Komponentet
ShoppingCartdefinieras med konventionell funktionssyntax; - Rad 4-10: Variabeln
totalPriceskapas, ansvarig för det totala priset användaren ska betala.useMemo-hooken används för att undvika beräkningar vid varje rendering;- Rad 5-9: Inuti pilfunktionen som skickas till
useMemoimplementeras logiken för att beräkna den totalasum. Varje objekt iproducts-arrayen itereras, priset multipliceras medquantityoch adderas till variabelnsum; - Rad 10: Beroende-arrayen
[products]skickas tilluseMemo-hooken. Detta indikerar att det memorerade värdet ska beräknas om omproducts-arrayen ändras.
- Rad 5-9: Inuti pilfunktionen som skickas till
- Rad 12-31: Komponentens markup renderas.
- Rad 16:
map-metoden används för att rendera varje produkt iproducts-arrayen och skapa motsvarande JSX-element;
- Rad 16:
- Rad 17: Attributet
keyanges för att säkerställa effektiv rendering av arrayens objekt och hjälpa React att identifiera varje objekt unikt; - Rad 28: Värdet av variabeln
totalPricerenderas i JSX och visar det beräknade totalpriset.
Full app code:
Obs
Det är tillrådligt att inte blanda
useEffectochuseMemo-hookarna för att säkerställa tydlighet och undvika förvirring. Den viktigaste skillnaden ligger i deras respektive syften:useEffectanvänds för att hantera sid-effekter och komponentlivscykel, medanuseMemomemorerar kostsamma beräkningar för att förbättra prestandan.
1. Vad är huvudsyftet med useMemo-hooken i React?
2. När beräknar hooken useMemo om sitt memorerade värde?
Tack för dina kommentarer!