Первоначально опубликовано в Timrichter.dev.
Стильные компоненты ❤ ️. Есть куча библиотек, уже написанных для него, одна из которых является стиль-система, которая упрощает создание компонентной системы проектирования.
Сейчас стиль-система потрясающая Но у меня были проблемы с поиском хороших способов интеграции его с помощью Teadercript, особенно при использовании пользовательских компонентов. Так что вот небольшое руководство о том, как это сделать 😉
Предпосылка
Если вы еще не установили типы для стилизованной системы.
npm install @types/styled-system # or with yarn yarn add @types/styled-system
Обычно стилизованные теги
import { layout, LayoutProps } from 'styled-system'; const Image = styled.img` ${layout} `;
Стильные компоненты не знают о нас, используя реквизиты макета в нашем компоненте изображения, поэтому мы должны явно объявлять его с помощью «LayoutProps».
Существует реквизит, эквивалентен для всего в стиле в стиле системе, например, ColorProps, пространство – это космические трубы и так далее.
Пользовательские компоненты
import { layout, LayoutProps, position, PositionProps } from 'styled-system'; interface Props extends PositionProps, LayoutProps { children: React.ReactNode; } const Container = styled.div` ${position}; ${layout}; `; const DropdownMenu: React.FC = ({ children, ...props }) => { return {children} ; };
Важные детали здесь должны пройти оставшуюся часть реквизита к элементу, который должен быть введен в стили (в данном случае «контейнер») и объединение макета, позиции и пользовательских реквизитов (здесь «детей») в один тип, а затем передавать это Стильный компонент и сам компонент 😁
Расширенные пользовательские компоненты
import { space, SpaceProps } from 'styled-system'; interface ContainerProps extends React.HTMLAttributes{ isOwner: boolean; } type Props = ContainerProps & SpaceProps & { content: string; }; const Container = styled.div ` ${space}; ${(props) => props.isOwner ? 'align-self: flex-end' : 'align-self: flex-start' }; `; const Message: React.FC = ({ content, isOwner, ...props }) => { return ( {content} ); };
Это выглядит непростой 😅 Мы собираемся пройти через это один за другим.
interface ContainerProps extends React.HTMLAttributes{ isOwner: boolean; } const Container = styled.div ` ${space}; ${(props) => props.isOwner ? 'align-self: flex-end' : 'align-self: flex-start' }; `;
Мы хотим дать в стиле Div на заказ «Isowner» в стиле его условно. Для этого мы должны продлить реквизиты, что элемент div ожидает (htmlattributes)
type Props = ContainerProps & SpaceProps & { content: string; }; const Message: React.FC= ({ content, isOwner, ...props }) => { return ( {content} ); };
Мы объединяем все реквизиты из контейнера, космических реквизитов и нашего пользовательского «контента» -Prop вместе в один тип и передайте это к компоненту. В конце концов мы можем пройти:
- Все реквизиты, что обычный элемент div, кроме, они будут переданы наш контейнер
- Все космические реквизиты от стилизованной системы, они также передаются в наш контейнер
- Наш нестандартный реквизит «Isowner» и «контент», «Isowner» передан в контейнер и «контент» будет ребенком
У нас есть сильно напечатанный компонент, который использует стилизованные системы, стилизованные компоненты и пользовательские реквизиты 🥳
Оригинал: “https://dev.to/timrichter/how-to-use-styled-system-with-typescript-2fjo”