Оптимізація Продуктивності за Допомогою Хука useMemo
Хук useMemo
дозволяє мемоізувати результат функції, оптимізуючи витратні обчислення шляхом кешування результату. Це корисно, коли маємо часті та ресурсомісткі обчислення, які дають однаковий результат, якщо дані не змінюються. Це усуває необхідність у повторних обчисленнях, що призводить до підвищення продуктивності.
Синтаксис:
Оголошується нова змінна, наприклад cachedValue
, якій присвоюється значення хука useMemo
. У дужках хука передається функція (наприклад, calculateValue
), яка буде виконана для обчислення мемоізованого значення. Ця функція може бути будь-якою коректною JavaScript-функцією. Додатково передається другий аргумент — масив dependencies
, що містить значення, від яких залежить мемоізоване значення.
const cachedValue = useMemo(calculateValue, dependencies)
Коли будь-яка залежність, вказана у масиві dependencies
, змінюється, мемоізоване значення буде переобчислено. Якщо ж залежності залишаються незмінними між рендерами, React поверне раніше обчислене значення без повторного обчислення.
Note
Така оптимізація допомагає підвищити продуктивність, уникаючи зайвих обчислень, і забезпечує більш ефективний користувацький досвід.
Приклад 1
Створимо компонент ShoppingCart
, який зберігатиме інформацію про кількість товарів, обраних користувачем. Додатково він оброблятиме логіку обчислення загальної суми, що вказує на суму, яку користувач має сплатити. Основна мета — мемоізувати загальну суму та виконувати її повторний розрахунок лише тоді, коли користувач змінює проп products
, переданий цьому компоненту.
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
виконується всередині хука useMemo
, що запобігає непотрібним повторним обчисленням під час кожного повторного рендеру компонента.
Пояснення по рядках:
- Рядок 1: Імпортується хук
useMemo
з бібліотеки React для використання його функціоналу; - Рядок 3: Компонент
ShoppingCart
визначається за допомогою стандартного синтаксису функції; - Рядки 4-10: Створюється змінна
totalPrice
, що відповідає за загальну суму, яку має сплатити користувач. ХукuseMemo
застосовується, щоб уникнути повторних обчислень при кожному рендері;- Рядки 5-9: У переданій в
useMemo
стрілочній функції реалізовано логіку розрахунку загальної сумиsum
. Кожен елемент масивуproducts
перебирається, ціна множиться на значення властивостіquantity
і додається до змінноїsum
; - Рядок 10: У хук
useMemo
передається масив залежностей[products]
, що вказує на необхідність перерахунку лише при зміні масивуproducts
.
- Рядки 5-9: У переданій в
- Рядки 12-31: Відображається розмітка компонента.
- Рядок 16: Метод
map
використовується для візуалізації кожного елемента масивуproducts
, створюючи відповідний JSX-елемент;
- Рядок 16: Метод
- Рядок 17: Атрибут
key
задається для оптимізації рендерингу та унікальної ідентифікації кожного елемента; - Рядок 28: Значення змінної
totalPrice
відображається у JSX, показуючи обчислену загальну суму.
Повний код застосунку:
Примітка
Рекомендується не поєднувати хуки
useEffect
таuseMemo
для забезпечення зрозумілості та уникнення плутанини. Основна відмінність полягає у їхніх призначеннях:useEffect
використовується для керування побічними ефектами та життєвим циклом компонента, тоді якuseMemo
мемоізує ресурсоємні обчислення для підвищення продуктивності.
1. Яке основне призначення хука useMemo
у React?
2. Коли хук useMemo
обчислює своє мемоізоване значення повторно?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
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
Оптимізація Продуктивності за Допомогою Хука useMemo
Свайпніть щоб показати меню
Хук useMemo
дозволяє мемоізувати результат функції, оптимізуючи витратні обчислення шляхом кешування результату. Це корисно, коли маємо часті та ресурсомісткі обчислення, які дають однаковий результат, якщо дані не змінюються. Це усуває необхідність у повторних обчисленнях, що призводить до підвищення продуктивності.
Синтаксис:
Оголошується нова змінна, наприклад cachedValue
, якій присвоюється значення хука useMemo
. У дужках хука передається функція (наприклад, calculateValue
), яка буде виконана для обчислення мемоізованого значення. Ця функція може бути будь-якою коректною JavaScript-функцією. Додатково передається другий аргумент — масив dependencies
, що містить значення, від яких залежить мемоізоване значення.
const cachedValue = useMemo(calculateValue, dependencies)
Коли будь-яка залежність, вказана у масиві dependencies
, змінюється, мемоізоване значення буде переобчислено. Якщо ж залежності залишаються незмінними між рендерами, React поверне раніше обчислене значення без повторного обчислення.
Note
Така оптимізація допомагає підвищити продуктивність, уникаючи зайвих обчислень, і забезпечує більш ефективний користувацький досвід.
Приклад 1
Створимо компонент ShoppingCart
, який зберігатиме інформацію про кількість товарів, обраних користувачем. Додатково він оброблятиме логіку обчислення загальної суми, що вказує на суму, яку користувач має сплатити. Основна мета — мемоізувати загальну суму та виконувати її повторний розрахунок лише тоді, коли користувач змінює проп products
, переданий цьому компоненту.
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
виконується всередині хука useMemo
, що запобігає непотрібним повторним обчисленням під час кожного повторного рендеру компонента.
Пояснення по рядках:
- Рядок 1: Імпортується хук
useMemo
з бібліотеки React для використання його функціоналу; - Рядок 3: Компонент
ShoppingCart
визначається за допомогою стандартного синтаксису функції; - Рядки 4-10: Створюється змінна
totalPrice
, що відповідає за загальну суму, яку має сплатити користувач. ХукuseMemo
застосовується, щоб уникнути повторних обчислень при кожному рендері;- Рядки 5-9: У переданій в
useMemo
стрілочній функції реалізовано логіку розрахунку загальної сумиsum
. Кожен елемент масивуproducts
перебирається, ціна множиться на значення властивостіquantity
і додається до змінноїsum
; - Рядок 10: У хук
useMemo
передається масив залежностей[products]
, що вказує на необхідність перерахунку лише при зміні масивуproducts
.
- Рядки 5-9: У переданій в
- Рядки 12-31: Відображається розмітка компонента.
- Рядок 16: Метод
map
використовується для візуалізації кожного елемента масивуproducts
, створюючи відповідний JSX-елемент;
- Рядок 16: Метод
- Рядок 17: Атрибут
key
задається для оптимізації рендерингу та унікальної ідентифікації кожного елемента; - Рядок 28: Значення змінної
totalPrice
відображається у JSX, показуючи обчислену загальну суму.
Повний код застосунку:
Примітка
Рекомендується не поєднувати хуки
useEffect
таuseMemo
для забезпечення зрозумілості та уникнення плутанини. Основна відмінність полягає у їхніх призначеннях:useEffect
використовується для керування побічними ефектами та життєвим циклом компонента, тоді якuseMemo
мемоізує ресурсоємні обчислення для підвищення продуктивності.
1. Яке основне призначення хука useMemo
у React?
2. Коли хук useMemo
обчислює своє мемоізоване значення повторно?
Дякуємо за ваш відгук!