Manejo de Atributos en Componentes Web con JavaScript
Resumen
¿Cómo manejar datos dinámicos mediante atributos en componentes web?
A lo largo del aprendizaje sobre el manejo de datos en componentes web, hemos explorado distintas técnicas para gestionar información fuera de sus elementos estándar. En esta lección, nos adentraremos en el uso de atributos para manejar datos dinámicos. Esta metodología se basa en que, al tratar los componentes web como etiquetas HTML, podemos usar atributos para pasar información que luego se renderiza internamente, enriqueciendo así la interacción y funcionalidad de las aplicaciones.
¿Qué son los atributos en HTML?
Los atributos en HTML son especificaciones que permiten modificar el comportamiento y estilo de las etiquetas. Ejemplos comunes incluyen class, id, y atributos de medios como src para imágenes. En el contexto de componentes web, podemos definir atributos personalizados que faciliten la transferencia de datos.
Pasos para implementar atributos en componentes web
Para integrar la funcionalidad de atributos en componentes web, sigue estos pasos:
Quitar elementos slot: Comienza eliminando las etiquetas de slot en los elementos como párrafos o encabezados, dejándolos vacíos para recibir datos posteriormente.
Añadir elementos multimedia: Integra etiquetas para imágenes o videos, definiendo sus fuentes o src.
Crear variables con getAttribute: Dentro del elemento JavaScript del componente, crea variables para cada atributo que deseas manejar, utilizando getAttribute para obtener el valor.
Definir valores en el HTML: En la instancia del componente en el HTML, establece los atributos creados con sus correspondientes valores.
<my-componenttitle="Este es el título"paragraph="Este es el párrafo"img="logo.png"></my-component>
Ventajas del uso de atributos en componentes web
El uso de atributos en componentes web presenta múltiples beneficios:
Flexibilidad: Facilita el manejo de datos y personalización de instancias del componente sin modificar el código interno.
Descentralización del control: Externaliza el manipuleo y ajuste de componentes, permitiendo que distintos usuarios o desarrolladores integren componentes en diversas aplicaciones.
Actualización dinámica: Promueve una actualización fluida del contenido y estilo, notando que cualquier cambio en los atributos se refleja automáticamente sin intervención manual.
¿Cómo evolucionar hacia un control más avanzado?
Aunque configurar atributos en componentes web es sencillo y efectivo, existe una forma aún más robusta para manejar cambios: el ciclo de vida attributeChangedCallback. Este ciclo monitorea cambios en los atributos, permitiendo reacciones adecuadas y actualizaciones en tiempo real. En futuras clases, nos centraremos en este aspecto para dotar a tus componentes de una capacidad de gestión de cambios aún más precisa y eficiente. ¡Sigue aprendiendo y expandiendo tus habilidades en desarrollo web!
Además de que el hecho de colocar etiquetas diferentes en el archivo JS y el HTML pueden causar conflictos en nuestra página. Para evitar que se pisen las etiquetas es mejor utilizar atributos
MY NOTES FOR ATTRIBUTES :D
En esta clase veremos formas de manejar datos dinámicos por fuera de nuestro componente.
html
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><h3>Hola mundo again</h3><!-- Establecemos los atributos que vamos a obtener del componente--><my-elementtitle="soy un titulo"parrafo="soy el texto del parrafo"img="https://web-components-resources.appspot.com/static/logo.svg"></my-element><scripttype="module"src="./my-elements.js"></script></body></html>
js
classmyElementextendsHTMLElement{constructor(){super();this.attachShadow({mode:"open"});//inicializamos unas variable para generar el match y obtener//El atributo de la etiquetathis.title=this.getAttribute('title');this.parrafo=this.getAttribute('parrafo');this.img=this.getAttribute('img');}getTemplate(){const template =document.createElement('template');//Quitamos los slots para probar los otros metodos de datos dinamicos//Utilizamos las variables que inicializamos para obtener los atributos//De las etiquetas dentro del template template.innerHTML=`<section><h3>${this.title}</h3><div><p>${this.parrafo}</p><imgsrc="${this.img}"></div></section> ${this.getStyles()}
`;return template
}getStyles(){return` <style>
h2{
color:red;
}
</style>
`}render(){this.shadowRoot.appendChild(this.getTemplate().content.cloneNode(true))}connectedCallback(){this.render();}}customElements.define('my-element', myElement);
De hecho es algo que se menciona en el módulo de este curso "Introducción a los Web Components", los web components pueden servir en cualquier página web ya que son características nativas del navegador, sin importar si usas algún framework o no. El entender cómo funcionan los componentes sí te va a facilitar a aprender Vue o React, pero, en efecto, estos sustituyen los frameworks.
Alguieb que me pueda explicar por qué solo sirve el atributo img con la imagen del directorio web del profesor y no me sirve con ningún otro directorio ni siquiera metiendo imágenes desde mis documentos locales???
Hice un pequeño cambio en el nombre del atributo de imagen, para probar que el nombre del atributo en el index.html no necesariamente debe ser el mismo nombre que el utilizado dentro del my-element.js, lo importante es que este mapeado.
Pero seguro que las buenas prácticas indican que deben llamarse igual.
Crearemos nuestros propios atributos en JS para colocarlos en la etiqueta HTML. Así mandamos información de manera sencilla.
<my-elementtitle="Soy un título :D"parrafo="Soy el texto del párrafo"img="https://avatars3.githubusercontent.com/u/1905708?s=280&v=4"></my-element>
classmyElementextendsHTMLElement{constructor(){super();//* Obtenemos acceso a todos los elementos y métodos de la clase que extendemos (heredamos)this.attachShadow({mode:'open'});//*Casi siempre todos los componentes tiene que venir en modo abierto.this.title=this.getAttribute('title');//*Estos son los atributos que incluiremos en la etiqueta HTMLthis.parrafo=this.getAttribute('parrafo');this.img=this.getAttribute('img');}getTemplate(){//*Esto será puro HTMLconst template =document.createElement('template'); template.innerHTML=`<section><h3>${this.title}</h3><div><p>${this.parrafo}</p><imgsrc="${this.img}}"/></div></section>${this.getStyles()}<!---Aplicamos los estilos--->`;return template;}
Los atributos permiten pasar datos desde el HTML hacia el componente de forma dinámica, convirtiendo a tu etiqueta personalizada en una interfaz configurable.
Concepto Clave
Al igual que etiquetas estándar (como <img> con src), tus componentes pueden recibir valores a través de atributos definidos en el HTML, los cuales son capturados mediante JavaScript para renderizarse dentro del Shadow DOM.
Implementación Técnica
Captura de datos: Se utiliza el método this.getAttribute('nombre-del-atributo') dentro del constructor del componente para extraer el valor definido en la etiqueta.
Inyección: Una vez almacenados en variables (ej. this.title), estos valores se inyectan en el template (usando template literals) para actualizar el DOM interno.
Flexibilidad: Esta técnica permite configurar títulos, párrafos o rutas de imágenes directamente desde la declaración del componente en el HTML.
En general, no es una buena práctica y en algunos IDE's si no que todos, te marcarán un error. El utilizar palabras reservadas en otra cosa que no sea para lo que ya están definidas.
Porque no esta creando variables, esta creando atributos de la clase myElement, por eso le pone el **this.**nombreDeEjemplo, es un atributo y es la nomenclatura usada dentro de las clases para crearlos, probablemente ya lo tengas claro porque han pasado 4 meses xD, pero por si alguien mas no entendía le recomiendo repasar clases previas donde se trate este tema
El type="module" lo añadimos cuando queremos especificar que el archivo es un módulo JS, los módulos son archivos JS que pueden utilizar variables y funciones de otros archivos (import/export).
En este caso si va a funcionar ya que solo tenemos un script y no estamos importando/exportando nada.
Si gustas leer más al respecto te dejo este enlace a un artículo bastante corto y sencillo de UsefulAngle o esta lectura que es un poquito más larga y más profunda así que más interesante :D
Para obtener el valor de un atributo en tu componente web, utiliza el método getAttribute dentro de la clase de tu componente. Primero, define el atributo en tu HTML al instanciar el componente. Luego, en el constructor de tu componente, accede al atributo con this.getAttribute('nombreDelAtributo').
Por ejemplo, si tienes un atributo title, lo obtendrías así:
Hola, como me recomiendan debuggear, como debbuguean ustedes?, yo suelo preguntarle a una ia en donde esta el error. pero puede llegar a ser algo frustrante y creo que deberia tener otras herramientas para hacerlo, puesto que en la mayoria de casos de este curso no me da ningun error en la consola del navegador, simplemente lo que estoy esperando que se renderice en la pantalla no aparece por ningun lado.
Desde la devTools hay una pestaña llamada source que es donde se cargara tu archivo .js. Desde ese archivo puede marcar los breakpoints para ir debuggeando. Espero que te haya servido. Un saludo.