Ir para o conteúdo principal
WBC - GovBR-DS
Copiar página como Markdown para IA

Eventos nativos e eventos customizados

Os controles GovBR-DS usam eventos da plataforma quando reproduzem a semântica de um controle HTML. Assim, br-input, br-select, checkbox, radio, switch, slider, datetime, upload e tags selecionáveis podem ser consumidos como elementos nativos: o estado fica no event.target.

Fluxo de um evento pelo Shadow DOM: o consumidor observa a emissão legada e a canônica, com propagação e composição explícitas.

campo.addEventListener('input', (event) => console.log(event.target.value))
checkbox.addEventListener('change', (event) => console.log(event.target.checked))

Qual evento usar

EventoUse quandoEstado
inputo valor muda continuamente, como digitação ou arrastetarget.value, checked, files ou rangeValue
changea edição é confirmada ou uma opção é selecionadao mesmo estado público do host
focus / bluro consumidor precisa reagir à entrada ou saída do controleo host do Web Component; blur não é delegável
focusin / focusoutum contêiner precisa delegar foco de controles descendenteso host e seus descendentes no caminho do evento
click, submit, reset, invalid, togglea interação tem exatamente a semântica HTML correspondentepropriedades do elemento/evento
CustomEventa ação é de domínio, ciclo de vida ou precisa de payload próprioevent.detail

Eventos como brNavigate, pageChange e brWizardComplete continuam customizados: chamar qualquer um deles de change apagaria informação importante e contrariaria a semântica da plataforma.

Vantagens e limites

Eventos nativos reduzem a API que o consumidor precisa aprender, integram-se melhor com formulários e frameworks e permitem ler o estado diretamente do elemento. Eles não servem, porém, para payload arbitrário nem para qualquer mudança visual. Um nome nativo só deve ser usado quando seu significado for o mesmo do HTML.

Em Shadow DOM, bubbles controla a propagação pela árvore e composed permite atravessar o limite da shadow root. A biblioteca redispara no host um único evento composto; ouvir simultaneamente o elemento interno e o host causaria duplicidade. Consulte Event.composed.

Os testes com render() cobrem componentes isolados. Os testes que usam createBrowserTestFixture() simulam uma página com custom elements registrados, Shadow DOM profundo e bundle de distribuição. Por isso os targets E2E, plataforma e acessibilidade dependem de build:dist; executar Vitest diretamente sem esse target pode carregar um dist antigo.

Um evento redisparado no host é sintético: ele preserva o contrato documentado de tipo, flags e estado público, mas não preserva isTrusted nem necessariamente todos os campos específicos da instância nativa interna. Para controles, ouça blur diretamente no componente e use focusout quando precisar de delegação.

Escritas externas são silenciosas

Definir element.value, atualizar ngModel/FormControl, alterar uma prop React/Vue ou restaurar/redefinir um formulário atualiza o componente sem emitir input ou change. Eventos representam interação ou commit, não simples sincronização de estado; isso evita loops de two-way binding.

Frameworks

Angular
<br-input [(ngModel)]="nome"></br-input>
<br-checkbox formControlName="aceite"></br-checkbox>
React
<br-input value={nome} onInput={(event) => setNome(event.currentTarget.value)} />
Vue
<br-input v-model="nome" />

Os wrappers apenas traduzem esses contratos para a convenção do framework; o Web Component continua utilizável sem wrapper.