Режим
<StrictMode>
позволяет находить распространенные ошибки в компонентах на ранних стадиях разработки.Используйте
StrictMode
для включения дополнительных поведений разработки и предупреждений для внутреннего дерева компонентов.Строгий режим включает следующие модели поведения, доступные только для разработчиков:
@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15⚡3🤩1
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20⚡3❤🔥1
Преждевременная оптимизация — корень всех зол. ©
Перед тем, как рассуждать о производительности, настоятельно рекомендуется прочитать Optimization.guide.
Для начала стоит вспомнить, что виртуальный DOM — это уже оптимизация, которая позволяет React из коробки работать достаточно быстро, чтобы вы могли вообще не задумываться о производительности долгое время.
В общих чертах, React работает так:
— Монтирование вызывает рендеринг приложения.
— Получившийся DOM вставляется в реальный DOM целиком, так как там еще ничего нет. Виртуальный DOM сохраняется внутри React для последующего обновления.
— Изменение состояния приводит к вычислению нового виртуального DOM.
— Вычисляется разница между старым виртуальным DOM и новым.
— Разница применяется к реальному DOM.
Когда происходит изменение в состоянии компонента, запускается механизм «согласование» (reconciliation), который вычисляет разницу между прошлым состоянием и новым. С алгоритмической точки зрения происходит поиск отличий в двух деревьях. В общем случае алгоритм, выполняющий это вычисление, работает со сложностью O(n³).
Для решения этой проблемы React настоятельно просит для всех элементов списков использовать атрибут
key
, который не меняется для конкретного элемента списка. Подобное требование позволяет оптимизировать работу алгоритма, уменьшив сложность до О(n).Первая засада ожидает при неправильной работе со свойствами по умолчанию, пример кода на изображении.
Вроде безобидный код, но вызов
[]
каждый раз генерирует новый объект (при условии что options
равен false
). Проверяется это легко: [] === []
будет ложным. То есть данные не поменялись, но <Cell>
будет отрисован заново.Вывод: используйте встроенный механизм для свойств по умолчанию.
@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤2🔥2⚡1👎1
Asset Loading позволит интегрировать загрузку различных ресурсов (стилей, шрифтов, скриптов) с механизмом Suspense. Это даст возможность гибко управлять отображением интерфейса.
@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29❤🔥5❤2⚡2😱2
С другой стороны, задача обработки списков элементов настолько частая, что будет не лишним её обсудить отдельно.
{}
вложено выражение, внутри которого опять появляется JSX-код. Как правило, рекурсия на этом заканчивается. Если нужна более сложная обработка, то имеет смысл вынести генерацию коллекции в метод компонента и вызывать его внутри render
. Например, ниже выделена функция renderList()
, которая формирует список для отрисовки:class List extends React.Component {
renderList = (data) => {
return data.map(item => <li>{item.name}</li>);
}
render() {
const { data } = this.props;
return (
<ul>
{this.renderList(data)}
</ul>
);
}
}
key
Для повышения эффективности, React настоятельно рекомендует идентифицировать каждую генерируемую строку коллекции. Связано это с механизмом, который производит изменения в DOM.
Генерируя коллекцию элементов в JSX, нужно обязательно проставлять уникальный проп
key
, который не меняется при повторной генерации коллекции.primary key
из базы данных).class List extends React.Component {
render() {
const { data } = this.props;
return (
<ul>
{data.map((item) => <li key={item.id}>{item.name}</li>)}
</ul>
);
}
}
const items = [
{ name: 'first', id: 1 },
{ name: 'second', id: 2 }
];
const mountNode = document.getElementById('react-root');
const root = ReactDOM.createRoot(mountNode);
root.render(<List data={items} />);
@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤🔥3❤3🔥3👎2
Ну и про React само собой, рекомендую к прочтению)
@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8⚡2🔥2❤1
'use client'
позволяет отметить, какой код выполняется на клиенте.Добавьте
'use client'
в верхней части файла, чтобы отметить модуль и его транзитивные зависимости как клиентский код.'use client'
, импортируется из серверного компонента, совместимые бандлеры будут рассматривать импорт модуля как границу между кодом, выполняемым на сервере, и кодом, выполняемым на клиенте.RichTextEditor
, formatDate
и Button
также будут оцениваться на клиенте, независимо от того, содержат ли их модули директиву 'use client'
. Обратите внимание, что один модуль может оцениваться на сервере при импорте из серверного кода и на клиенте при импорте из клиентского кода.Некоторые нюансы
'use client'
должно находиться в самом начале файла, выше любого импорта или другого кода (комментарии допускаются). Они должны быть написаны с одинарными или двойными кавычками, но не с обратными знаками.'use client'
импортируется из другого клиентского модуля, директива не имеет силы.'use client'
, то любое использование этого компонента гарантированно является клиентским компонентом. Однако компонент может быть оценен на клиенте, даже если он не содержит директивы 'use client'
.Дополнение: компонент считается клиентским, если он определен в модуле с директивой
'use client'
или является транзитивной зависимостью модуля, содержащего директиву 'use client'
. В противном случае он является серверным компонентом.'use client'
, эти значения должны быть либо компонентами React, либо поддерживаемыми сериализуемыми значениями prop для передачи в клиентский компонент. При любом другом варианте использования будет возникать исключение.@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9⚡4❤4❤🔥2🥰1
Держите годный контент)
00:04:24 — Настройка
00:22:07 — Header
00:44:28 — Компонент раздела оглавления
01:26:00 — Раздел о преимуществах
01:41:30 — Раздел о сотрудничестве
02:30:35 — Раздел о ценах
02:51:30 — Раздел roadmap
03:05:20 — Footer
03:10:10 — Деплой
Enjoy)
@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24❤5🔥4
Вот так звучит реальный кейс, давайте подробнее.
onClick
событие) должен создаваться QR-код (превью для пользователя не нужно) по строке (рандомно генерирующийся набор символов) и отправляться на скачивание пользователю в виде png-картинки.Как же это можно реализовать?
import QRCode from "https://esm.sh/qrcode";
function download(dataurl, filename) {
const link = document.createElement("a");
link.href = dataurl;
link.download = filename;
link.click();
document.removeElement(link);
}
QRCode.toDataURL("I am a pony!", function (err, qrCodeImageDataUrl) {
console.log(qrCodeImageDataUrl);
download(qrCodeImageDataUrl, "qrcode.png");
});
@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
❤16👍8🔥4