Non ci sono ancora molte "Best Practices". Quelli di noi che usano stili in linea, per i componenti di React, stanno ancora sperimentando molto.
Esistono diversi approcci che variano notevolmente: Reagisci grafico di confronto lib in stile in linea
Tutto o niente?
Quello che chiamiamo "stile" in realtà include alcuni concetti:
- Layout: aspetto di un elemento / componente in relazione agli altri
- Aspetto: le caratteristiche di un elemento / componente
- Comportamento e stato: l'aspetto di un elemento / componente in un determinato stato
Inizia con stili di stato
React sta già gestendo lo stato dei componenti, questo crea stili di stato e comportamento un adattamento naturale per la colocazione con la logica dei componenti.
Invece di creare componenti per il rendering con classi di stato condizionali, prendere in considerazione l'aggiunta diretta di stili di stato:
// 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 : {}} />
Nota che stiamo usando una classe per definire l' aspetto ma non stiamo più usando alcuna .is-
classe con prefisso per stato e comportamento .
Possiamo usare Object.assign
(ES6) o _.extend
(trattino basso / lodash) per aggiungere supporto per più stati:
// Supporting multiple-states with inline-styles
<li 'todo-list__item'
style={Object.assign({}, item.complete && styles.complete, item.due && styles.due )}>
Personalizzazione e riusabilità
Ora che lo stiamo usando Object.assign
diventa molto semplice rendere riutilizzabile il nostro componente con stili diversi. Se vogliamo ignorare gli stili predefiniti, siamo in grado di farlo al call-sito con oggetti di scena, in questo modo: <TodoItem dueStyle={ fontWeight: "bold" } />
. Implementato in questo modo:
<li 'todo-list__item'
style={Object.assign({},
item.due && styles.due,
item.due && this.props.dueStyles)}>
disposizione
Personalmente, non vedo motivi validi per incorporare gli stili di layout. Esistono numerosi fantastici sistemi di layout CSS. Ne userei solo uno.
Detto questo, non aggiungere stili di layout direttamente al tuo componente. Avvolgi i tuoi componenti con componenti di layout. Ecco un esempio
// 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>
Per il supporto del layout, provo spesso a progettare componenti per essere 100%
width
e height
.
Aspetto
Questa è l'area più controversa del dibattito "inline-style". In definitiva, dipende dal componente che stai progettando e dal comfort del tuo team con JavaScript.
Una cosa è certa, avrai bisogno dell'assistenza di una biblioteca. Gli stati del browser ( :hover
, :focus
) e le media query sono dolorosi in React non elaborato.
Mi piace il radio perché la sintassi di quelle parti dure è progettata per modellare quella di SASS.
Organizzazione del codice
Spesso vedrai un oggetto stile al di fuori del modulo. Per un componente todo-list, potrebbe assomigliare a questo:
var styles = {
root: {
display: "block"
},
item: {
color: "black"
complete: {
textDecoration: "line-through"
},
due: {
color: "red"
}
},
}
funzioni getter
L'aggiunta di un sacco di logica di stile al tuo modello può diventare un po 'confusa (come visto sopra). Mi piace creare funzioni getter per calcolare gli stili:
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>
}
});
Ulteriore osservazione
Ho discusso di tutto ciò in modo più dettagliato a React Europe all'inizio di quest'anno: Inline Styles e quando è meglio "usare solo CSS" .
Sono felice di aiutarti mentre fai nuove scoperte lungo la strada :) Hit me up -> @chantastic