Inyección de Datos en Componentes Web Reutilizables
Resumen
¿Cómo completar un componente web para un eCommerce?
¿Alguna vez te has preguntado cómo se diseñan y desarrollan esos atractivos y funcionales componentes en los sitios de eCommerce? Hoy vamos a sumergirnos en la creación de una tarjeta de producto que puede utilizarse en cualquier tienda en línea. Este componente no solo es estéticamente atractivo, también es reutilizable y puede integrarse fácilmente en cualquier catálogo de productos mediante la interacción con un API. Analizaremos cómo diseñar estilos y cómo inyectar datos dinámicos en nuestro componente, todo a través de un enfoque práctico.
¿Cómo integrar los estilos en el componente?
Comencemos con los estilos. Aunque en este curso no nos adentraremos en profundidad en CSS, es crucial entender los cambios visuales que podemos lograr. Aquí tienes algunos puntos clave sobre cómo implementar estilos básicos:
Márgenes y paddings: Ajusta los márgenes y paddings globales para neutralizar los valores por defecto que puedan afectar a tu diseño.
Flexbox en el body: Utilizar display: flex facilita la alineación y distribución de tus elementos en el layout.
Estilos globales: Implementa estilos globales para elementos recurrentes usando clases y selects CSS como el body.
Variables CSS: Implementar variables para colores y fondos permite que tu aplicación sea más dinámica y fácil de personalizar.
¿Cómo popular dinámicamente el componente con datos?
El dinamismo en una aplicación web es esencial, especialmente cuando trabajamos con datos que provienen de un API. Para esto, vamos a necesitar trabajar con atributos que llenarán de contenido nuestra tarjeta de producto. Veamos cómo hacerlo:
Definición de atributos: Estableceremos los atributos en nuestro componente con el método static get. Algunos de los atributos que podemos definir son:
img
title
price
description
collection
Método attributeChangedCallback: Este método es fundamental para detectar los cambios en los atributos definidos y actualizar los elementos del DOM cuando ocurren. Recibe tres parámetros: el nombre del atributo, el valor antiguo, y el nuevo valor.
Interpolación de variables: Dentro de nuestro HTML, usaremos la interpolación para colocar valores dinámicos en el template. Por ejemplo:
<imgsrc="${this.img}"alt="zapatos deportivos para correr color azul"><h2>${this.title} <span>${this.collection}</span></h2>
¿Cómo personalizar el fondo según el producto?
Para dar un toque final, podemos hacer que el color de fondo del componente coincida con los productos mostrados. Utilizamos variables CSS para modificar el background, permitiendo que el componente sea responsive y se adapte visualmente según el producto.
Cambiar el fondo: Usamos una variable práctica primary-background para ajustar el color. Puedes modificar este valor basándote en la información recibida del API, haciendo que cada producto tenga su propia identidad visual:
:host{--primary-background:green;}
Al finalizar estos pasos, habrás adquirido la capacidad de crear componentes personalizados y dinámicos para tu sitio de eCommerce. ¡Sigue experimentando y mejorando tus habilidades! Con el conocimiento que tienes ahora, puedes crear componentes más complejos y deslumbrantes. Además, en clase te dejaremos algunos retos para seguir practicando. ¡Continuemos este emocionante viaje de aprendizaje!
Si observaron la consola, lo más probable es que les haya salido este error
UncaughtRangeError:Maximum call stack size exceeded.atHTMLElement.attributeChangedCallback(product-card.js:16) at HTMLElement.attributeChangedCallback(product-card.js:16) at HTMLElement.attributeChangedCallback(product-card.js:16) at HTMLElement.attributeChangedCallback(product-card.js:16) at HTMLElement.attributeChangedCallback(product-card.js:16) at HTMLElement.attributeChangedCallback(product-card.js:16) at HTMLElement.attributeChangedCallback(product-card.js:16) at HTMLElement.attributeChangedCallback(product-card.js:16) at HTMLElement.attributeChangedCallback(product-card.js:16) at HTMLElement.attributeChangedCallback(product-card.js:16)
Esto se debe a que estamos utilizando el atributo "title" y este ya es un atributo nativo de HTML por lo que la solución es simplemente cambiar el nombre de nuestro atributo.
Hace varias clases me salió el mismo error. La manera en que yo lo solucione fue agregar una condición extra al if
Cuando usar slot y cuando suar atributos?? Por qué aquí solamente se agregaron atributos más no slots??
Los atributos se usan cuando el componente es sencillo y lo que quieres enviar es simple, como texto, rutas, etc..
Los slots tienen la versatilidad que se puede enviar de todo incluso html u otro componente haciendo más flexible aún nuestro componente.
Les comparto el código del componente al inicio de la clase:
Como en nuestro componente de proyecto solo estamos recibiendo las propiedades desde el html, lo hice de una manera mas simple, pero igualmente valida, simplemente obteniendo los atributos de la data que necesito en el constructor, y funciona bien para el resultado que esperamos.
Para los elementos que están en el componente y que necesitamos que realicen alguna acción ¿como es la manera optima de aplicar los eventos a los componentes?
Que genial 😃
Creo que seria mejor si lo hiciéramos desde 0
Hey!, al momento de utilizar atributos nativos de html para nuestro componente se suele generar este error en la consola como lo muestran algunos compañeros en otros comentarios
si bien se puede cambiar simplemente el atributo por otro En este enlace pueden encontrar algunas explicaciones de porque se genera ese problema y como solucionarlo ;)
Deje el link de la rama equivocada este es el bueno Nike
se pueden actualizar los atributos desde js?
Buenas ¿Cómo comunicarse entre componentes?, es decir quiero poder cambiar funcionalidades de un componente a través de lo que pase en otro.
Por ejemplo tengo un componente 'formulario', y un componente pages, que através de un enrutador te muestra [home, game, scores] estamos en el componente pages/home, que contiene al componente 'formulario' cuando rellena un nombre y es validado al enviar, te deja acceder a pages/game.
Hola Juan, en general para la comunicación entre componentes pueden existir muchas estrategias.
Eventualmente, estos componentes pueden importar funciones, clases y utilizar otros componentes. Entonces se puede generar muchas formas de comunicación entre componentes
Te invito a investigar como lo hacen diferentes frameworks y como existen diversas formas de hacerlo.
¿Te interesaría un curso para profundizar sobre Web Componentes con JavaScript?
Hola, no se si te sirva pero para que comuniques tus componentes puedes usar el 'dispatchEvent()' donde lo uses será el componente desde el cual dispares el evento, el cual va a escuchar el padre del mismo y en este podrás hacer una función para manejar que se hará.
como hago para que el componente sea dinamico? por que la informacion que se agrega es estatica en el html
Hola!
Deberías utilizar funciones con js para agregar dinamismo, exactamente qué es lo que quieres lograr?
¿En cuál curso puedo aprender como enlazar mi base de datos con los atributos de mi web component?