Тематические стилизованные компоненты объединяют реквизит и тему

Просто для любопытства я использую стилевые компоненты в своем приложении React, и там я использую предложенную тему, чтобы везде были доступны все цвета и размеры.

В настоящее время я делаю это так:

export const TestComponent = styled.div`
    color: ${({ theme }) => theme.white};
    background-color: ${({ theme }) => theme.white};
    border: 1px solid ${({ theme }) => theme.white};
    display: ${({ check }) => check ? 'block' : 'none'};
`;

Так что я использую тему из ThemeProvider а также дополнительная проверка внешнего компонента.

Мой вопрос сейчас, почему я не могу использовать это так:

export const TestComponent = styled.div`${({ theme, check }) => (css`
    color: ${theme.white};
    background-color: ${theme.white};
    border: 1px solid ${theme.white};
    display: ${check ? 'block' : 'none'};
`)`;

Разве это не будет удобнее и проще в использовании? И если так, то почему они не предлагают это так? Я просто боюсь, что у нее есть огромный недостаток, которого я сейчас не вижу.

1 ответ

Я не верю, что с этим подходом что-то не так. Я часто использовал то, что вы делаете в вашем первом примере в большом приложении React, и у меня не было проблем (пока).

Это, как говорится, ваш второй пример совершенно справедливо. Вам даже не нужно css помощник:

const Test = styled.div`
  ${({ theme }) => `color: ${theme.white};`}
`;

В общем, я использую css помощник для создания абстрагированных / разделяемых кусков CSS:

const fontSize = css`
  font-size: ${({ small, large, theme }) => {
    if (small) return `${theme.small}rem`;
    if (large) return `${theme.large}rem`;
    return `${theme.normal}rem`;
  }};
`;


const Test = styled.div`
  ${({ theme }) => `color: ${theme.white};`}
  ${fontSize}
`;

А потом:

<Test small>Hello World</Test>
Другие вопросы по тегам