React Reconciliation: скрытый механизм, управляющий компонентами
В моих предыдущих статьях (1, 2) я подробно рассматривал, как работает React.memo, а также делился более эффективными подходами к оптимизации производительности с помощью компоновки. Однако для глубокого понимания работы React необходимо разобраться в основном механизме, лежащем в основе всех этих оптимизаций – алгоритме согласования (reconciliation).
Согласование – это процесс, в результате которого React приводит DOM в соответствие с деревом компонентов. Именно этот механизм позволяет реализовать декларативный подход к программированию на React: вы формулируете свои намерения, а React самостоятельно определяет, как выполнить эти намерения наилучшим образом и с наименьшими затратами.
https://habr.com/ru/companies/timeweb/articles/901212/
👉 @frontend_1
В моих предыдущих статьях (1, 2) я подробно рассматривал, как работает React.memo, а также делился более эффективными подходами к оптимизации производительности с помощью компоновки. Однако для глубокого понимания работы React необходимо разобраться в основном механизме, лежащем в основе всех этих оптимизаций – алгоритме согласования (reconciliation).
Согласование – это процесс, в результате которого React приводит DOM в соответствие с деревом компонентов. Именно этот механизм позволяет реализовать декларативный подход к программированию на React: вы формулируете свои намерения, а React самостоятельно определяет, как выполнить эти намерения наилучшим образом и с наименьшими затратами.
https://habr.com/ru/companies/timeweb/articles/901212/
👉 @frontend_1
Совет по веб-доступности 💡
Лучший способ сделать ваши ссылки, состоящие только из иконок, удобными для экранных читалок.
👉 @frontend_1
Лучший способ сделать ваши ссылки, состоящие только из иконок, удобными для экранных читалок.
👉 @frontend_1
🫵 Хочешь стать Fullstack-разработчиком, но боишься, что слишком сложно?
Ты не один.
90% новичков теряются, потому что не понимают, с чего начать.
➡️ На вебинаре 10 июня в 18:00 от OTUS ты:
— разберёшься в основах фронтенда,
— получишь Skill-map, чтобы понять свои сильные стороны,
— сделаешь осознанный старт в IT.
❗️Не листай дальше — переходи на сайт, там уже готов план для старта: https://vk.cc/cMAZQk
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Ты не один.
90% новичков теряются, потому что не понимают, с чего начать.
➡️ На вебинаре 10 июня в 18:00 от OTUS ты:
— разберёшься в основах фронтенда,
— получишь Skill-map, чтобы понять свои сильные стороны,
— сделаешь осознанный старт в IT.
❗️Не листай дальше — переходи на сайт, там уже готов план для старта: https://vk.cc/cMAZQk
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
This media is not supported in your browser
VIEW IN TELEGRAM
Всплывающие скроллеры изображений с анимацией, управляемой прокруткой CSS 🤙
.
https://codepen.io/jh3y/pen/abPgrGR
👉 @frontend_1
.
pop {
view-timeline-name: --pop;
}
img {
animation: slide both;
animation-timeline: --pop;
animation-range: entry 100% cover 50%;
}
.skateboarder {
--x: 0;
--y: -45%;
}
@ keyframes slide {
to { translate: var(--x) var(--y); }
}
https://codepen.io/jh3y/pen/abPgrGR
👉 @frontend_1
Как избежать лишних перерисовок в React-приложениях с помощью
Часто при обновлении состояния в родительском компоненте все дочерние компоненты тоже ререндерятся, даже если их пропсы не изменились. Это снижает производительность и может привести к «тормозам» на крупных страницах.
1. Оборачиваем «тяжёлые» компоненты в
2. Меммоизируем функции-колбэки через
*
*
Когда это не работает?
Если вы передаёте в пропы объекты или массивы, создаваемые «на лету», их тоже нужно мемоизировать через
Для функций с зависимостями важно корректно указать массив зависимостей, иначе обновления могут «застрять».
Попробуйте применить эти приёмы в своём проекте и посмотрите в консоли, как уменьшится количество ререндеров.
👉 @frontend_1
React.memo
и хука useCallback
.Часто при обновлении состояния в родительском компоненте все дочерние компоненты тоже ререндерятся, даже если их пропсы не изменились. Это снижает производительность и может привести к «тормозам» на крупных страницах.
1. Оборачиваем «тяжёлые» компоненты в
React.memo
.2. Меммоизируем функции-колбэки через
useCallback
, чтобы их ссылки не менялись без нужды.
import React, { useState, useCallback, memo } from 'react';
const Child = memo(({ onClick, label }) => {
console.log('Child rendered');
return <button onClick={onClick}>{label}</button>;
});
function Parent() {
const [count, setCount] = useState(0);
// Функция останется той же, если зависимости не изменятся
const handleClick = useCallback(() => {
console.log('Button clicked');
}, []);
return (
<div>
<Child onClick={handleClick} label="Нажми меня" />
<button onClick={() => setCount(prev => prev + 1)}>
Счётчик: {count}
</button>
</div>
);
}
*
React.memo
сравнивает предыдущие и новые пропсы поверхностно и рендерит Child
только когда они реально отличаются.*
useCallback
гарантирует, что ссылка на handleClick
не меняется при каждом рендере Parent
, а значит Child
не получает «новый» проп и не перерисовывается.Когда это не работает?
Если вы передаёте в пропы объекты или массивы, создаваемые «на лету», их тоже нужно мемоизировать через
useMemo
.Для функций с зависимостями важно корректно указать массив зависимостей, иначе обновления могут «застрять».
Попробуйте применить эти приёмы в своём проекте и посмотрите в консоли, как уменьшится количество ререндеров.
👉 @frontend_1
Позволяет создавать плавные, контролируемые прокрутки с «привязкой» к определённым позициям.
.container {
scroll-snap-type: x mandatory;
}
.item {
scroll-snap-align: start;
}
Зачем это нужно:
👉 @frontend_1
Please open Telegram to view this post
VIEW IN TELEGRAM
Сегодня хочу поделиться с тобой одной тонкостью, которая помогает делать интерфейс более дружелюбным — скелетоны (skeleton loaders). Это те самые серые заглушки, которые показываются до загрузки данных. Пользователь видит, что «что-то происходит», и не чувствует, что приложение тормозит.
🦴 Как сделать скелетон быстро и без боли?
Я часто использую компонент из
А потом использовать так:
Без скелетонов пользователь может увидеть "прыгающий" интерфейс — сначала пустота, потом всё резко появилось. Это раздражает. Скелетоны создают ощущение плавности и контроля.
👉 @frontend_1
🦴 Как сделать скелетон быстро и без боли?
Я часто использую компонент из
@radix-ui/react-skeleton
или shadcn/ui
. Но можно собрать свой за 5 минут:
const Skeleton = ({ className }: { className?: string }) => (
<div className={`animate-pulse bg-muted rounded-md ${className}`} />
)
А потом использовать так:
{isClick Me Load More ? (
<Skeleton className="h-6 w-40" />
) : (
<span>{user.name}</span>
)}
Без скелетонов пользователь может увидеть "прыгающий" интерфейс — сначала пустота, потом всё резко появилось. Это раздражает. Скелетоны создают ощущение плавности и контроля.
👉 @frontend_1
🚀 Хотите стать мастером Vue? Присоединяйся к открытому вебинару!
Вы знаете JavaScript, но не понимаете, как работает Vue? Хотите научиться использовать его для создания динамичных приложений?
🔥8 июля в 20.00 мск. приглашаем на открытый урок “Как быстро освоить Vue, если уже знаешь JavaScript”, на котором разберем:
- создание компонентов с реактивностью и передача данных;
- работу с директивами (v-if, v-for, v-model);
- сборку мини-приложения с динамическими данными.
Вы научитесь использовать Vue для создания интерфейсов, разберетесь в компонентах и реактивности, а также получите основы для работы над реальными проектами. 🛠
👉 Регистрируйтесь по ссылке: https://vk.cc/cNbBVQ
Бесплатное занятие приурочено к старту курса “Vue.js разработчик”, на котором можно глубже погрузиться в особенности фреймворка, научиться работать с его инструментами и создавать реальные проекты.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Вы знаете JavaScript, но не понимаете, как работает Vue? Хотите научиться использовать его для создания динамичных приложений?
🔥8 июля в 20.00 мск. приглашаем на открытый урок “Как быстро освоить Vue, если уже знаешь JavaScript”, на котором разберем:
- создание компонентов с реактивностью и передача данных;
- работу с директивами (v-if, v-for, v-model);
- сборку мини-приложения с динамическими данными.
Вы научитесь использовать Vue для создания интерфейсов, разберетесь в компонентах и реактивности, а также получите основы для работы над реальными проектами. 🛠
👉 Регистрируйтесь по ссылке: https://vk.cc/cNbBVQ
Бесплатное занятие приурочено к старту курса “Vue.js разработчик”, на котором можно глубже погрузиться в особенности фреймворка, научиться работать с его инструментами и создавать реальные проекты.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576