2017-02-22 6 views
1

Я не могу найти лучшего решения для тематики. У меня есть Сасс-файл с переменными:Реакция темы компонента с использованием переменных sass в зависимости от значения React prop

vars.scss:

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

На данный момент я прохожу theme опору для всех компонентов, которые должны иметь некоторый стиль в зависимости от того, на какой странице пользователь просматривает. В React я строй имени класса, как это:

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

и в дерзости я:

@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; 
     } 
    } 
} 

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

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

Как и я, я не могу найти решение для передачи свойства от реагирующего компонента к 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 
} 
+0

Единственное другое предложение, которое я сделал бы, чтобы это было бы посмотреть в использовании [РЕАКТ Context] (https://facebook.github.io/react/docs/context.html) для доступа к 'theme' а не распространять его повсюду. –

+0

И прежде, чем кто-нибудь скажет что-нибудь о Контексте, являющемся только экспериментальным API: https://twitter.com/dan_abramov/status/749715530454622208 –

+1

Как ваш пример поможет мне избавиться от размещения циклов в sass каждый раз, когда мне нужно использовать цвета тем ? Хорошо, я могу использовать контекст, что угодно. Но я хочу избавиться от этой опоры! Я хочу написать вот так: '

{children}
' Но sass должен использовать переменную $ theme-color согласно теме. '.button { font-size: 14px; border: 1px solid $ theme-color; цвет: $ theme-color; } ' ' $ theme-color' здесь должен быть загружен в зависимости от 'theme' prop. – seleckis

Смежные вопросы