Es gibt noch nicht viele "Best Practices". Diejenigen von uns, die Inline-Stile für React-Komponenten verwenden, experimentieren immer noch sehr viel.
Es gibt eine Reihe von Ansätzen, die stark variieren: Reagieren Sie auf ein Inline-Lib-Vergleichstabelle
Alles oder nichts?
Was wir als "Stil" bezeichnen, beinhaltet tatsächlich einige Konzepte:
- Layout - wie ein Element / eine Komponente im Verhältnis zu anderen aussieht
- Aussehen - die Eigenschaften eines Elements / einer Komponente
- Verhalten und Zustand - wie ein Element / eine Komponente in einem bestimmten Zustand aussieht
Beginnen Sie mit Statusstilen
React verwaltet bereits den Status Ihrer Komponenten. Dadurch eignen sich Status- und Verhaltensstile auf natürliche Weise für die Colocation mit Ihrer Komponentenlogik.
Anstatt Komponenten zum Rendern mit bedingten Statusklassen zu erstellen, sollten Sie Statusstile direkt hinzufügen:
// 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 : {}} />
Beachten Sie, dass wir eine Klasse verwenden, um das Erscheinungsbild zu gestalten, aber keine .is-vorangestellte Klasse mehr für Status und Verhalten verwenden .
Wir können Object.assign(ES6) oder _.extend(Unterstrich / lodash) verwenden, um Unterstützung für mehrere Zustände hinzuzufügen:
// Supporting multiple-states with inline-styles
<li 'todo-list__item'
style={Object.assign({}, item.complete && styles.complete, item.due && styles.due )}>
Anpassung und Wiederverwendbarkeit
Jetzt, da wir es verwenden Object.assign, wird es sehr einfach, unsere Komponente mit verschiedenen Stilen wiederverwendbar zu machen. Wenn wir die Standardstile überschreiben möchten, können wir dies an der Aufrufstelle mit Requisiten tun, wie zum Beispiel : <TodoItem dueStyle={ fontWeight: "bold" } />. So implementiert:
<li 'todo-list__item'
style={Object.assign({},
item.due && styles.due,
item.due && this.props.dueStyles)}>
Layout
Persönlich sehe ich keinen zwingenden Grund für Inline-Layoutstile. Es gibt eine Reihe großartiger CSS-Layoutsysteme. Ich würde nur einen verwenden.
Fügen Sie Ihrer Komponente jedoch keine Layoutstile direkt hinzu. Wickeln Sie Ihre Komponenten mit Layoutkomponenten ein. Hier ist ein Beispiel.
// 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>
Zur Unterstützung des Layouts versuche ich oft, Komponenten so zu gestalten, dass sie 100% widthund sind height.
Aussehen
Dies ist der umstrittenste Bereich der Debatte im "Inline-Stil". Letztendlich liegt es an der Komponente, die Sie entwerfen, und am Komfort Ihres Teams mit JavaScript.
Eines ist sicher, Sie benötigen die Unterstützung einer Bibliothek. Browserzustände ( :hover, :focus) und Medienabfragen sind in Raw React schmerzhaft.
Ich mag Radium, weil die Syntax für diese harten Teile so gestaltet ist, dass sie die von SASS modelliert.
Code-Organisation
Oft sehen Sie ein Stilobjekt außerhalb des Moduls. Für eine Aufgabenlistenkomponente könnte sie ungefähr so aussehen:
var styles = {
root: {
display: "block"
},
item: {
color: "black"
complete: {
textDecoration: "line-through"
},
due: {
color: "red"
}
},
}
Getter-Funktionen
Das Hinzufügen einer Reihe von Stillogiken zu Ihrer Vorlage kann etwas chaotisch werden (wie oben gezeigt). Ich mag es, Getter-Funktionen zu erstellen, um Stile zu berechnen:
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>
}
});
Weiter beobachten
All dies habe ich Anfang dieses Jahres auf der React Europe ausführlicher besprochen: Inline-Stile und wann es am besten ist, nur CSS zu verwenden .
Ich helfe Ihnen gerne dabei, neue Entdeckungen zu machen :) Schlagen Sie mich an -> @chantastic