No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso Básico de Tailwind 2 y 3

Curso Básico de Tailwind 2 y 3

Ana María Díaz Solorio

Ana María Díaz Solorio

Extracción de componentes a clases para nuestra card

16/29
Recursos

¿Cómo optimizar el diseño de componentes en Tailwind?

Tailwind CSS es un framework que nos permite diseñar interfaces de usuario de una manera sencilla y práctica. En el desarrollo de aplicaciones, es común reutilizar componentes como tarjetas o botones varias veces. Y ahí es donde la "Extracción de componentes" entra en juego. ¿Cómo podemos hacer eso de manera óptima en Tailwind? Aquí te lo explicamos.

¿Qué es la extracción de componentes?

Imagínate escribiendo las mismas clases CSS para cada tarjeta o botón en tu sitio web. Sería tedioso, ¿verdad? La extracción de componentes es una técnica que permite evitar la duplicación de código al reutilizar estilos personalizados de Tailwind para componentes que aparecen más de una vez en nuestra interfaz. Es un enfoque que contribuye al principio de "Utility First" de Tailwind.

¿Cómo funciona la extracción de componentes con apply?

La extracción de componentes en Tailwind se ayuda con la directiva apply. Esta directiva permite agregar estilos predefinidos a una clase CSS personalizada, centralizando los estilos de tus componentes. Por ejemplo, al crear una clase llamada .botón con apply, puedes agregar estilos comunes como colores y tamaños, y luego reutilizar esa clase en varios lugares.

Ejemplo de código:

Supongamos que has creado una tarjeta para mostrar ciertas recomendaciones en tu aplicación. Puedes seguir estos pasos para utilizar la extracción de componentes:

  1. Crea una clase CSS personalizada:

    En tu archivo de estilos (llamémoslo tw.css), agrega tu clase:

    .cards {
        @apply p-4 bg-white rounded shadow-md;
    }
    

    Aquí, @apply utiliza varias utilidades de Tailwind para darle estilo a tu componente.

  2. Aplica la clase en tu HTML:

    En lugar de repetir las clases utilitarias cada vez que alguna tarjeta aparece en tu HTML, ahora puedes usar simplemente:

    <div class="cards">
        <!-- Contenido de la tarjeta -->
    </div>
    

¿Qué hacer si los estilos no se aplican inicialmente?

Si tras seguir todos los pasos anteriores, los estilos no se reflejan inmediatamente en tu navegador, podría deberse a que Tailwind necesita actualizar su archivo de configuración. Aquí está el proceso para resolver este problema:

  • Abre tu terminal e ingresa el siguiente comando para hacer un nuevo build de Tailwind:

    npm run tailwind build
    
  • Espera a que el proceso se complete exitosamente y luego verifica los cambios en tu navegador. Los estilos deberían aplicarse correctamente.

¿Cómo decidir qué clases reutilizar?

La reutilización de clases es esencial para mantener un código ordenado y eficiente. Sin embargo, no todas las clases deben ser extraídas de esta manera. Evalúa cuidadosamente:

  • Usabilidad: ¿Cuántas veces usarás estos estilos en tu proyecto?
  • Flexibilidad: ¿Necesitarás modificar estos estilos frecuentemente?

Utiliza la extracción de componentes para aquellas clases que realmente serán reutilizadas. Recuerda que mantener una estructura clara y modular es clave en un buen diseño de CSS.

Con estas herramientas, puedes mejorar considerablemente la organización y limpieza de tu código Tailwind. ¡Ahora es tu turno de aplicar estos principios en tu proyecto y llevar tu diseño al siguiente nivel! ¡Sigue explorando y ampliando tus conocimientos en Tailwind!

Aportes 18

Preguntas 3

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

La extracción de componentes sirve para no escribir el mismo código en componentes que se utilizarán más de una vez (ej. cards) y poder mantener el principio de utility-first. La extracción de componentes trabaja de la mano con la directiva **@apply**.

Para hacer la extracción de componentes se procede a lo siguiente:

En el archivo src/css/tailwind.css se crean clases cuyo nombre será el adecuado para identificar cierto componente, dentro de la clase se introducirán todos los estilos de Tailwind que se estarán reutilizando haciendo el uso de la directiva @apply seguido de las clases de Tailwind.

@tailwind base;
@tailwind components;
@tailwind utilities;

.Card {
    @apply w-48 h-64 shadow-md rounded-lg
}

