Cómo usar la emoción para dar estilo en React
Introducción
React te permite aplicar estilo a los componentes directamente con la style
propiedad. En la mayoría de las situaciones, style
basta con usar la propiedad para pasar un objeto de propiedades CSS.
Sin embargo, para situaciones que requieren funciones de estilo más exigentes, emotion
puede proporcionar una solución. emotion
es una biblioteca CSS-in-JS flexible y de alto rendimiento. Acepta cadenas y objetos, admite variables predeterminadas y extendidas y, con un complemento Babel adicional, incluso admite selectores secundarios en línea.
En este artículo, creará una aplicación React que utiliza los paquetes @emotion/react
y @emotion/styled
para diseñar.
Prerrequisitos
Para completar este tutorial, necesitarás:
- Un entorno de desarrollo local para Node.js. Sigue Cómo instalar Node.js y crear un entorno de desarrollo local .
Nota: En este artículo se recomendaban anteriormente los paquetes emotion
y react-emotion
. Ahora, con varias versiones posteriores, @emotion/react
y @emotion/styled
son el enfoque moderno.
Este tutorial fue verificado con Node v15.3.0, npm
v7.4.0, react
v17.0.1, @emotion/react
v11.1.4 y @emotion/styled
v11.0.0.
Paso 1: Configuración del proyecto
Comience a usar create-react-app
para generar una aplicación React y luego instale las dependencias:
- npx create-react-app react-emotion-example
Cambiar al nuevo directorio del proyecto:
- cd react-emotion-example
A continuación, instale @emotion/react
y @emotion/styled
mediante npm
:
- npm install @emotion-react@11.1.4 @emotion/styled@11.0.0
En este punto, tendrás un nuevo proyecto React con @emotion/react
.
Paso 2: Uso del cssaccesorio
emotion
Proporciona una css
propiedad que puede aceptar selectores anidados y consultas de medios. Puede admitir un objeto o una plantilla literal etiquetada.
Abra el App.js
archivo en su editor de código y modifíquelo para usar div
s con la css
propiedad:
fuente/App.js
/** @jsxImportSource @emotion/react */import { css } from '@emotion/react';function App() { return ( div div css={css({ margin: 10, padding: 10, backgroundColor: '#eee', })} This is an example of code`css`/code using an object. /div div css={css` margin: 10px; padding: 10px; background-color: #eee; `} This is an example of code`css`/code using a tagged template literal. /div /div );}export default App;
El primer ejemplo utiliza un objeto con propiedades y valores de objeto de estilo. El segundo ejemplo utiliza un literal de plantilla etiquetado con reglas CSS.
Nota: Dado que este tutorial se basa en Create React App 4, es necesario especificar /** @jsxImportSource @emotion/react */
. Este comentario le indica a Babel que personalice la importación automática del entorno de ejecución.
Ejecute la aplicación:
- npm start
Observa la aplicación en tu navegador. Esto producirá dos div
s idénticos con diez píxeles de margin
, diez píxeles de padding
y color de fondo gris.
Paso 3: Uso de los styledcomponentes
emotion
También admite un styled
componente para crear un elemento y darle estilo. También puede admitir un objeto o una plantilla literal etiquetada.
Consideremos un Heading
componente que genera un h1
elemento de encabezado y acepta propiedades bg
(fondo) y fg
(primer plano) que establecerán background-color
y color
:
const Heading = styled('h1')` background-color: ${props = props.bg}; color: ${props = props.fg};`;
Al utilizar este Heading
componente, podrá pasar valores de color a bg
y fg
:
Heading bg="#008f68" fg="#fae042" Heading with a green background and yellow text./Heading
Vuelva App.js
a visitar su editor de código y modifíquelo para usar styled
componentes:
fuente/App.js
import styled from '@emotion/styled';const Heading = styled('h1')` background-color: ${props = props.bg}; color: ${props = props.fg};`;function App() { return ( div Heading bg="#008f68" fg="#fae042" Heading with a green background and yellow text. /Heading /div );}export default App;
Este código dará como resultado un h1
elemento con un fondo verde y texto amarillo.
A continuación, considere un Subheading
componente que extiende el Heading
componente y cambia el texto representado usando withComponent
:
const Subheading = Heading.withComponent('h2');
En lugar de un h1
encabezado, el componente se representará con un h2
encabezado.
Este código producirá un h2
con colores predeterminados:
Subheading Subheading with default colors./Subheading
Este código producirá un h2
texto verde claro:
Subheading fg="#6db65b" Subheading with light green text./Subheading
Este código producirá un h2
fondo verde claro:
Subheading bg="#6db65b" Subheading with light green background./Subheading
Puede especificar sus estilos como un objeto en lugar de como una cadena:
const Quote = styled('blockquote')(props = ({ fontSize: props.size,}));
E incluso incluye un objeto de estilos predeterminados:
const Cite = styled('cite')( { fontWeight: 100 }, props = ({ fontWeight: props.weight }));
Esto se puede configurar opcionalmente al utilizar el componente.
Este código utiliza el fontWeight
valor predeterminado:
Cite Citation with light text!/Cite
Este código proporciona una weight
propiedad que anula el fontWeight
valor predeterminado:
Cite weight={700} Citation with heavy text!/Cite
Con emotion
puedes especificar !important
estilos:
const Footer = styled('footer')` margin-top: 50px !important;`;
Este código produce un footer
elemento con un tamaño margin-top
de 50 píxeles.
Paso 4: Uso de cssaccesorios y styledcomponentes
Ahora, reflexiona sobre lo que has aprendido en los ejemplos anteriores y utiliza esos conceptos para construir un componente que utilice css
accesorios y styled
componentes.
Vuelva a visitar App.js
su editor de código y reemplace el contenido con las siguientes líneas de código:
fuente/App.js
/** @jsxImportSource @emotion/react */import { css } from '@emotion/react';import styled from '@emotion/styled';const Heading = styled('h1')` background-color: ${props = props.bg}; color: ${props = props.fg};`;const Subheading = Heading.withComponent('h2');const Quote = styled('blockquote')(props = ({ fontSize: props.size}));const Cite = styled('cite')( { fontWeight: 100 }, props = ({ fontWeight: props.weight }));const Footer = styled('footer')` border-top: 1px solid #ccc; color: #ccc; margin-top: 50px !important; padding-top: 20px;`;function App() { return ( div css={css`background: #ddd;`} div css={css({ padding: 10 })} Heading bg="#008f68" fg="#fae042" Quotations /Heading Subheading fg="#6db65b" For React Developers /Subheading Quote size={28} I built this with code`emotion/react`/code and code`emotion/styled`/code! /Quote Cite weight={700}Sammy/Cite FooterShark Facts/Footer /div /div );}export default App;
Este código utiliza componentes css
y accesorios styled
con cadenas y objetos. También utiliza styled
componentes de extensión mediante el uso withComponent
y la anulación styled
de componentes con valores predeterminados.
Conclusión
En este artículo, creó una aplicación React que utiliza los paquetes @emotion/react
y @emotion/styled
para diseñar.
Si desea obtener más información sobre React, eche un vistazo a nuestra serie Cómo codificar en React.js o consulte nuestra página de temas de React para ver ejercicios y proyectos de programación.
Deja una respuesta