「ベスト プラクティス」はまだ多くありません。React コンポーネントにインライン スタイルを使用している私たちは、まだ非常に多くの実験を行っています。
大きく異なるいくつかのアプローチがあります: React inline-style lib comparison chart
全部かゼロか?
私たちが「スタイル」と呼んでいるものには、実際にはかなりの数の概念が含まれています。
- レイアウト —要素/コンポーネントが他の要素との関係でどのように見えるか
- 外観 —要素/コンポーネントの特性
- 動作と状態 —要素/コンポーネントが特定の状態でどのように見えるか
状態スタイルから始める
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
(underscore/lodash) を使用して、複数の状態のサポートを追加できます。
// Supporting multiple-states with inline-styles
<li 'todo-list__item'
style={Object.assign({}, item.complete && styles.complete, item.due && styles.due )}>
カスタマイズと再利用
使用Object.assign
するようになったので、コンポーネントをさまざまなスタイルで再利用可能にすることが非常に簡単になります。デフォルトのスタイルをオーバーライドしたい場合は、次のように 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 では苦痛です。
私がRadiumを気に入っているのは、これらの難しい部分の構文が SASS の構文をモデル化するように設計されているからです。
コード編成
多くの場合、モジュールの外側にスタイル オブジェクトが表示されます。todo-list コンポーネントの場合、次のようになります。
var styles = {
root: {
display: "block"
},
item: {
color: "black"
complete: {
textDecoration: "line-through"
},
due: {
color: "red"
}
},
}
ゲッター関数
テンプレートに一連のスタイル ロジックを追加すると、少し面倒になる可能性があります (上記のように)。スタイルを計算する getter 関数を作成するのが好きです。
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