2017-02-22 13 views
1

テーマ解決のためのより良い解決策が見つかりません。私は、ユーザーが閲覧しているページに応じて、いくつかのスタイルを持っている必要があり、すべてのコンポーネントにtheme小道具を渡す今のReact prop値に応じてsass変数を使用して反応するコンポーネントテーマ

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

vars.scss:私は、変数とSASSファイルを持っています。私は

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

しかし、私はに応じてスタイル要素にこのようなコードに私は必要なすべての時間を配置する必要があるため、これは、絶対に不便であり、私はこのようなクラス名を構築リアクトテーマ。

webpackでテーマに応じて異なるファイルを読み込む方法がありますが、私はtheme propxをreduxから受け取ります。したがってwebpackはその小道具にアクセスできません。

また、反応成分から溜めにプロパティを渡す解決策を見つけることができません。正反対です。

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

私はこれになるだろう唯一の他の提案は、 'theme'にアクセスするための(https://facebook.github.io/react/docs/context.html)[のコンテキストに反応]使用を検討するだろう小道具をどこにも渡す代わりに。 –

+0

そして、誰かが実験的なAPIだけであるContextについて何かを言う前に:https://twitter.com/dan_abramov/status/749715530454622208 –

+1

私のテーマの色を使用する必要があるたびにあなたの例は、 ? 私はコンテキストを使用できます。しかし、私はその小道具を一切取り除きたいです!私はこのように書く: '

{children}
' しかし、sassはテーマによって$ theme-color変数を使うべきです。 '.button { font-size:14px; border:1px solid $ theme-color; color:$ theme-color; } ' ここでは' theme'は 'theme' propに応じて' $ theme-color'を読み込むべきです。 – seleckis

関連する問題