Belum ada banyak "Praktik Terbaik". Kita yang menggunakan gaya inline, untuk komponen Bereaksi, masih sangat banyak bereksperimen.
Ada sejumlah pendekatan yang sangat bervariasi: Bereaksi bagan perbandingan lib inline-style
Semua atau tidak?
Apa yang kami sebut sebagai "gaya" sebenarnya mencakup beberapa konsep:
- Layout - bagaimana elemen / komponen terlihat dalam hubungan dengan orang lain
- Penampilan - karakteristik elemen / komponen
- Perilaku dan status - bagaimana elemen / komponen terlihat dalam keadaan tertentu
Mulai dengan gaya-negara
Bereaksi sudah mengelola keadaan komponen Anda, ini membuat gaya keadaan dan perilaku cocok untuk colocation dengan logika komponen Anda.
Alih-alih membangun komponen untuk dirender dengan kelas-negara bersyarat, pertimbangkan untuk menambahkan gaya-negara secara langsung:
// 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 : {}} />
Perhatikan bahwa kita menggunakan kelas untuk gaya penampilan tetapi tidak lagi menggunakan .is-
kelas diawali untuk negara dan perilaku .
Kami dapat menggunakan Object.assign
(ES6) atau _.extend
(garis bawah / lodash) untuk menambahkan dukungan untuk beberapa negara:
// Supporting multiple-states with inline-styles
<li 'todo-list__item'
style={Object.assign({}, item.complete && styles.complete, item.due && styles.due )}>
Kustomisasi dan usabilitas ulang
Sekarang kita menggunakannya Object.assign
menjadi sangat sederhana untuk membuat komponen kita dapat digunakan kembali dengan gaya yang berbeda. Jika kita ingin mengganti gaya default, kita dapat melakukannya pada panggilan-situs dengan alat peraga, seperti jadi: <TodoItem dueStyle={ fontWeight: "bold" } />
. Diimplementasikan seperti ini:
<li 'todo-list__item'
style={Object.assign({},
item.due && styles.due,
item.due && this.props.dueStyles)}>
Tata letak
Secara pribadi, saya tidak melihat alasan kuat untuk gaya tata letak inline. Ada sejumlah sistem tata letak CSS yang bagus di luar sana. Saya hanya akan menggunakan satu.
Karena itu, jangan tambahkan gaya tata letak langsung ke komponen Anda. Bungkus komponen Anda dengan komponen tata letak. Ini sebuah contoh.
// 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>
Untuk dukungan tata letak, saya sering mencoba mendesain komponen menjadi 100%
width
dan height
.
Penampilan
Ini adalah area yang paling diperdebatkan dari debat "inline-style". Pada akhirnya, tergantung pada komponen yang Anda desain dan kenyamanan tim Anda dengan JavaScript.
Satu hal yang pasti, Anda akan memerlukan bantuan perpustakaan. Status peramban ( :hover
, :focus
), dan kueri media menyakitkan di Bereaksi mentah.
Saya suka Radium karena sintaks untuk bagian-bagian keras dirancang untuk memodelkan bahwa dari SASS.
Organisasi kode
Seringkali Anda akan melihat objek gaya di luar modul. Untuk komponen daftar tugas, mungkin terlihat seperti ini:
var styles = {
root: {
display: "block"
},
item: {
color: "black"
complete: {
textDecoration: "line-through"
},
due: {
color: "red"
}
},
}
fungsi pengambil
Menambahkan banyak logika gaya ke template Anda bisa menjadi sedikit berantakan (seperti yang terlihat di atas). Saya suka membuat fungsi getter untuk menghitung gaya:
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>
}
});
Menonton lebih lanjut
Saya membahas semua ini secara lebih rinci di React Europe awal tahun ini: Inline Styles dan kapan sebaiknya 'hanya menggunakan CSS' .
Saya senang membantu ketika Anda membuat penemuan baru di sepanjang jalan :) Pukul aku -> @chantastic