Saltar al contenido principal

Emotion

¿Qué es Emotion?​

Emotion es una popular librería de JavaScript utilizada en React para aplicar estilos en línea (CSS-in-JS) de manera eficiente y dinámica. A diferencia del enfoque tradicional de CSS, donde los estilos se separan del código JavaScript, Emotion permite escribir estilos directamente dentro de los componentes, proporcionando una mayor flexibilidad y mantenibilidad en el desarrollo de aplicaciones modernas.

¿Por qué usar Emotion?​

Emotion es una excelente herramienta porque combina lo mejor de ambos mundos: la simplicidad de escribir CSS con la potencia de JavaScript. Aquí te dejo algunas razones para considerar Emotion en tus proyectos:

  1. Estilos Dinámicos: Puedes cambiar los estilos en función del estado o las props de un componente.
  2. Mejor Rendimiento: Genera clases optimizadas y utiliza el concepto de "CSS-in-JS" para reducir la cantidad de CSS cargado.
  3. Compatibilidad: Emotion funciona perfectamente con cualquier sistema de diseño o framework de UI.
  4. Facilidad de Uso: Con una sintaxis amigable y componentes fáciles de escribir, es ideal para proyectos de cualquier tamaño.

Usando Emotion en un Componente React​

Para empezar a usar Emotion en React, primero debes instalar la librería en tu proyecto. Puedes hacerlo con el siguiente comando:

npm install @emotion/react

Una vez instalada, puedes comenzar a aplicar estilos a tus componentes. Aquí te muestro cómo:

Ejemplo 1: Estilos Básicos en un Componente​

/** @jsxImportSource @emotion/react */
import { css } from '@emotion/react';

// Definimos un estilo básico para un botón
const estiloBoton = css`
background-color: #6200ea;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
&:hover {
background-color: #3700b3;
}
`;

function Boton() {
return (
// Aplicamos el estilo usando la sintaxis de Emotion
<button css={estiloBoton}>
Haz clic aquí
</button>
);
}

export default Boton;

Explicación del Código​

  • css: Esta función se importa de @emotion/react y se utiliza para definir estilos CSS como si estuvieras escribiéndolos en un archivo CSS, pero directamente dentro del archivo JS.
  • @jsxImportSource @emotion/react: Esta línea es necesaria para que Emotion funcione correctamente con la sintaxis de JSX.
  • &:hover: Define un estilo que se aplicará cuando el usuario pase el cursor sobre el botón.

Ejemplo 2: Estilos Dinámicos con Props​

/** @jsxImportSource @emotion/react */
import { css } from '@emotion/react';

function Boton({ esPrimario }) {
return (
<button
css={css`
background-color: ${esPrimario ? '#6200ea' : '#03dac6'};
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
&:hover {
background-color: ${esPrimario ? '#3700b3' : '#018786'};
}
`}
>
{esPrimario ? 'Botón Primario' : 'Botón Secundario'}
</button>
);
}

export default Boton;

Explicación del Código​

  • esPrimario: Es una prop que decide si el botón debe ser primario (con un color púrpura) o secundario (con un color verde).
  • Interpolación de Estilos: Usamos ${} dentro del css para aplicar estilos de manera condicional basados en la prop esPrimario.

Integración con Temas​

Emotion también permite trabajar con temas, lo que facilita la gestión de estilos globales en aplicaciones grandes. Aquí un pequeño ejemplo:

/** @jsxImportSource @emotion/react */
import { ThemeProvider } from '@emotion/react';

const tema = {
colores: {
primario: '#6200ea',
secundario: '#03dac6',
},
tipografia: {
tamaño: '16px',
},
};

function Boton() {
return (
<ThemeProvider theme={tema}>
<button
css={(theme) => css`
background-color: ${theme.colores.primario};
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: ${theme.tipografia.tamaño};
&:hover {
background-color: ${theme.colores.secundario};
}
`}
>
Botón Temático
</button>
</ThemeProvider>
);
}

export default Boton;

Explicación del Código​

  • ThemeProvider: Envuelve el componente y proporciona el tema definido a todos los componentes hijos.
  • theme: Es el objeto que contiene los valores de colores, tipografías, y otros estilos que pueden ser reutilizados en diferentes componentes.

Más información​

  • CSS-in-JS
  • Optimización de rendimiento en React
  • Gestión de temas en aplicaciones React
  • Estilización dinámica en componentes de React

Resumen​

Emotion es una herramienta poderosa para aplicar estilos en React de manera eficiente y dinámica. Permite escribir CSS directamente dentro de tus componentes usando JavaScript, lo que facilita la creación de estilos dinámicos y temas reutilizables. Emotion no solo mejora el rendimiento, sino que también proporciona una gran flexibilidad para personalizar la apariencia de tu aplicación, todo mientras mantiene el código limpio y organizado.