Nie ma jeszcze wielu „najlepszych praktyk”. Ci z nas, którzy używają stylów wbudowanych do komponentów React, nadal bardzo eksperymentują.
Istnieje wiele podejść, które są bardzo różne: React Tabela porównawcza lib w stylu wbudowanym
Wszystko albo nic?
To, co nazywamy „stylem”, zawiera w rzeczywistości sporo pojęć:
- Układ - jak element / komponent wygląda w relacji do innych
- Wygląd - charakterystyka elementu / komponentu
- Zachowanie i stan - jak element / komponent wygląda w danym stanie
Zacznij od stylów państwowych
React już zarządza stanem twoich komponentów, dzięki czemu style stanu i zachowania są w naturalny sposób dostosowane do kolokacji z logiką komponentów.
Zamiast budować komponenty do renderowania z warunkowymi klasami stanów, rozważ bezpośrednie dodanie stylów:
// 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 : {}} />
Zauważ, że używamy klasy do stylizowania wyglądu, ale nie używamy już żadnych .is-
klas z prefiksem dla stanu i zachowania .
Możemy użyć Object.assign
(ES6) lub _.extend
(podkreślenie / lodash), aby dodać obsługę wielu stanów:
// Supporting multiple-states with inline-styles
<li 'todo-list__item'
style={Object.assign({}, item.complete && styles.complete, item.due && styles.due )}>
Personalizacja i możliwość ponownego użycia
Teraz, gdy Object.assign
go używamy , staje się bardzo proste, aby nasz komponent mógł być wielokrotnie wykorzystywany w różnych stylach. Jeśli chcemy, aby zastąpić style domyślne, możemy to zrobić w miejscu połączenia z rekwizytów, tak: <TodoItem dueStyle={ fontWeight: "bold" } />
. Zaimplementowane w ten sposób:
<li 'todo-list__item'
style={Object.assign({},
item.due && styles.due,
item.due && this.props.dueStyles)}>
Układ
Osobiście nie widzę przekonującego powodu, aby wstawiać style układu. Istnieje wiele świetnych układów CSS. Po prostu użyłbym jednego.
To powiedziawszy, nie dodawaj stylów układu bezpośrednio do swojego komponentu. Zawiń komponenty komponentami układu. Oto przykład.
// 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>
W celu obsługi układu często próbuję zaprojektować komponenty, które będą 100%
width
i height
.
Wygląd
Jest to najbardziej kontrowersyjny obszar debaty „w stylu”. Ostatecznie, to zależy od twojego projektu i wygody twojego zespołu dzięki JavaScript.
Jedno jest pewne, będziesz potrzebować pomocy biblioteki. Stany przeglądarek ( :hover
, :focus
) i zapytania o media są bolesne w surowym React.
Lubię Radium, ponieważ składnia tych twardych części ma na celu modelowanie SASS.
Organizacja kodu
Często zobaczysz obiekt stylu na zewnątrz modułu. W przypadku komponentu listy zadań może wyglądać mniej więcej tak:
var styles = {
root: {
display: "block"
},
item: {
color: "black"
complete: {
textDecoration: "line-through"
},
due: {
color: "red"
}
},
}
funkcje gettera
Dodanie do szablonu kilku stylów logiki może być nieco nieporządne (jak pokazano powyżej). Lubię tworzyć funkcje pobierające do obliczania stylów:
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>
}
});
Dalsze oglądanie
Omówiłem to wszystko bardziej szczegółowo na React Europe na początku tego roku: Style Inline i kiedy najlepiej „po prostu używać CSS” .
Cieszę się, że pomagam, gdy dokonujesz nowych odkryć po drodze :) Hit me up -> @chantastic