Как расширить базовые компоненты в стиле эмоций CSS?

https://codesandbox.io/s/w242n1vonw

У меня есть проект с использованием системной системы и реагирующих эмоций.

У меня есть стилизованные заголовки, которые наследуются от базового CSS для повторного использования.

Иногда я хочу иметь возможность перезаписывать свойства, используя стилизованную систему, такую ​​как:

<H1 color='green'/>

Это работает и хорошо, когда мой базовый компонент:

const BaseHeading = ({ theme, ...props }) => css`
  color: ${props.color ? props.color : theme.secondary};
`;

Но если я хочу переопределить десять свойств, мне нужно повторно использовать этот условный реквизит. Это идиоматический способ написать такую ​​функциональность?

1 ответ

Вы можете создать новый компонент с настраиваемым стилем, который расширяет компонент с другим стилем, используя стилевую функцию из @ Emotion/styled. Допустим, у вас есть стилизованный компонент под названием BoldText.

const BoldText = styled("div")`
  font-size: 16px;
  font-weight: bold;
`;

Вы можете переопределить определенные свойства BoldText, создав новый стилизованный компонент, основанный на BoldText, аналогично тому, как BoldText построен на основе div.

import styled from "@emotion/styled";
import BoldText from "./BoldText"

const BigBoldText = styled(BoldText)`
  font-size: 20px;
`

<BoldText>I'm bold and 16px</BoldText>
<BigBoldText>I'm bold and 20px</BigBoldText>

Я считаю, что это правильный подход к переопределению нескольких свойств. Если у вас есть другие свойства, которые исправлены как margin Например, вы могли бы сделать что-то вроде ниже, чтобы помочь прояснить ваш файл "CSS".

const marginMap = {
  sm: '4px',
  md: '8px',
  lg: '10px',
  default: '0',
}

const BaseHeading = styled.header`
  margin: ${({ margin = 'default'}) => marginMap[margin]};
`;

Ты можешь измениться 'default' быть вашей основной темой

Но на ваш вопрос, я не видел лучшего способа перезаписать свойства, используя стилизованные системные / стилизованные компоненты

Другие вопросы по тегам