一、组件化

    代码示例:

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <title></title>
    5. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    6. </head>
    7. <body>
    8. <div id="test">
    9. <ol>
    10. <todo-item></todo-item>
    11. </ol>
    12. </div>
    13. </body>
    14. <script>
    15. //组件化
    16. Vue.component('todo-item', {
    17. template: '<li>这是个待办项</li>'
    18. })
    19. var test = new Vue({
    20. el: '#test'
    21. })
    22. </script>
    23. </html>

    演示:
    1.png
    进阶使用:

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <title></title>
    5. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    6. </head>
    7. <body>
    8. <div id="test">
    9. <ol>
    10. <todo-item v-for="item in testList" v-bind:todo="item" v-bind:key="item.id"></todo-item>
    11. </ol>
    12. </div>
    13. </body>
    14. <script>
    15. Vue.component('todo-item', {
    16. props: ['todo'],
    17. template: '<li>{{todo.text}}</li>'
    18. })
    19. var test = new Vue({
    20. el: '#test',
    21. data: {
    22. testList: [
    23. { id: 0, text: '啊' },
    24. { id: 1, text: '哦' },
    25. { id: 2, text: '嗯' }
    26. ]
    27. }
    28. })
    29. </script>
    30. </html>

    效果:
    2.png
    二、实例

    创建实例:

    1. var test = new Vue({...})

    当一个 Vue 实例被创建时,它将 data 对象中的所有的 property 加入到 Vue 的响应式系统中。当这些 property 的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。

    1. // 我们的数据对象
    2. var data = { a: 1 }
    3. // 该对象被加入到一个 Vue 实例中
    4. var vm = new Vue({
    5. data: data
    6. })
    7. // 获得这个实例上的 property
    8. // 返回源数据中对应的字段
    9. vm.a == data.a // => true
    10. // 设置 property 也会影响到原始数据
    11. vm.a = 2
    12. data.a // => 2
    13. // ……反之亦然
    14. data.a = 3
    15. vm.a // => 3

    这里唯一的例外是使用 Object.freeze(),这会阻止修改现有的 property,也意味着响应系统无法再追踪变化。

    测试用例:

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <title></title>
    5. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    6. </head>
    7. <body>
    8. <div id="test1">
    9. {{a}}
    10. </div>
    11. <div id="test2">
    12. {{foo}}
    13. <button v-on:click="foo = 'baz'">Change it</button>
    14. </div>
    15. </body>
    16. <script>
    17. var data = { a: 3 };
    18. var vm1 = new Vue({
    19. el: '#test1',
    20. data: data
    21. })
    22. //freeze()
    23. var obj = { foo: 'bar' }
    24. Object.freeze(obj)
    25. var vm2 = new Vue({
    26. el: '#test2',
    27. data: obj
    28. })
    29. </script>
    30. </html>

    效果:
    3.gif
    三、实例生命周期钩子

    每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。

    比如 created 钩子可以用来在一个实例被创建之后执行代码:

    1. new Vue({
    2. data: {
    3. a: 1
    4. },
    5. created: function () {
    6. // `this` 指向 vm 实例
    7. console.log('a is: ' + this.a)
    8. }
    9. })
    10. // => "a is: 1"

    也有一些其它的钩子,在实例生命周期的不同阶段被调用,如 mountedupdateddestroyed。生命周期钩子的 this 上下文指向调用它的 Vue 实例。

    下面是官方给的一张生命周期图示:

    4.png