2017-02-22 4 views
1

Ich kann keine bessere Lösung für Theming finden. Ich habe eine Sass-Datei mit Variablen:Reagieren Komponententhema mit Sass Variablen abhängig von React Prop Wert

vars.scss:

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

Vorerst gehe ich theme prop zu allen Komponenten, die einige Styling je nachdem, welche Seite Benutzer haben sollte gerade überprüft. In Reaktion bauen I Klassennamen wie folgt aus:

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

und in sass ich tun:

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

Aber das ist absolut unpraktisch, weil ich jedes Mal einen solchen Code platzieren muss ich Stilelement benötigen je nach Thema.

Es gibt Lösungen, wie man verschiedene Dateien mit Variablen für die Thematisierung im Webpack lädt, aber ich erhalte Requisite von redux, also hat webpack keinen Zugriff auf diese Requisite.

Ebenso kann ich keine Lösung finden, um die Eigenschaft von der Reaktionskomponente auf Sass zu übergeben. Nur gegenüber.

Keine Möglichkeit, Variablen bei Importen in Sass zu verwenden. Immer noch nicht implementiert.

Leider kann CSS-in-JS-Ansatz im aktuellen Projekt nicht verwendet werden.

Bitte helfen Sie besser Ansatz zu finden.

Antwort

1

Ich würde es zu einer zustandslosen funktionalen Komponente machen.

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

Dann importieren Sie es und verwenden Sie es. Es besteht keine Notwendigkeit, das Thema herumzugeben.

{user.notice ? 
    <BrightBox> 
    there are {user.notice.issues.size} outstanding issues! 
    </BrightBox> 
: null 
} 
+0

Der einzige andere Vorschlag, den ich dazu machen würde wäre zu prüfen, mit [Context Reagieren der] (https://facebook.github.io/react/docs/context.html) für den Zugriff auf die 'theme' Stütze, anstatt sie überall herumzutragen. –

+0

Und bevor irgendjemand irgendetwas über Context sagt, das nur eine experimentelle API ist: https://twitter.com/dan_abramov/status/749715530454622208 –

+1

Wie Ihr Beispiel mir helfen wird, Loops in Sass zu platzieren, jedes Mal wenn ich Themes Colors verwenden muss ? Ok, ich kann Kontext verwenden, was auch immer. Aber ich möchte diese Stütze überhaupt loswerden! Ich möchte so schreiben: '

{children}
' Aber Sass sollte $ theme-color Variable nach Thema verwenden. '.button { Schriftgröße: 14px; border: 1px solid $ theme-color; Farbe: $ Thema-Farbe; } ' ' $ theme-color' sollte hier geladen werden abhängig von 'theme' prop. – seleckis

Verwandte Themen