一、组件化
代码示例:
<!DOCTYPE html><html><head><title></title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></head><body><div id="test"><ol><todo-item></todo-item></ol></div></body><script>//组件化Vue.component('todo-item', {template: '<li>这是个待办项</li>'})var test = new Vue({el: '#test'})</script></html>
演示:
进阶使用:
<!DOCTYPE html><html><head><title></title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></head><body><div id="test"><ol><todo-item v-for="item in testList" v-bind:todo="item" v-bind:key="item.id"></todo-item></ol></div></body><script>Vue.component('todo-item', {props: ['todo'],template: '<li>{{todo.text}}</li>'})var test = new Vue({el: '#test',data: {testList: [{ id: 0, text: '啊' },{ id: 1, text: '哦' },{ id: 2, text: '嗯' }]}})</script></html>
效果:
二、实例
创建实例:
var test = new Vue({...})
当一个 Vue 实例被创建时,它将 data 对象中的所有的 property 加入到 Vue 的响应式系统中。当这些 property 的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。
// 我们的数据对象var data = { a: 1 }// 该对象被加入到一个 Vue 实例中var vm = new Vue({data: data})// 获得这个实例上的 property// 返回源数据中对应的字段vm.a == data.a // => true// 设置 property 也会影响到原始数据vm.a = 2data.a // => 2// ……反之亦然data.a = 3vm.a // => 3
这里唯一的例外是使用 Object.freeze(),这会阻止修改现有的 property,也意味着响应系统无法再追踪变化。
测试用例:
<!DOCTYPE html><html><head><title></title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></head><body><div id="test1">{{a}}</div><div id="test2">{{foo}}<button v-on:click="foo = 'baz'">Change it</button></div></body><script>var data = { a: 3 };var vm1 = new Vue({el: '#test1',data: data})//freeze()var obj = { foo: 'bar' }Object.freeze(obj)var vm2 = new Vue({el: '#test2',data: obj})</script></html>
效果:
三、实例生命周期钩子
每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。
比如 created 钩子可以用来在一个实例被创建之后执行代码:
new Vue({data: {a: 1},created: function () {// `this` 指向 vm 实例console.log('a is: ' + this.a)}})// => "a is: 1"
也有一些其它的钩子,在实例生命周期的不同阶段被调用,如 mounted、updated 和 destroyed。生命周期钩子的 this 上下文指向调用它的 Vue 实例。
下面是官方给的一张生命周期图示:

