Кажется, что всё просто: список, onClick — готово. Но при сотнях элементов каждый ререндер создаёт новые функции в JSX.
React считает их изменёнными и перерисовывает даже те строки, что не менялись.
На демо — незаметно. На проде — больно.
Каждый ререндер создаёт новые колбэки → React считает пропы изменёнными → перерисовывает.
useCallback стабилизирует ссылку, и компонент больше не «дёргается» без причины.
— Если список огромный — рендерьте только видимую часть (react-window, react-virtualized).
— Если элемент сложный — выносите его в memo-компонент с передачей колбэка через пропсы.
#hotfix #react
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🥰2🔥1
Казалось бы, простой условный рендеринг. Но вот вам сюрприз.
Когда
items
пустой массив, items.length
равен 0
. В JavaScript 0
— это falsy значение, поэтому выражение 0 && <ul>
вернет 0
.React рендерит числа, поэтому на экране появится цифра
0
!function ProductList({ items }) {
return (
<div>
<h2>Товары</h2>
{items.length > 0 && <ul>
{items.map(item => <li key={item.id}>{item.name}</li>)}
</ul>}
</div>
);
}
Или еще лучше:
{!!items.length && <ul>...</ul>}
Или тернарный оператор:
{items.length ? <ul>...</ul> : null}
Оператор && возвращает первое falsy значение или последнее truthy:
0 && <Component /> → вернет 0 (React рендерит!)
false && <Component /> → вернет false (React не рендерит)
true && <Component /> → вернет <Component />
React не рендерит: false, null, undefined, true
React рендерит: числа (0, 1, -1), строки, компоненты
#hotfix #react
Please open Telegram to view this post
VIEW IN TELEGRAM