Vue.js
Renderizando Componentes

/me
William Correa
@wilcorrea




# Agenda
- Cenário
- Web Components
- Ciclo de Vida
- DOM Virtual vs DOM Real
- Renderização
- O jeito Vue de ser
- Javascript ao resgate


# Cenário
- Web Mesozoica
- Web Moderna
- Web Experimental
- Web Components


~ Web Mesozoica
- Ferramentas e linguagem evoluíam lentamente
- JQuery, JQuery UI, Sencha ExtJS / Touch
- Twitter Bootstrap




~ Web Moderna
- MVVM (Presentation Model design)
- AngularJS
- Reatividade


~ Web Moderna
- HTML empoderado
- Sintaxe amigável



~ Web Experimental
- Mithril.js



~ Web Experimental
- Backbone.js


~ Web Components
- HTML Templates
- Custom Elements
- Shadow DOM
- ES Modules



~ Web Components
- Angular
- React (Inferno.js)
- Stencil




~ Web Components
- Vue.js
- <3


~ Pra levar pra casa
- Javascript é invariavelmente retrocompatível
- Abordagens certas para cada problema
- Ferramentas passam, Javascript não

# Web Components
- HTML Templates
- Shadow DOM
- Custom Elements
- ES Modules

~ HTML Templates
- Não são processados com o DOM
- São reusáveis e clonáveis usando Javascripts
- Possibilidade de usar slot


~ Shadow DOM
- Anexa um DOM separado oculto à um elemento
- Abordagens certas para cada problema


~ Custom Elements
- Estende o HTML
- Tags customizadas


~ ES Modules
- Javascript é invariavelmente retrocompatível
- Abordagens certas para cada problema
- Ferramentas passam, Javascript não


~ Pra levar pra casa
- Em pouco tempo o browser dará suporte a WC
- Frontend é um grande lab
- Criar aplicações que possam crescer


# Ciclo de Vida
- Instâncias e componentes
- CDN vs empacotadores
- Hooks básicos
- Hooks especiais
- Comunicação
- Estados locais vs globais


~ Instâncias e componentes
- Manter apenas uma instância por página
- Distribuir a UI entre componentes
- Organização semântica


~ CDN vs empacotadores
- Carregar o Vue diretamente de uma URL
- Processar os documentos com um bundler
- Webpack, browserify



~ Hooks básicos
- hook beforeCreate
- hook created
- el vs template


~ Hooks básicos
- ler o outerHTML do componente
- template vs render



~ Hooks básicos
- hook beforeMount
- hook mounted
- hook beforeUpdate
- hook updated


~ Hooks básicos
- hook beforeDestroy
- hook destroyed


~ Hooks especiais
- hook activated
- hook deactivated



~ Comunicação
- props entram
- events saem


~ Comunicação
- manter a integridade
- usar a reatividade
- modificador .sync
- não emitir referências

~ Comunicação
- inject / provide
- event bus



~ Estados locais vs globais
- props
- data
- computed
- watch


~ Estados locais vs globais
- vuex
- actions
- getters

~ Estados locais vs globais
- centralizar acesso HTTP em serviços
- actions / services


~ Estados locais vs globais


~ Estados locais vs globais


~ Pra levar pra casa
- Não há uma grande variedade de controles à toa
- Cada hook tem seu propósito
- props, data, computed e watch são primordiais
- Evite acoplar seu negócio ao seu componente


# DOM Virtual vs DOM Real
- Converter HTML em render function
- DOM templates vs build


~ Converter HTML em render function
- Regex e algoritmos sempre aprimorados
- https://template-explorer.vuejs.org


~ "script src" vs "build"
- Pode ser usado diretamente no navegador
- Pode ser altamente automatizado e organizado


~ Pra levar pra casa
- O Vue não é opinativo quanto ao seu uso
- Pode ser usado progressivamente
- Quanto mais ferramentas, mais poderoso fica


# Renderização
- String
- Template literal
- X-Templates
- Inline
- JSX (JavaScript XML)
- Single file components (SFC)
- Render functions

~ String


~ Template literal


~ X-Templates


~ Inline Templates


~ JSX (JavaScript XML)



Não é "nativo"
~ Single file components (SFC)


Depende do vue-loader


Usar src nas tags
~ Render functions


~ Pra levar pra casa
- A flexibilidade do Vue é gigante
- Template descartável, componente agnóstico
- A melhor opção depende do seu contexto


# O jeito Vue de ser
- Tudo é render
- v-if
- v-for
- v-bind
- v-on
- v-model
- Diretivas

~ Tudo é render


~ Tudo é render


~ v-if


~ v-for


~ v-bind


~ v-on


~ v-model


~ Diretivas
- https://jsfiddle.net/wilcorrea/wrb27fds/23
- v-show: https://bit.ly/2NymeaP


~ Diretivas


~ Pra levar pra casa
- A sintaxe de template do Vue é ilustrativa
- É possível fazer um app sem escrever HTML
- Vue é Javascript puro, um motor de renderização



# Javascript ao resgate
- Templates são descartáveis
- Componentes são apresentação
- Classes ES2015+
- Componentes dinâmicos
- Juntando tudo
- Outros frameworks

~ Templates são descartáveis
- Use computed ou methods
- Evite testes lógicos
- Crie helpers



~ Componentes são apresentação
- Lógica de interface
- Representação da regra de negócio
- Morte ao this.$http


~ Classes ES2015+
- Sintaxe simplificada


~ Classes ES2015+
- Babel
- Recursos estáticos


~ Classes ES2015+


~ Classes ES2015+


~ Componentes dinâmicos
- Renderiza o componente nomeado pelo is
- Mesmos recursos de um componente hard-coded


~ Juntando tudo


~ Juntando tudo


~ Juntando tudo


~ Juntando tudo


~ Outros frameworks
- https://jsfiddle.net/wilcorrea/xLzztaq0/10


- JSX
~ Pra levar pra casa
- É possível usar Vue sem escrever HTML
- Composições dinâmicas podem ser um plot twist
- Vue simplesmente brilha nesse item


Hora das palmas
Renderizando Componentes
By William Correa
Renderizando Componentes
- 1,026