# Instâncias de Aplicação e de Componentes
# Criando uma Instância de Aplicação
Toda aplicação Vue começa com a criação de uma nova instância com a função createApp
:
const app = Vue.createApp({
/* opções */
})
2
3
A instância da aplicação é usada para registrar 'globais' que podem ser usados pelos componentes dentro da aplicação. Discutiremos isso em detalhes posteriormente no guia, mas como um exemplo rápido:
const app = Vue.createApp({})
app.component('SearchInput', SearchInputComponent)
app.directive('focus', FocusDirective)
app.use(LocalePlugin)
2
3
4
A maioria dos métodos expostos pela instância da aplicação retornam a própria instância, permitindo encadeamentos:
Vue.createApp({})
.component('SearchInput', SearchInputComponent)
.directive('focus', FocusDirective)
.use(LocalePlugin)
2
3
4
Você pode navegar na API completa da aplicação na documentação da API.
# O Componente Raiz
As opções passadas para createApp
são usadas para configurar o componente raiz. Esse componente é usado como ponto de partida para renderização quando nós montamos a aplicação.
Uma aplicação precisa ser montada em um elemento DOM. Por exemplo, se quisermos montar um aplicação Vue em <div id="app"></div>
, devemos passar #app
:
const RootComponent = {
/* opções */
}
const app = Vue.createApp(RootComponent)
const vm = app.mount('#app')
2
3
4
5
Diferente da maioria dos métodos de aplicação, mount
não retorna uma instância da aplicação. Em vez disso, retorna a instância do componente raiz.
Embora não seja estritamente associado ao padrão MVVM (opens new window), o design do Vue foi parcialmente inspirado por ele. Como convenção, costumamos usar a variável vm
(abreviação de ViewModel) para se referir à uma instância de componente.
Embora todos os exemplos nesta página precisem apenas de um único componente, a maioria das aplicações reais são organizadas em uma árvore de componentes reutilizáveis aninhados. Por exemplo, a árvore de componentes de uma aplicação Todo pode ter a seguinte aparência:
Componente Raiz
└─ TodoList
├─ TodoItem
│ ├─ DeleteTodoButton
│ └─ EditTodoButton
└─ TodoListFooter
├─ ClearTodosButton
└─ TodoListStatistics
2
3
4
5
6
7
8
Cada componente terá sua própria instância de componente, vm
. Para alguns componentes, como TodoItem
, provavelmente haverão várias instâncias renderizadas a qualquer momento. Todas as instâncias de componente nesta aplicação irão compartilhar a mesma instância de aplicação.
Falaremos sobre o sistema de componentes em detalhes depois. Por enquanto, apenas esteja ciente de que o componente raiz não é realmente diferente de qualquer outro componente. As opções de configuração são as mesmas, assim como o comportamento da instância do componente correspondente.
# Propriedades da Instância do Componente
No início do guia conhecemos as propriedades do data
. Propriedades definidas no data
são expostas por meio da instância do componente:
const app = Vue.createApp({
data() {
return { count: 4 }
}
})
const vm = app.mount('#app')
console.log(vm.count) // => 4
2
3
4
5
6
7
8
9
Existem várias outras opções de componentes que adicionam propriedades definidas pelo usuário à instância do componente, tais como methods
, props
, computed
, inject
e setup
. Discutiremos cada um deles em detalhes posteriormente no guia. Todas as propriedades da instância do componente, não importa como sejam definidas, estarão acessíveis no template do componente.
O Vue também expõe algumas propriedades integradas por meio da instância do componente, tais como $attrs
e $emit
. Todas essas propriedades têm um prefixo $
para evitar conflito com nomes de propriedade definidas pelo usuário.
# Gatilhos de Ciclo de Vida
Cada instância do componente passa por uma série de etapas de inicialização quando é criada - por exemplo, é preciso configurar a observação de dados, compilar o template, montar a instância no DOM, e atualizar o DOM quando os dados mudam. Ao longo desse caminho, também executa funções chamadas gatilhos de ciclo de vida, dando aos usuários a oportunidade de adicionar seu próprio código em estágios específicos.
Por exemplo, o gatilho created
pode ser utilizado para executar código logo após a instância ser criada:
Vue.createApp({
data() {
return { count: 1 }
},
created() {
// `this` aponta para a instância vm
console.log('count is: ' + this.count) // => "count is: 1"
}
})
2
3
4
5
6
7
8
9
Existem também outros gatilhos que serão chamados em diferentes etapas do ciclo de vida da instância, como mounted
, updated
, e unmounted
. Todos os gatilhos de ciclo de vida são executados com seu contexto this
apontando para a atual instância ativa que o invoca.
Nota
Não utilize arrow functions (opens new window) em propriedades de opções ou callback, como em created: () => console.log(this.a)
ou vm.$watch('a', newValue => this.myMethod())
. Como as arrow functions não possuem um this
,this
será tratado como qualquer outra variável e lexicalmente pesquisada através de escopos parentais até ser encontrada, frequentemente resultando em erros como Uncaught TypeError: Cannot read property of undefined
ou Uncaught TypeError: this.myMethod is not a function
.
# Diagrama do Ciclo de Vida
Abaixo está um diagrama para o ciclo de vida da instância. Neste momento você não precisa entender completamente tudo o que está acontecendo, mas conforme você for aprendendo e construindo mais coisas, este diagrama se tornará uma referência útil.