「ベストプラクティス」はまだ多くありません。Reactコンポーネントにインラインスタイルを使用している私たちは、まだ非常に多くの実験を行っています。
大きく異なるアプローチは多数あります。Reactインラインスタイルのlib比較表
全部かゼロか?
私たちが「スタイル」と呼ぶものには、実際にはかなりの数の概念が含まれています。
- レイアウト— 他の要素との関係で要素/コンポーネントがどのように見えるか
- 外観— 要素/コンポーネントの特性
- 動作と状態— 要素/コンポーネントが特定の状態でどのように見えるか
状態スタイルから始める
Reactはすでにコンポーネントの状態を管理しています。これにより、状態と動作のスタイルがコンポーネントロジックとのコロケーションに自然に適合します。
条件付きの状態クラスでレンダリングするコンポーネントを構築する代わりに、状態スタイルを直接追加することを検討してください:
// Typical component with state-classes
<li
className={classnames({ 'todo-list__item': true, 'is-complete': item.complete })} />
// Using inline-styles for state
<li className='todo-list__item'
style={(item.complete) ? styles.complete : {}} />
外観のスタイルを設定するためにクラスを使用しているが.is-
、状態と動作には接頭辞付きのクラスを使用していないことに注意してください。
Object.assign
(ES6)または_.extend
(アンダースコア/ロダッシュ)を使用して、複数の状態のサポートを追加できます。
// Supporting multiple-states with inline-styles
<li 'todo-list__item'
style={Object.assign({}, item.complete && styles.complete, item.due && styles.due )}>
カスタマイズと再利用性
これでObject.assign
、コンポーネントをさまざまなスタイルで再利用できるようにすることが非常に簡単になりました。デフォルトのスタイルを上書きしたい場合は、call-siteで次のようにpropsを使用して上書きできます<TodoItem dueStyle={ fontWeight: "bold" } />
。このように実装されています:
<li 'todo-list__item'
style={Object.assign({},
item.due && styles.due,
item.due && this.props.dueStyles)}>
レイアウト
個人的には、インラインレイアウトスタイルに説得力のある理由はありません。優れたCSSレイアウトシステムは数多くあります。1つだけ使用します。
ただし、コンポーネントに直接レイアウトスタイルを追加しないでください。コンポーネントをレイアウトコンポーネントでラップします。ここに例があります。
// This couples your component to the layout system
// It reduces the reusability of your component
<UserBadge
className="col-xs-12 col-sm-6 col-md-8"
firstName="Michael"
lastName="Chan" />
// This is much easier to maintain and change
<div class="col-xs-12 col-sm-6 col-md-8">
<UserBadge
firstName="Michael"
lastName="Chan" />
</div>
レイアウトをサポートするために、私はしばしばコンポーネントをとに設計しよう100%
width
としheight
ます。
外観
これは、「インラインスタイル」の議論の中で最も論争の的となっている領域です。最終的には、設計するコンポーネントとJavaScriptを使用したチームの快適さ次第です。
確かなことが1つあります。図書館の支援が必要です。ブラウザの状態(:hover
、:focus
)、およびメディアクエリは、未加工のReactでは苦痛です。
これらのハードパーツの構文はSASSの構文をモデル化するように設計されているため、私はラジウムが好きです。
コード編成
多くの場合、モジュールの外側にスタイルオブジェクトが表示されます。todo-listコンポーネントの場合、次のようになります。
var styles = {
root: {
display: "block"
},
item: {
color: "black"
complete: {
textDecoration: "line-through"
},
due: {
color: "red"
}
},
}
ゲッター関数
テンプレートに一連のスタイルロジックを追加すると、少し面倒になる場合があります(上記を参照)。スタイルを計算するゲッター関数を作成したい:
React.createClass({
getStyles: function () {
return Object.assign(
{},
item.props.complete && styles.complete,
item.props.due && styles.due,
item.props.due && this.props.dueStyles
);
},
render: function () {
return <li style={this.getStyles()}>{this.props.item}</li>
}
});
さらに見る
これらすべてについては、今年初めにReact Europeで詳しく説明しました。インラインスタイルと、「CSSを使用する」のが最適な時期です。
途中で新しい発見がありましたら、喜んでお手伝いさせていただきます:)ヒットアップ-> @chantastic