Haciendo lo anterior se puede utilizar el nombre de la nueva clase en nuestro archivo HTML, es importante ejecutar el script tw:build para que se efectúen los cambios.

Archivo index.html:

<div class="Card">
	<div class="w-full h-3/5 rounded-t-lg bg-norway bg-cover"></div>
	<div class="w-full h-2/5 bg-secondary rounded-b-lg">
			<p class="text-white font-bold text-xl px-4 py-2">Norway</p>
			<p class="text-white px-4">Paisajes Increíbles</p>
	</div>
</div>

Cabe mencionar que se deben identificar los componentes que se utilizarán más de una vez en el proyecto ya que Tailwind no está diseñado para trabajar todas nuestras clases de esta manera. Tal como lo menciona la documentación:

Si comienzas a usar @apply para todo, básicamente solo estás escribiendo CSS nuevamente y desechando todas las ventajas del flujo de trabajo y mantenimiento que brinda Tailwind, por ejemplo:

  • Tienes que pensar en los nombres de las clases todo el tiempo → Nada te quitará la energía como pensar en el nombre de una clase para algo que no merece ser nombrado.
  • Tienes que saltar entre varios archivos para hacer cambios. Esto es un asesino del flujo de trabajo mucho más grande de lo que piensas antes de ubicar todo junto.
  • Cambiar estilos da más miedo. CSS es global, ¿está seguro de que puedes cambiar el valor de min-width en esa clase sin romper algo en otra parte del sitio?
  • El bundle de CSS será más grande. Uuf.

Si va a usar @apply, úsalo para cosas muy pequeñas y altamente reutilizables, como botones y formularios, e incluso, solo si no estás usando un framework como React, donde un componente sería una mejor opción.

Documentación de la extracción de componentes en Tailwind: https://tailwindcss.com/docs/reusing-styles#extracting-components-and-partials

Se puede utitlizar la bandera “–watch” para que quede siempre haciendo el build mientras se va desarrollando.

npx tailwindcss -i ./src/css/tailwind.css -o ./public/css/tailwind.css --watch

Según la documentación de Tailwind 3, en la sección de Funciones y directivas, debemos agregar estas nuevas clases no como clases directas de CSS, sino extendiendo la capa de componentes de Tailwind con la directiva @layer:

@layer components {
  .card {
    @apply w-48 h-64 shadow-md rounded-lg;
  }
}

Me parece que en las clases de instalación se comentó que se usaría como plugin de PostCSS pero se esta usando como vanilla 🤔
Usándolo como plugin de PostCSS se puede usar nesting para hacer mas fáciles las clases, como en este caso:

Que con una sola clase card también le doy estilo al contenido, y el HTM,L quedaría mas libre de esta forma:

Y queda igual:

Pueden utilizar las directivas de CSS y Tailwind para solo poner el nombre de una clase en el div principal y automáticamente tome los demás cambios:

En el archivo src/css/talwind.css:

@tailwind base;
@tailwind components;
@tailwind utilities;

@layer components {
  .card {
    @apply w-48 h-64 shadow-md rounded-lg;
  }
  .card > div:first-child {
    @apply w-full h-3/5 rounded-t-lg bg-cover;
  }
  .card > div:nth-child(2) {
    @apply w-full h-2/5 bg-secondary rounded-b-lg;
  }
  .card > div:nth-child(2) > p:first-child {
    @apply text-white font-bold text-lg px-4 pt-2;
  }
  .card > div:nth-child(2) > p:nth-child(2) {
    @apply text-white text-base px-4;
  }
}
 

Y se usa así en el html:

 <div class="card">
      <div class="bg-norway"></div>
         <div>
              <p>Noruega</p>
              <p>Paisajes hermosos</p>
         </div>
  </div>
                 	

Existen dos tipos de personas.

  1. Los que ponen todo junto hasta con las llaves
.Card{
}
  1. Los que ponen espacio a cada cosa:
.Card {
}

Increíble cuan diferente es tailwind 3 de sus antecesores en la forma de usarlo. En la version 3 ya no recomienda usar @apply.
Este curso se empieza a desfasar rápido

Evita abstracciones prematuras 🔥🤔

