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.
- 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. - Render Functions com
h(): Permitem dispensar o template HTML e escrever componentes diretamente contra o DOM Virtual (vDOM). Utilizando a função de hipertextoh(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
- Diretiva vFocus: O gancho
mounted(el)recebe o elemento DOM real assim que ele é inserido no documento e dispara.focus(). - Função h(): Gera o nó virtual correspondente à tag calculada
h${props.level}sem necessidade de múltiplosv-if. - 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
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto