# The Vue Instance
After the Vue instance is created, we can mount it, passing a container to mount
method. For example, if we want to mount a Vue application on <div id="app"></div>
, we should pass #app
:
Vue.createApp(/* options */).mount('#app')
Although not strictly associated with the MVVM pattern, Vue’s design was partly inspired by it. As a convention, we often use the variable vm
(short for ViewModel) to refer to our Vue instance.
When you create a Vue instance, you pass in an options object. The majority of this guide describes how you can use these options to create your desired behavior. For reference, you can also browse the full list of options in the .
A Vue application consists of a root Vue instance created with createApp
, optionally organized into a tree of nested, reusable components. For example, a todo app’s component tree might look like this:
Root Instance
└─ TodoList
├─ TodoItem
│ ├─ DeleteTodoButton
│ └─ EditTodoButton
└─ TodoListFooter
└─ TodoListStatistics
We’ll talk about the component system in detail later. For now, just know that all Vue components are also Vue instances, and so accept the same options object (except for a few root-specific options).
When this data changes, the view will re-render. It should be noted that properties in data
are only reactive if they existed when the instance was created. That means if you add a new property, like:
Then changes to b
will not trigger any view updates. If you know you’ll need a property later, but it starts out empty or non-existent, you’ll need to set some initial value. For example:
data() {
return {
newTodoText: '',
visitCount: 0,
hideCompletedTodos: false,
todos: [],
error: null
}
}
The only exception to this being the use of Object.freeze()
, which prevents existing properties from being changed, which also means the reactivity system can’t track changes.
<p>{{ foo }}</p>
<!-- this will no longer update `foo`! -->
<button v-on:click="foo = 'baz'">Change it</button>
</div>
In addition to data properties, Vue instances expose a number of useful instance properties and methods. These are prefixed with to differentiate them from user-defined properties. For example:
const vm = Vue.createApp({
data() {
return {
a: 1
}
}
}).mount('#example')
vm.$data.a // => 1
In the future, you can consult the for a full list of instance properties and methods.
For example, the created hook can be used to run code after an instance is created:
There are also other hooks which will be called at different stages of the instance’s lifecycle, such as , updated, and . All lifecycle hooks are called with their this
context pointing to the Vue instance invoking it.
TIP
Don’t use arrow functions on an options property or callback, such as
created: () => console.log(this.a)
or vm.$watch('a', newValue => this.myMethod())
. Since an arrow function doesn’t have a this
, this
will be treated as any other variable and lexically looked up through parent scopes until found, often resulting in errors such as Uncaught TypeError: Cannot read property of undefined
or Uncaught TypeError: this.myMethod is not a function
.
Below is a diagram for the instance lifecycle. You don’t need to fully understand everything going on right now, but as you learn and build more, it will be a useful reference.