Hagas lo que hagas, no uses “@apply” solo para que las cosas se vean “más limpias”. Sí, las plantillas HTML llenas de clases de Tailwind son un poco feas. Hacer cambios en un proyecto que tiene toneladas de CSS personalizado es peor.
.
Si comienzas a usar “@apply” para todo, básicamente estarás escribiendo CSS de nuevo y desechando todas las ventajas de flujo de trabajo y mantenimiento que te da Tailwind, por ejemplo:
.

  • Tienes que pensar en nombres de clases todo el tiempo: nada te ralentizará o te agotará más que pensar en un nombre de clase para algo que no merece ser nombrado.
  • Tienes que saltar entre varios archivos para hacer cambios: lo cual es un matador de flujo de trabajo mucho más grande de lo que pensarías antes de colocar todo en el mismo lugar.
  • Cambiar estilos es más aterrador: CSS es global, ¿estás seguro de que puedes cambiar el valor de “min-width” en esa clase sin romper algo en otra parte del sitio?
  • Tu paquete CSS será más grande: ¡ouch!

Si vas a usar “@apply”, úsalo para cosas muy pequeñas y altamente reutilizables como botones y controles de formulario, y aun así solo si no estás usando un marco como React donde un componente sería una mejor opción.

🍃 Tailwind nos advierte del uso de @apply con los siguientes puntos.

  • Tienes que pensar en nombres de clase todo el tiempo

  • Tienes que saltar entre varios archivos para hacer cambios

  • Cambiar estilos es más aterrador

  • Tu paquete CSS será más grande

  • Usa @apply solo para cosas muy pequeñas y altamente reutilizables, como botones y controles de formulario

  • Solo usa @apply si no estás utilizando un marco de trabajo como React donde un componente sería una mejor opción.

Esta información la saqué de la documentación oficial. https://tailwindcss.com/docs/reusing-styles

Para poder usar la extracción de componentes a clases, para las demás partes de las cards se me ocurre que podemos hacer esto:

Funciona. Pero que opinan al respecto?

Pequeño aporte para esta clase: ![](https://static.platzi.com/media/user_upload/Extracci%C3%B3n%20de%20componentes%20a%20clases%20para%20nuestra%20card-0a1f2334-4e62-4435-815a-fc0ab4904009.jpg)

Se ve poderoso, pero como dicen, sería como regresar a css xd

Esta funcionalidad está brutal!

Me parece que tail es puro tale. Y el utility-first termina siendo utility-last...

Por lo menos deberian dejar el codigo de git, hay cosas que estan desctualizadas o no se muestra como en el video

Acabo de leer en la documentacion de Tailwind 3 que no se recomienda utilizar @apply, y solamente sugiere utilizarlo para elementos altamente reutilizables como botones y en formularios.

Avoiding premature Abstraction

Si les aparece el rebuilding y el tiempo de la finalización, teclea este comando:

ctrl + c

El reto lo resolví así, me funcionó

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="../public/css/tailwind.css" />
    <title>Gogo Travel</title>
    <link rel="preconnect" href="https://fonts.googleapis.com" />
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
    <link href="https://fonts.googleapis.com/css2?family=Montserrat&display=swap" rel="stylesheet"/>
  </head>
  <body>
      <nav></nav>
      <div id="tabBar"></div>
      <section class="w-full h-screen">
          <div id="home">
            <div class="w-full h-3/4">
              <div class="w-full h-full flex flex-col absolute space-y-96 py-4 items-center">
                <input type="search" name="" id="" class="outline-none p-3 rounded-full shadow-sm" placeholder="San Francisco">
                <button class="w-36 rounded-full text-primary text-xl font-semibold p-4 bg-white shadow-sm">
                  Explorar
                </button>
              </div>
              <div class="w-full h-full">
                <img src="./img/sanFrancisco.jpg" alt="">
              </div>
            </div>
          </div>
          <div class="p-20" id="recomendadas">
            <div class="Card">
              <div class="Image bg-norway"></div>
              <div class="Info bg-secondary">
                <p class="Country">Norway</p>
                <p class="Desc">Paisajes Increíbles</p> 
              </div>
            </div>
          </div>
          <div id="rentas_destacadas"></div>
      </section>
    <footer></footer>
  </body>
</html>

.

/* ./your-css-folder/styles.css */
@tailwind base;
@tailwind components;
@tailwind utilities;

.Card{
    @apply w-48 h-64 shadow-md rounded-lg overflow-hidden
}

.Image{
    @apply w-full h-3/5  bg-cover rounded-t-lg
}

.Info{
    @apply w-full h-2/5  rounded-b-lg
}

.Country{
    @apply text-white font-bold text-lg px-4 py-2
}

.Desc{
    @apply text-white text-base px-4
}