DEV Community

Cover image for Custom Elements Unleashed: Dominando customElements.define() e .get() como um Jedi do Front-end!
<deMGoncalves />
<deMGoncalves />

Posted on • Updated on

Custom Elements Unleashed: Dominando customElements.define() e .get() como um Jedi do Front-end!

E aí, galera dev! Prontos pra desvendar os segredos do universo dos Custom Elements? Hoje vamos mergulhar fundo nos poderes de customElements.define() e customElements.get() - as armas secretas que todo Jedi do front-end precisa dominar!

🛠️ customElements.define(): Criando seu próprio Pokémon... quer dizer, Elemento!

Imagina que você é um cientista maluco do front-end e quer criar sua própria criatura HTML. É aí que entra o customElements.define(). Ele é tipo aquela máquina de clonagem do Mewtwo, só que pra elementos web!

class ElementoTopzera extends HTMLElement {
  constructor() {
    super();
    this.innerHTML = `<p>Eu sou incrível e customizado!</p>`;
  }
}

customElements.define('elemento-topzera', ElementoTopzera);
Enter fullscreen mode Exit fullscreen mode

Agora você pode usar seu elemento como se fosse nativo do HTML:

<elemento-topzera></elemento-topzera>
Enter fullscreen mode Exit fullscreen mode

BOOM! 🎆 Você acabou de criar vida... no DOM!

🧙‍♂️ Exemplos mágicos pra impressionar seus amigos devs

  1. O Botão Contador Imagine um botão que conta quantas vezes foi clicado. É tipo um scorecard pra sua paciência em debugar!
class BotaoContador extends HTMLElement {
  constructor() {
    super();
    this.count = 0;
    this.innerHTML = `
      <button>Cliques: <span>0</span></button>
    `;
    this.addEventListener('click', () => {
      this.count++;
      this.querySelector('span').textContent = this.count;
    });
  }
}

customElements.define('botao-contador', BotaoContador);
Enter fullscreen mode Exit fullscreen mode
  1. O Card de Perfil Um card de perfil que é mais customizável que um personagem de RPG!
class CardPerfil extends HTMLElement {
  constructor() {
    super();
    const nome = this.getAttribute('nome') || 'Dev Anônimo';
    const skill = this.getAttribute('skill') || 'Café++';

    this.innerHTML = `
      <div style="border: 2px solid #333; padding: 10px; margin: 10px;">
        <h2>${nome}</h2>
        <p>Skill Suprema: ${skill}</p>
      </div>
    `;
  }
}

customElements.define('card-perfil', CardPerfil);
Enter fullscreen mode Exit fullscreen mode

Usa assim, ó:

<card-perfil nome="ZézimDev" skill="Bug Hunter"></card-perfil>
Enter fullscreen mode Exit fullscreen mode

🕵️‍♂️ customElements.get(): O Sherlock Holmes dos Elementos

Agora, e se você quisesse investigar se um elemento customizado já existe? É aí que entra o customElements.get() - o detetive particular do mundo dos Web Components!

const ElementoTopzera = customElements.get('elemento-topzera');

if (ElementoTopzera) {
  console.log('Elemento encontrado! Hora do show!');
  // Faz alguma mágica aqui
} else {
  console.log('404 Elemento Not Found');
}
Enter fullscreen mode Exit fullscreen mode

🕹️ Use cases mais maneiros que um arcade dos anos 80

  1. Lazy Loading de componentes Carregue componentes só quando precisar, economizando mais memória que um programador tentando lembrar onde colocou o ponto e vírgula:
function carregaComponenteSeNecessario(nomeElemento) {
  if (!customElements.get(nomeElemento)) {
    import(`./components/${nomeElemento}.js`)
      .then(() => console.log(`${nomeElemento} carregado e pronto pra ação!`))
      .catch(err => console.error(`Oops, deu ruim ao carregar ${nomeElemento}`, err));
  }
}

carregaComponenteSeNecessario('super-tabela');
Enter fullscreen mode Exit fullscreen mode
  1. Verificação de Segurança Confira se algum elemento maligno não está tentando se passar pelo seu:
function elementoSeguro(nomeElemento) {
  const elemento = customElements.get(nomeElemento);
  if (elemento && elemento.prototype instanceof HTMLElement) {
    console.log('Elemento verificado e aprovado! 👍');
    return true;
  }
  console.warn('Elemento suspeito detectado! 🚨');
  return false;
}

elementoSeguro('botao-contador'); // true, se definido anteriormente
elementoSeguro('virus-malicioso'); // false, espero eu! 😅
Enter fullscreen mode Exit fullscreen mode

🎓 Lições dos Mestres Jedi do Front-end

  1. Nomes Únicos: Escolha nomes de elementos que nem usernames de rede social - únicos e com traço no meio!
  2. Verifique Antes: Sempre use customElements.get() antes de definir, pra não causar uma ruptura no espaço-tempo do DOM.
  3. Estenda com Sabedoria: Quer superpoderes extras? Estenda elementos nativos:
   class SuperButton extends HTMLButtonElement {
     // Código supimpa aqui
   }
   customElements.define('super-button', SuperButton, { extends: 'button' });
Enter fullscreen mode Exit fullscreen mode

🚀 Torne-se o Mestre dos Elementos!

Com customElements.define() e customElements.get(), você tá pronto pra criar uma web mais customizada que setup de streamer! Lembra: com grandes poderes vêm grandes oportunidades de criar componentes incríveis!

Agora é com você! Vai lá criar seus elementos e revolucionar a web! E se travar em algum bug, respira fundo e pensa: "O que o Linus Torvalds faria?" 😎🐧

Quer se aprofundar mais nesse multiverso de possibilidades? Dá uma olhada na documentação oficial de Custom Elements no MDN. É tipo o grimório dos feiticeiros do front-end! 📚✨

E aí, dev? Ficou hypado pra criar seus próprios elementos? Compartilha aí nos comentários que elemento maluco você vai criar! Quem sabe na próxima a gente não faz um <caffe-inator></caffe-inator> que transforma código em café! ☕💻

May the code be with you, sempre! 🚀👨‍💻

Top comments (0)