Реагируйте на тему компонента, используя переменные sass, в зависимости от значения React prop

Я не могу найти лучшего решения для темы. У меня есть sass-файл с переменными:

vars.scss:

$colors: (
    dark: (
        theme1: #0096dc,
        theme2: #eb8200,
        …
    ),
    …
);

Сейчас я прохожу theme Опора для всех компонентов, которые должны иметь определенный стиль в зависимости от того, какую страницу просматривает пользователь. В React я строю имя класса следующим образом:

<div className={styles[`button${theme ? `-${theme}` : ``}`]}>{children}</div>

и в sass я делаю:

@import 'vars';

.button{
    /* basic styles */
    font-size: 14px;
    border: 1px solid;

    @each $theme, $color in map-get($colors, dark) {
        &-#{$theme} {
            @extend .button;
            border-color: $color;
            color: $color;
        }
    }
}

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

Есть решения, как загружать разные файлы с переменными для их размещения в веб-пакете, но я получаю theme prop от redux, поэтому у webpack нет доступа к этому prop.

Кроме того, я не могу найти решение для передачи свойства из реагирующего компонента в sass. Только напротив.

Нет способа использовать переменные в импорте в sass. Все еще не реализовано.

К сожалению, невозможно использовать подход CSS-in-JS в текущем проекте.

Пожалуйста, помогите найти лучший подход.

1 ответ

Я бы сделал это функциональным компонентом без сохранения состояния.

function BrightBox(props){
  <div className={styles[`button${theme ? `-${theme}` : ``}`]}>
    {props.children}
  </div>
}

Затем импортируйте его и используйте. Нет необходимости передавать тему.

{user.notice ? 
  <BrightBox>
    there are {user.notice.issues.size} outstanding issues!
  </BrightBox>
 : null
}
Другие вопросы по тегам