Guia Prático: Componentes Reutilizáveis no JavaScript

Criar componentesTags e Elementos: Sintaxe e HierarquiaTags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis. interativos reutilizáveis é um passo fundamental para quem deseja desenvolver aplicações bem estruturadas e escaláveis no JavaScriptIntrodução ao JavaScript e Configuração do AmbienteIntrodução ao JavaScript e Configuração do AmbienteDescubra neste tutorial narrativo como configurar seu ambiente de desenvolvimento e começar a programar em JavaScript de maneira prática e eficiente.. A ideia de componente pode ser compreendida como um “bloco de construção” da sua interface, responsável por um comportamento ou visual específico e que pode ser facilmente inserido em diferentes partes do seu projeto.

Neste tutorial, exploraremos uma abordagem simples para estruturar e criar componentesTags e Elementos: Sintaxe e HierarquiaTags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis. que podem ser instanciados diversas vezes, sempre mantendo suas funcionalidades e manipulando seus próprios estados. Assim, você economiza tempo, garante maior organização do código e evita duplicações.

Conceito de Componentes e Reusabilidade🔗

Um componente no contexto de desenvolvimento web é uma porção de HTMLO que é HTML? Fundamentos, História e Evolução da LinguagemO que é HTML? Fundamentos, História e Evolução da LinguagemDescubra a origem e evolução do HTML, entendendo sua importância na estrutura da web e como influenciou o desenvolvimento digital moderno., CSSO que é CSS?O que é CSS?Descubra como o CSS transforma a aparência das páginas web, separando conteúdo de design para melhor organização e flexibilidade. e JavaScriptIntrodução ao JavaScript e Configuração do AmbienteIntrodução ao JavaScript e Configuração do AmbienteDescubra neste tutorial narrativo como configurar seu ambiente de desenvolvimento e começar a programar em JavaScript de maneira prática e eficiente. que trabalha em conjunto para fornecer uma funcionalidade específica a um aplicativo. Em vez de espalhar o mesmo código por várias seções do seu projeto, um componente reutilizável oferece:

1. Isolamento: cada componente controla sua própria lógica e estiloRelação entre HTML e CSSRelação entre HTML e CSSDescubra como HTML e CSS trabalham juntos para criar páginas web esteticamente agradáveis e bem estruturadas, facilitando a manutenção e o desempenho..

2. Facilidade de manutenção: atualizações podem ser feitas em um só lugar, propagando para todos os locais onde o componente é usado.

3. Consistência visual e funcional: cada instância do componente segue as mesmas especificações e comportamentos.

Estruturando um Componente Básico🔗

Antes de tudo, precisamos organizar a ideia do que será o componente e como ele será utilizado dentro de nosso projeto. Suponha que queiramos criar um simples botão interativo com estado ligado e desligado. Nosso objetivo é permitir inserir esse botão em diversos pontos da página ou em diferentes projetos, sem necessidade de reescrita.

Elementos Fundamentais

A forma mais direta de criar um componente reutilizável é encapsular toda a lógica em uma função ou classe JavaScriptIntrodução ao JavaScript e Configuração do AmbienteIntrodução ao JavaScript e Configuração do AmbienteDescubra neste tutorial narrativo como configurar seu ambiente de desenvolvimento e começar a programar em JavaScript de maneira prática e eficiente.. Veja um esboço inicial em forma de função:

function createToggleButton(labelOn, labelOff) {
  // Cria elementos do DOM
  const buttonElement = document.createElement('button');
  // Inicia o estado
  let isOn = false;
  // Define o texto inicial
  buttonElement.textContent = labelOff;
  // Adiciona comportamento ao clique
  buttonElement.addEventListener('click', () => {
    isOn = !isOn;
    buttonElement.textContent = isOn ? labelOn : labelOff;
  });
  // Retorna o botão para que possamos anexá-lo ao DOM
  return buttonElement;
}

Nesse snippet, note como cada botão guarda seu próprio estado (isOn), sendo então independente de outros botões.

Inserindo o Componente na Página🔗

