Atributos observados y attributeChangedCallback
Reaccione a cambios en los atributos HTML de elementos personalizados
Atributos observados y attributeChangedCallback es una lección gratuita de HTML Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de HTML Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de HTML Academy incluye 4 lecciones en total.
Reacción a los cambios en los atributos
Los elementos HTML exponen su estado mediante atributos. Para reaccionar cuando <my-card name="A"> se convierte en name="B", declare la lista de atributos observados e implemente attributeChangedCallback en la clase.
observedAttributes estático
Declare los atributos que le interesan mediante un getter estático: static get observedAttributes() { return ["name", "open"]; }. Solo los atributos incluidos en esta lista activan la devolución de llamada; los demás se ignoran para mejorar el rendimiento.
class MyCard extends HTMLElement {
static get observedAttributes() { return ["name", "open"]; }
}La firma de la devolución de llamada
attributeChangedCallback(name, oldValue, newValue) se ejecuta cada vez que cambia un atributo observado. Los tres parámetros son cadenas (o null si el atributo no está presente). Úselos para actualizar el estado interno y volver a renderizar.
attributeChangedCallback(name, oldValue, newValue) {
if (oldValue === newValue) return;
if (name === "name") this.render();
if (name === "open") this.toggle(newValue !== null);
}Se ejecuta para los atributos iniciales
La devolución de llamada se ejecuta una vez por cada atributo observado que esté presente cuando se actualiza el elemento. Esto significa que un renderizado en attributeChangedCallback gestiona tanto el renderizado inicial como los posteriores, sin necesidad de una ruta independiente en connectedCallback.
Reflejo entre propiedades y atributos
En el caso de los atributos booleanos, refleje la propiedad en el atributo y viceversa: establecer element.open = true debe establecer el atributo open, y eliminar el atributo debe borrar la propiedad. Esto coincide con el comportamiento de elementos integrados como <details>.
get open() { return this.hasAttribute("open"); }
set open(value) {
if (value) this.setAttribute("open", "");
else this.removeAttribute("open");
}Evite los bucles infinitos
Si attributeChangedCallback establece atributos que observa, puede entrar en un bucle infinito. Añada siempre la protección if (oldValue === newValue) return; al principio de la devolución de llamada y evite cambiar atributos observados desde su interior.
Atributos booleanos
Según la convención de HTML, los atributos booleanos se consideran "establecidos" por su presencia (disabled, open) y "no establecidos" por su ausencia. Su valor se ignora: disabled="false" sigue significando que está deshabilitado. Compruebe su presencia con hasAttribute; nunca compare la cadena.
JSON en los atributos
Los atributos son cadenas. Para pasar datos estructurados, use JSON.stringify en el marcado y parse en attributeChangedCallback: <my-chart data-points='[1,2,3]'>. Para cargas grandes, prefiera pasar los datos mediante una asignación de propiedad en JS.
Comparación con MutationObserver
Podría observar los cambios de atributos con un MutationObserver, pero observedAttributes + attributeChangedCallback es más rápido (no requiere configurar un observador), es declarativo (la lista de nombres observados es visible en la clase) y es el enfoque idiomático para los componentes web.
Rendimiento: agrupe los renderizados
Varios atributos que cambien rápidamente activarían varias devoluciones de llamada y varios renderizados. Agrúpelos con queueMicrotask o requestAnimationFrame para que el renderizado real se ejecute una sola vez por microtarea o fotograma, independientemente de cuántos atributos hayan cambiado.
Error común
Olvidar añadir un atributo a observedAttributes desactiva silenciosamente la devolución de llamada para ese atributo. Si el componente no reacciona a una llamada a setAttribute, lo primero que debe comprobar es la lista estática observedAttributes.
Comprobación de conocimientos
¿Qué ocurre si llama indirectamente a attributeChangedCallback al establecer un atributo observado dentro de la propia devolución de llamada?
Resumen
Declare los atributos que desea controlar mediante el getter estático observedAttributes; attributeChangedCallback(name, oldValue, newValue) se ejecuta para cada cambio, incluido el análisis inicial. Refleje las propiedades en los atributos para representar estados booleanos, evite los bucles infinitos y agrupe los renderizados con requestAnimationFrame para mejorar el rendimiento.
Preguntas frecuentes
¿La lección «Atributos observados y attributeChangedCallback» es gratis?
Sí — el texto completo de «Atributos observados y attributeChangedCallback» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de HTML Academy, actualiza a CoddyKit PRO. El curso de HTML Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Atributos observados y attributeChangedCallback»?
Reaccione a cambios en los atributos HTML de elementos personalizados Practicas HTML Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar HTML Academy?
No se requiere experiencia previa. HTML Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Atributos observados y attributeChangedCallback»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de HTML Academy?
Sí. Cada lección de HTML Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Definir elementos con customElements.define
- Los callbacks connectedCallback y disconnectedCallback
- Atributos observados y attributeChangedCallback
- Extender elementos integrados