Estilando un componente
React no determina una única forma de darle estilos a un componente, por lo que existen varias técnicas y herramientas para hacerlo. En nuestro caso, vamos a usar dos: una para estilos más "estáticos" o fijos, y otra para estilos que tengan que ser calculados dinámicamente.
Para aquellos estilos que no varíen (más allá de alguna transición, animación o cambio de clase), es decir, para estilos más fijos, vamos a declararlos en un archivo .scss
propio del componente, que está dentro de la misma carpeta y tiene el mismo nombre que el componente.
Por ejemplo:
// MiComponente.jsimport React from 'react'import './MiComponente.scss'const MiComponente = () => (<div className='mi-clase' />)export default MiComponente
/** MiComponente.scss */.mi-clase {/** Estilos particulares del componente */}
Dentro del .scss
, podemos aprovechar todas las ventajas que nos ofrece Sass, por ejemplo, selectores anidados y variables:
// Comment.jsimport React from 'react'import './Comment.scss'const Comment = () => (<div className='comment'><p className='comment-title'></p><p className='comment-text'></p></div>)export default Comment
/** _variables.scss */$main-color: black;$secondary-color: grey;
/** Comment.scss */@import 'styles/variables'.comment {.comment-title {color: $main-color;}.comment-text {color: $secondary-color;}}
Es buena práctica que los nombres de las clases de un componente sean lo más específicas posible, para evitar conflictos con otros estilos. Por ejemplo, es mejor esto:
// Comment.jsimport React from 'react'import './Comment.scss'const Comment = () => (<div className='comment'><p className='comment-title'></p><p className='comment-text'></p></div>)export default Comment
a esto:
// Comment.jsimport React from 'react'import './Comment.scss'const Comment = () => (<div className='comment'><p className='title'></p><p className='text'></p></div>)export default Comment
Podemos aprovechar una ventaja interesante de Sass, los mixins que son porciones de estilos reutilizable, para darles estilos que se utilizan en nuestra aplicación seguido a distintos componentes. El mixin se declara con la siguiente sintaxis:
/** _buttons.scss */@mixin primary-button {background-color: 'green',border-radius: 5px;}
y se utiliza así:
/** MiComponente.scss */@import 'styles/buttons';.mi-boton {@include primary-button;}
Por otro lado, dentro de nuestro componente, podemos definirle a un elemento HTML estilos con JS. Para esto, utilizamos la propiedad style
, que toma como valor un objeto, cuyas propiedades son las propiedades de CSS en camelCase
. Por ejemplo:
const Comment = () => (<div className='comment' style={{ backgroundColor: 'red' }}/>)
Como un componente es un conjunto de elementos HTML y/o otros componentes, aplicarle un estilo a un componente en general no tiene sentido, porque React no sabe a cuál de todos los que lo componen debería asignarle esos estilos. Por lo tanto, los estilos sólo se aplican a elementos HTML. Definir los estilos dentro de nuestro componente permite que, dado que es código JS, podamos utilizar expresiones y variables para calcular el valor de una propiedad.