创建一个 Vue 实例
每个 Vue 应用 都是通过用 Vue 函数创建一个新的 Vue 实例开始的:
var vm = new Vue({
// 选项
})
实例 log:
属性:见 api。
【规则】
-
不完全遵循 MVVM 模型,但 Vue 的设计也受到了它的启发。
vm:因此在文档中经常会使用 vm (ViewModel 的缩写) 这个变量名表示 Vue 实例。 -
选项对象
可在选项文档 中浏览完整的选项列表。
- 一个 Vue 应用是通过 new Vue 创建的 根 Vue 实例,以及其他可嵌套、复用组件组成。 (会在后面的组件系统中展开)
例如: todo 应用组件树是这样
根实例
└─ TodoList
├─ TodoItem
│ ├─ TodoButtonDelete
│ └─ TodoButtonEdit
└─ TodoListFooter
├─ TodosButtonClear
└─ TodoListStatistics
// 上面每个组件都是一个 vue 实例
数据与方法
data 内响应式数据
当一个 Vue 实例被创建时,它将 data 对象中的所有 property 加入到 Vue 的响应式系统中。
当这些 property 值 发生改变时,视图将会产生“响应” —— 匹配更新为最新的值。
注意
1、当这些数据改变时,视图会进行重渲染。
2、只有当实例被创建时就已经存在于 data 中的 property 才是响应式的。
问题:也就是说如果你添加一个新的 property,那么新添加的将不会触发任何视图的更新;
处理:
1、初始化时就在 data 中定义,为其赋一些初始值;
data: {
newTodoText: '',
visitCount: 0,
hideCompletedTodos: false,
todos: [],
error: null
}
3、冻结对象将无法再添加响应式数据;
var obj = {
foo: 'bar'
}
Object.freeze(obj)
new Vue({
el: '#app',
data: obj
})
// 冻结后,下面的 foo 值是不会更新的
<div id="app">
<p>{{ foo }}</p>
<!-- 这里的 `foo` 不会更新! -->
<button v-on:click="foo = 'baz'">Change it</button>
</div>
4、vue 实例还有其他的 实例属性,特点是前缀都有 $,用于与用户的 property 区分;
验证:
var data = { a: 1 }
var vm = new Vue({
el: '#example',
data: data,
})
vm.$data === data // => true
vm.$el === document.getElementById('example') // => true
// $watch 是一个实例方法
vm.$watch('a', function (newValue, oldValue) {
// 这个回调将在 `vm.a` 改变后调用
})
生命周期钩子函数
每个 Vue 实例在创建时都经过一系列的初始化过程。
例如:需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。
在这些过程中会运行一些叫做生命周期钩子的函数,这样用户就可以在不同阶段添加业务所需的代码。
例如: created 钩子可添加实例被创建之后执行的代码。
new Vue({
data: {
a: 1,
},
created: function () {
// `this` 指向 vm 实例
console.log('a is: ' + this.a)
},
})
注意
- !!不能在选项 property 或回调上使用 箭头函数。
因为箭头函数并没有 this,this 会作为变量一直向上级词法作用域查找,直至找到为止。
created: () => console.log(this.a)
vm.$watch('a', newValue => this.myMethod())
经常会造成报错:
Uncaught TypeError: Cannot read property of undefined
Uncaught TypeError: this.myMethod is not a function
生命周期图示
后面会详细理解生命周期钩子函数