Pular para conteúdo

Aula 19 - Diretivas Customizadas e Render Functions 🛠️

Objetivo Pedagógico

Objetivo: Criação de diretivas customizadas para manipulação de baixo nível do DOM e construção de componentes dinâmicos via Render Functions com a função h().


📑 1. Fundamentos Teóricos & Análise Técnica

Embora o compilador de templates do Vue atenda a grande maioria das necessidades de desenvolvimento de interfaces, existem cenários avançados em que o controle imperativo do DOM ou a flexibilidade total do JavaScript são indispensáveis. Para esses casos, o Vue oferece Diretivas Customizadas e Render Functions.

  1. Diretivas Customizadas (v-focus, v-click-outside): Mecanismo primário para encapsular manipulação direta de nós DOM nativos com base em ganchos de ciclo de vida (created, mounted, updated, unmounted). São especialmente indicadas para focar inputs automaticamente, gerenciar cliques fora de janelas suspensas (dropdowns) ou integrar bibliotecas de terceiros legadas.
  2. Render Functions com h(): Permitem dispensar o template HTML e escrever componentes diretamente contra o DOM Virtual (vDOM). Utilizando a função de hipertexto h(tag, props, children), o desenvolvedor pode criar componentes dinâmicos onde a própria tag HTML depende de uma propriedade (como um componente genérico <Heading :level="1"> que gera dinamicamente de <h1> a <h6>).

📐 Arquitetura Conceitual & Diagrama de Fluxo

flowchart TD
    Choice{"Complexidade da UI"} -->|Manipulação Pontual de DOM| Directive["Diretiva Customizada (v-custom)<br>Ex: Auto-foco, Click-Outside"]
    Choice -->|Tag Dinâmica / Lógica Extrema| RenderFn["Render Function com h()<br>Ex: h(`h${level}`, slots.default())"]
    Directive --> NativeDOM["Manipula Nó Nativo (el.focus())"]
    RenderFn --> VDOM["Gera Nó Virtual vNode"]
    VDOM --> NativeDOM
    style Choice fill:#e3f2fd,stroke:#1565c0
    style Directive fill:#fff3e0,stroke:#e65100
    style RenderFn fill:#e8f5e9,stroke:#2e7d32

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Ganchos de Diretiva: Controle fino da execução através de mounted(el, binding) e unmounted(el). - Poder Total do JavaScript: As render functions dispensam sintaxes especiais de template (v-if, v-for) em prol de if e array.map() nativos. - Componentes Recursivos: Construção elegante de estruturas em árvore (árvores de pastas, menus multinível). - Desempenho Otimizado: Uso de diretivas pontuais sem introduzir nós extras no grafo de componentes.


🛠️ 2. Implementação Prática em Vue 3 Virtual DOM e Custom Directives

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// dynamic-heading.ts (Render Function e Diretiva Customizada)
import { h, defineComponent, Directive } from 'vue';

// 1. Diretiva Customizada para Auto-Foco
export const vFocus: Directive = {
  mounted(el: HTMLElement) {
    el.focus();
  }
};

// 2. Componente com Render Function (Tag Dinâmica h1..h6)
export const DynamicHeading = defineComponent({
  props: {
    level: { type: Number, default: 1 }
  },
  setup(props, { slots }) {
    return () => h(`h${props.level}`, { class: 'dynamic-heading' }, slots.default?.());
  }
});

💡 Análise Passo a Passo do Código

  1. Diretiva vFocus: O gancho mounted(el) recebe o elemento DOM real assim que ele é inserido no documento e dispara .focus().
  2. Função h(): Gera o nó virtual correspondente à tag calculada h${props.level} sem necessidade de múltiplos v-if.
  3. Slots Funcionais: slots.default?.() executa a renderização do conteúdo filho passado para o cabeçalho.

🎯 3. Próximos Passos & Sequência Didática