Chakra UI предоставляет мощный набор компонентов для React, обеспечивая гибкость и удобство стилизации. При разработке сложных интерфейсов с большим количеством компонентов важно учитывать производительность приложений, чтобы избежать лишних перерисовок и замедления рендеринга.
shouldForwardProp и chakraКомпонент chakra позволяет оборачивать обычные
HTML-элементы или компоненты React, добавляя стили через props. Однако
при неаккуратном использовании props могут передаваться ненужные
атрибуты в DOM, что снижает производительность. Для предотвращения этого
применяется функция shouldForwardProp:
import { chakra, shouldForwardProp } from "@chakra-ui/react";
import { isPropValid } from "@emotion/is-prop-valid";
const Box = chakra("div", {
shouldForwardProp: (prop) => isPropValid(prop) && prop !== "myCustomProp",
});
Фильтрация props помогает уменьшить количество ненужных атрибутов в DOM и снижает нагрузку на рендерер.
memo и React.forwardRefДля компонентов, которые часто рендерятся с одинаковыми props,
рекомендуется использовать React.memo. Это предотвращает
повторный рендер при неизменных свойствах:
import { Box } from "@chakra-ui/react";
import React from "react";
const MemoizedBox = React.memo((props) => <Box {...props} />);
Если компонент использует ref, необходимо сочетать
React.forwardRef с React.memo для сохранения
производительности и правильной работы рефов:
const Button = React.memo(
React.forwardRef((props, ref) => <chakra.button ref={ref} {...props} />)
);
sx и styleConfigChakra UI поддерживает несколько способов стилизации: props,
sx и styleConfig. Использование
sx позволяет объединять стили на уровне компонента и
уменьшает количество создаваемых объектов стилей при каждом рендере:
<Box
sx={{
display: "flex",
alignItems: "center",
justifyContent: "space-between",
}}
/>
Для больших библиотек компонентов предпочтительно использовать
extendTheme и styleConfig, чтобы вынести стили
за пределы компонента и не пересоздавать их при каждом рендере.
Для страниц с большим количеством модальных окон, таблиц или других
тяжёлых компонентов важно использовать динамический импорт через React
lazy и Suspense:
import React, { Suspense, lazy } from "react";
const LazyModal = lazy(() => import("./Modal"));
function App() {
return (
<Suspense fallback={<div>Загрузка...</div>}>
<LazyModal />
</Suspense>
);
}
Это позволяет загружать тяжелые компоненты только при необходимости и снижает начальную нагрузку на страницу.
useStyleConfiguseStyleConfig позволяет получать предопределённые стили
темы для компонента. При каждом вызове хука создается новый объект
стилей, что может привести к лишним рендерингам. Для оптимизации
следует:
React.useMemoconst buttonStyles = useMemo(() => useStyleConfig("Button", { variant: "solid" }), []);
Компоненты Grid и Flex широко применяются
для построения интерфейса. Для производительности:
templateColumns и
templateRows вместо множества вложенных компонентовshouldWrapChildren и wrap
аккуратно<Grid templateColumns="repeat(3, 1fr)" gap={4}>
{items.map(item => <Box key={item.id}>{item.name}</Box>)}
</Grid>
chakra + системных props вместо inline-styleСистемные props (p, m, bg,
color, fontSize) компилируются в классы CSS
при построении приложения, что эффективнее, чем inline-style для
большого количества компонентов.
<Box p={4} bg="gray.100" color="black">
Контент
</Box>
Использование системных props уменьшает объём создаваемого CSS в runtime и снижает нагрузку на рендер.
Тема Chakra UI должна быть спроектирована так, чтобы повторно
используемые цвета, размеры и шрифты были вынесены в
theme.tokens. Это позволяет использовать одни и те же
объекты вместо создания новых на каждом рендере:
const theme = extendTheme({
colors: {
brand: {
100: "#f7fafc",
500: "#2b6cb0",
},
},
});
Использование токенов делает стили предсказуемыми и минимизирует дублирование объектов.
shouldUsePortal и closeOnEsc в модальных
компонентахКомпоненты типа Modal и Popover создают
портал в DOM. Для оптимизации:
isOpen
lazy load)closeOnEsc и
closeOnOverlayClick для контроля рендеринга<Modal isOpen={isOpen} onCl ose={onClose} closeOnOverlayClick={true}>
<ModalContent>...</ModalContent>
</Modal>
Ключевыми подходами для высокой производительности Chakra UI являются:
Эти методы позволяют создавать масштабируемые интерфейсы без снижения скорости рендеринга и увеличения нагрузки на браузер.