Para usar esse componente, basta instanciá-lo e anexá-lo a algum elementoTags e Elementos: Sintaxe e HierarquiaTags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis. do DOM:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Exemplo de Componente Reutilizável</title>
</head>
<body>
  <div id="container"></div>
  <script>
    // Função createToggleButton definida aqui ou importada de outro arquivo
    function createToggleButton(labelOn, labelOff) {
      const buttonElement = document.createElement('button');
      let isOn = false;
      buttonElement.textContent = labelOff;
      buttonElement.addEventListener('click', () => {
        isOn = !isOn;
        buttonElement.textContent = isOn ? labelOn : labelOff;
      });
      return buttonElement;
    }
    // Uso do componente
    const container = document.getElementById('container');
    const toggle1 = createToggleButton("Desligar", "Ligar");
    const toggle2 = createToggleButton("YES", "NO");
    container.appendChild(toggle1);
    container.appendChild(toggle2);
  </script>
</body>
</html>

Observe como cada chamada a createToggleButton gera um novo componente com seu próprio estado e textos personalizados. Assim, geramos quantos “botões de liga/desliga” quisermos, sem depender de código repetido.

Parâmetros e Personalização🔗

Para deixar o componente mais flexível, podemos ampliar a função para receber parâmetrosFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. de configuração. Por exemplo, se quisermos adicionar:

1. ClassesAtributos HTML: `id`, `class`, `style`, `data-*`Atributos HTML: `id`, `class`, `style`, `data-*`Aprenda a aplicar atributos id, class, style e data-* no HTML para organizar, estilizar e dinamizar sua página com praticidade e eficiência. CSS para estilizar o botão.

2. Texto e ícones que sejam mostrados dependendo do estado.

3. CallbacksCallbacks, Promises e Async/AwaitCallbacks, Promises e Async/AwaitAprenda como aplicar programação assíncrona em JavaScript utilizando callbacks, promises e async/await. Melhore o fluxo do seu código de forma prática. para executar alguma ação quando o botão mudar de estado.

Imagine que desejamos notificar o restante do sistema quando um botão passa para o estado On. Podemos passar um callbackCallbacks, Promises e Async/AwaitCallbacks, Promises e Async/AwaitAprenda como aplicar programação assíncrona em JavaScript utilizando callbacks, promises e async/await. Melhore o fluxo do seu código de forma prática. opcional que será executado após a mudança de estado:

function createToggleButton(options) {
  // Desestrutura objetos caso necessário
  const {
    labelOn = "On",
    labelOff = "Off",
    classOn = "btn-on",
    classOff = "btn-off",
    onToggle = () => {}
  } = options;
  const buttonElement = document.createElement('button');
  let isOn = false;
  // Texto e classe inicial
  buttonElement.textContent = labelOff;
  buttonElement.className = classOff;
  buttonElement.addEventListener('click', () => {
    isOn = !isOn;
    // Alternar texto e classe
    buttonElement.textContent = isOn ? labelOn : labelOff;
    buttonElement.className = isOn ? classOn : classOff;
    // Chamando callback, se existir
    onToggle(isOn);
  });
  return buttonElement;
}

Verifique como esta abordagem melhora a reusabilidade do componente, permitindo diferentes configurações a cada uso:

const toggleButton = createToggleButton({
  labelOn: "Ligado",
  labelOff: "Desligado",
  classOn: "verde",
  classOff: "vermelho",
  onToggle: (estadoAtual) => {
    console.log("Estado do botão:", estadoAtual ? "Ligado" : "Desligado");
  }
});
document.body.appendChild(toggleButton);

Organização e Boas Práticas🔗

Para facilitar a manutenção, recomenda-se separar o componente em seu próprio arquivo, caso o projeto cresça:

Uma tabelaCriando Tabelas: `<table>`, `<tr>`, `<td>`, `<th>`Criando Tabelas: `<table>`, `<tr>`, `<td>`, `<th>`Descubra como montar tabelas HTML com tags básicas. Este tutorial prático ensina o uso de <table> <tr> <td> e <th> para organizar dados de forma eficiente. pode resumir alguns pontos importantes de boas práticas:

