Atributos observados e attributeChangedCallback
Reaja a alterações de atributos HTML em elementos personalizados.
Atributos observados e attributeChangedCallback é uma aula grátis de HTML Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de HTML Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de HTML Academy inclui 4 aulas no total.
Reagindo a mudanças nos atributos
Os elementos HTML expõem seu estado por meio de atributos. Para reagir quando <my-card name="A"> se torna name="B", declare a lista de atributos observados e implemente attributeChangedCallback na classe.
observedAttributes estático
Declare os atributos relevantes por meio de um acessador estático: static get observedAttributes() { return ["name", "open"]; }. Somente os atributos dessa lista acionam o retorno de chamada; os demais são ignorados para melhorar o desempenho.
class MyCard extends HTMLElement {
static get observedAttributes() { return ["name", "open"]; }
}A assinatura do retorno de chamada
attributeChangedCallback(name, oldValue, newValue) é acionado para cada mudança em um atributo observado. Os três parâmetros são cadeias de caracteres, ou nulos se o atributo estiver ausente. Use-os para atualizar o estado interno e executar o render.
attributeChangedCallback(name, oldValue, newValue) {
if (oldValue === newValue) return;
if (name === "name") this.render();
if (name === "open") this.toggle(newValue !== null);
}É acionado para atributos iniciais
O retorno de chamada é acionado uma vez para cada atributo observado que está presente quando o elemento é atualizado. Isso significa que um render em attributeChangedCallback trata tanto dos renders iniciais quanto dos posteriores, sem exigir um caminho separado em connectedCallback.
Reflexão entre propriedade e atributo
Para atributos booleanos, espelhe a propriedade no atributo e vice-versa: definir element.open = true deve definir o atributo open, e remover o atributo deve limpar a propriedade. Esse comportamento corresponde ao de elementos nativos como <details>.
get open() { return this.hasAttribute("open"); }
set open(value) {
if (value) this.setAttribute("open", "");
else this.removeAttribute("open");
}Evite loops infinitos
Se attributeChangedCallback definir atributos que ele observa, o código poderá entrar em um loop infinito. Sempre proteja o código com if (oldValue === newValue) return; no início do retorno de chamada e evite alterar atributos observados dentro dele.
Atributos booleanos
Por convenção do HTML, os atributos booleanos são “definidos” pela presença (disabled, open) e “não definidos” pela ausência. O valor deles é ignorado — disabled="false" ainda significa que o elemento está desativado. Verifique a presença com hasAttribute; nunca compare a cadeia de caracteres.
JSON nos atributos
Os atributos são cadeias de caracteres. Para passar dados estruturados, use JSON.stringify na marcação e faça a análise em attributeChangedCallback: <my-chart data-points='[1,2,3]'>. Para grandes volumes de dados, prefira passá-los por meio da atribuição de uma propriedade JS.
Comparação com MutationObserver
O senhor poderia observar mudanças nos atributos com um MutationObserver, mas observedAttributes + attributeChangedCallback é mais rápido, pois não exige a configuração de um observador, é declarativo, já que a lista de nomes observados fica visível na classe, e segue o padrão dos componentes web.
Desempenho: agrupe os renders
Vários atributos alterados em rápida sucessão acionariam vários retornos de chamada e vários renders. Agrupe-os com queueMicrotask ou requestAnimationFrame para que o render real seja executado uma vez por microtarefa ou quadro, independentemente de quantos atributos tenham mudado.
Armadilha comum
Esquecer de adicionar um atributo a observedAttributes desativa silenciosamente o retorno de chamada para esse atributo. Se o componente não reagir a uma chamada de setAttribute, a primeira coisa a verificar é a lista de observedAttributes estáticos.
Verificação de conhecimentos
O que acontece se o senhor chamar attributeChangedCallback indiretamente ao definir um atributo observado dentro do próprio retorno de chamada?
Resumo
Declare quais atributos devem ser acompanhados por meio do acessador estático observedAttributes; attributeChangedCallback(name, oldValue, newValue) é acionado para cada mudança, inclusive durante a análise inicial. Espelhe propriedades em atributos para estados booleanos, evite loops infinitos e agrupe os renders com requestAnimationFrame para melhorar o desempenho.
Perguntas Frequentes
A aula “Atributos observados e attributeChangedCallback” é grátis?
Sim — o texto completo de “Atributos observados e attributeChangedCallback” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de HTML Academy, atualize para CoddyKit PRO. O curso de HTML Academy inclui 4 aulas no total.
O que vou aprender em “Atributos observados e attributeChangedCallback”?
Reaja a alterações de atributos HTML em elementos personalizados. Você pratica HTML Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar HTML Academy?
Nenhuma experiência prévia é necessária. HTML Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Atributos observados e attributeChangedCallback”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de HTML Academy?
Sim. Cada aula de HTML Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Definindo elementos com customElements.define
- connectedCallback e disconnectedCallback
- Atributos observados e attributeChangedCallback
- Estendendo elementos integrados