Todavía no hay muchas "Mejores prácticas". Aquellos de nosotros que estamos usando estilos en línea, para componentes React, todavía estamos experimentando mucho.
Hay varios enfoques que varían enormemente: Reaccione la tabla de comparación de lib en línea
¿Todo o nada?
Lo que llamamos "estilo" en realidad incluye algunos conceptos:
- Diseño: cómo se ve un elemento / componente en relación con otros
- Apariencia: las características de un elemento / componente
- Comportamiento y estado: cómo se ve un elemento / componente en un estado dado
Comience con estilos de estado
React ya está administrando el estado de sus componentes, esto hace que los estilos de estado y comportamiento un ajuste natural para la colocación con la lógica de sus componentes.
En lugar de crear componentes para renderizar con clases de estado condicionales, considere agregar estilos de estado directamente:
// 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 : {}} />
Tenga en cuenta que estamos usando una clase para diseñar la apariencia, pero ya no usamos ninguna .is-
clase prefijada para estado y el comportamiento .
Podemos usar Object.assign
(ES6) o _.extend
(subrayado / lodash) para agregar soporte para múltiples estados:
// Supporting multiple-states with inline-styles
<li 'todo-list__item'
style={Object.assign({}, item.complete && styles.complete, item.due && styles.due )}>
Personalización y reutilización
Ahora que lo estamos usando Object.assign
se vuelve muy simple hacer que nuestro componente sea reutilizable con diferentes estilos. Si queremos anular los estilos por defecto, podemos hacerlo en la llamada in situ con los apoyos, así: <TodoItem dueStyle={ fontWeight: "bold" } />
. Implementado así:
<li 'todo-list__item'
style={Object.assign({},
item.due && styles.due,
item.due && this.props.dueStyles)}>
Diseño
Personalmente, no veo una razón convincente para los estilos de diseño en línea. Hay una serie de excelentes sistemas de diseño CSS por ahí. Solo usaría uno.
Dicho esto, no agregue estilos de diseño directamente a su componente. Envuelva sus componentes con componentes de diseño. Aquí hay un ejemplo.
// 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>
Para el soporte de diseño, a menudo trato de diseñar componentes para ser 100%
width
y height
.
Apariencia
Esta es el área más polémica del debate del "estilo en línea". En última instancia, depende del componente que diseñe y la comodidad de su equipo con JavaScript.
Una cosa es segura, necesitará la ayuda de una biblioteca. Estados del navegador ( :hover
,:focus
) y las consultas de medios son dolorosos en React sin procesar.
Me gusta el radio porque la sintaxis de esas partes duras está diseñada para modelar la de SASS.
Organización del código
A menudo verá un objeto de estilo fuera del módulo. Para un componente de lista de tareas, podría verse así:
var styles = {
root: {
display: "block"
},
item: {
color: "black"
complete: {
textDecoration: "line-through"
},
due: {
color: "red"
}
},
}
funciones getter
Agregar un montón de lógica de estilo a su plantilla puede ser un poco complicado (como se ve arriba). Me gusta crear funciones getter para calcular estilos:
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>
}
});
Mirando más
Discutí todo esto con más detalle en React Europe a principios de este año: Estilos en línea y cuándo es mejor 'usar CSS' .
Estoy feliz de ayudarlo mientras hace nuevos descubrimientos en el camino :) Dame un golpe -> @chantastic