Boas Práticas para ComponentesDescrição
Nomear o ComponenteDê nomes que descrevam claramente a funcionalidade (ex.: createToggleButton).
Evitar Dependências DesnecessáriasMantenha o componente independente de bibliotecas externas, a menos que sejam realmente necessárias.
Controlar Estado InternamenteCada componente controla seu próprio estado, tornando cada instância autossuficiente.
Enviar e Receber EventosSe precisar notificar algo ao “mundo externo”, use callbacks ou eventos personalizados.
Estilizar com Classes EstruturadasDefina classes CSS específicas, evitando conflitos de estilos em outras partes da interface.

Exemplos Avançados de Interatividade🔗

ComponentesTags e Elementos: Sintaxe e HierarquiaTags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis. mais sofisticados podem incluir eventos personalizados que outras partes do sistema podem escutar. Por exemplo, podemos disparar um evento toggle enquanto o usuário altera o estado do botão, possibilitando que scripts externos ouçam essa mudança sem depender de callbacksCallbacks, Promises e Async/AwaitCallbacks, Promises e Async/AwaitAprenda como aplicar programação assíncrona em JavaScript utilizando callbacks, promises e async/await. Melhore o fluxo do seu código de forma prática.:

function createToggleButtonCustomEvent({ labelOn, labelOff }) {
  const buttonElement = document.createElement('button');
  let isOn = false;
  buttonElement.textContent = labelOff;
  buttonElement.addEventListener('click', () => {
    isOn = !isOn;
    buttonElement.textContent = isOn ? labelOn : labelOff;
    // Dispara evento customizado
    const toggleEvent = new CustomEvent('toggle', {
      detail: { estado: isOn }
    });
    buttonElement.dispatchEvent(toggleEvent);
  });
  return buttonElement;
}
// Uso do evento
const meuBotao = createToggleButtonCustomEvent({ labelOn: "On", labelOff: "Off" });
document.body.appendChild(meuBotao);
// Escuta o evento do próprio elemento
meuBotao.addEventListener('toggle', (evento) => {
  console.log('Evento toggle disparado. Estado =', evento.detail.estado);
});

Desse modo, o componente pode comunicar ao restante do aplicativo sem depender de chamadas diretas a funçõesFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. externas.

Conclusão🔗

A ideia central na criação de componentesTags e Elementos: Sintaxe e HierarquiaTags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis. interativos reutilizáveis é encapsular:

Ao extrair esse conjunto de ações e comportamentos em uma função ou classeAtributos HTML: `id`, `class`, `style`, `data-*`Atributos HTML: `id`, `class`, `style`, `data-*`Aprenda a aplicar atributos id, class, style e data-* no HTML para organizar, estilizar e dinamizar sua página com praticidade e eficiência., você torna mais simples inserir diversas “cópias” do mesmo componente onde for necessário. Suas interfaces se tornam mais modulares, consistentes e fáceis de manter.

Essa estratégia prepara o terreno para projetos de maior complexidade, pois a mesma lógica se aplica ao uso de frameworks que trabalham em cima de componentesTags e Elementos: Sintaxe e HierarquiaTags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis., trazendo benefícios na organização de layout e no desenvolvimento ágil.

Recomenda-se analisar as necessidades de cada projeto antes de construir componentesTags e Elementos: Sintaxe e HierarquiaTags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis. complexos. Inicie com estruturas simples e, ao longo do tempo, evolua para soluções mais robustas conforme a aplicação cresce.

Resumo Rápido

1. Definir uma função ou classe que retorne o elementoTags e Elementos: Sintaxe e HierarquiaTags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis. DOM do componente.

2. Gerenciar o estado interno do componente para garantir interatividade.

3. Fornecer parâmetrosFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. para personalizar texto, estilos e comportamentos.

4. Separar a criação do componente (lógica) do uso dele (instanciação).

5. Considere eventos customizados para permitir comunicação com o restante do sistema.

Esperamos que, após este tutorial, você esteja mais familiarizado com a construção de componentesTags e Elementos: Sintaxe e HierarquiaTags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis. interativos que podem ser facilmente reaproveitados em diferentes projetos. Esse princípio de modularizaçãoTratamento de Módulos e BundlersTratamento de Módulos e BundlersDescubra como módulos e bundlers revolucionaram o desenvolvimento JavaScript, promovendo organização, performance e escalabilidade em aplicações modernas. será de grande valor no seu percurso de desenvolvimento web, ajudando a criar aplicações limpas, escaláveis e coesas.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo