zoukankan      html  css  js  c++  java
  • Vue 生命周期总结与思考实验

                   生命周期函数就是 Vue 实例在某一个时间点自动执行的函数

    先上图,一步一步讲解

    建议边看生命周期图 边看最下面的步骤一步一步的走,有不理解的地方看看注释。并且在事件中多实验。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="../vue.js"></script>
    </head>
    <body>
        <div id="app">hello Vue</div>
        <script>
    
            //  生命周期函数就是 Vue 实例在某一个时间点自动执行的函数
            //  总共有11个生命周期钩子   图上有8个生命周期钩子
    
            
           /**
             * 1:首先它会去 初始化事件 和 生命周期相关的一些内容 最基础的初始化完成
             *    在图中就是 Init  Events & Lifecycle
             * 2:Vue 会自动的执行  beforeCreate 生命周期函数
             * 3:Vue 会继续的处理一些外部的注入包括双向的一些绑定相关的内容,
             *    当这部分的初始化也完成了之后,实例的一些初始化也都完成了。
             * 4:在这个节点上会自动的执行 created生命周期函数, Vue的初始化基本上已经结束
             * 5:然后会去判断我这个实例上是否有  el属性,如果有就会走Yes这条线。
             * 6:紧接着又会询问 我这个实例上是否有  template  这个属性
             * 6-1:如果没有tempate 就会去走右侧的分支,就是把el 本身及子元素当做模板来进行渲染
             * 6-2:如果有 template 属性就会去走左边的分支,把templaet 属性值进行渲染。el就被否定了
    
             * 7:我们有了模板和数据之后并没有直接去进行渲染,在渲染之前呢 会自动的执行  beforeMount 生命周期函数,也就是模板和数据相结合 ,即将挂载到页面上去之前的时候回执行
    
             * 8:当挂载渲染到页面之上后 执行  mounted 生命周期函数
             *
             * beforeDestroy 生命周期函数   即将被销毁执行
             * destroyed 生命周期函数       被销毁之后执行
             * 会在 这个Vue 实例  调用  $destroy() 方法会被执行这两个方法
             *
             * beforeUpdate 生命周期函数   在数据发生改变还没被渲染之前执行
             * updated 生命周期函数        在重新渲染之后 会被执行
             * 会在 Vue 的数据发生改变执行
             */
    
            var vm = new Vue({
                el:'#app',
                data:{
                  message:"this is Vue life cycle"
                },
                // template:"<div>如果有template 属性则执行template 进行渲染DOM</div>",
                template:"<div>{{message}}</div>",
                //  在创建Vue 实例之前执行的函数
                beforeCreate:function () {
                    console.log('beforeCreate');
                },
                //  创建Vue  实例成功之后执行的函数
                created:function () {
                    console.log('created');
                },
                //  如果有template 模板属性 则将模板编译渲染DOM
                //  如果没有template  编译el 的DOM 包含元素本身及内部的
                //  在挂载之前执行 也就是在真正渲染前执行
                beforeMount:function () {
                    console.log(this.$el);
                    console.log('beforeMount');
                },
                // 渲染完成执行的方法 
                mounted:function () {
                     console.log(this.$el);
                     console.log('mounted');
                },
                // 当数据发生变化时
                beforeUpdate:function () {
                    console.log('beforeUpdate');
                },
                //  虚拟DOM 重新渲染 修改
                updated:function () {
                    console.log('updated');
                },
                //  当执行这个Vue实例的  $destroy()  方法时执行
                beforeDestroy:function () {
                    console.log(this.message);
                },
                //  当删除了Vue实例时执行的方法
                destroyed:function () {
                    console.log(this.message);
                }
            })
        </script>
    </body>
    </html>

    补充这个当时遇到没想明白,现在理解了的问题  分享:

    //  我们的数据对象
    var data = { a: 1};
    
    //  该对象被加入到一个 Vue 实例中
    var vm = new Vue({
        data: data
    });

    1:打开页面,到控制台  Console 页面 

    data.a   
    vm.a   
    //    查看双方的值

    2:现在改变  data.a 的值    该为  520    查看vm.a  的值是否改变 。  是否是双向绑定

    data.a = 520
    vm.a

    结果发现确实是如我们所料 ,数据是双向绑定的   是引用同一个内存地址
    官方文档是这么说的:

    当这些数据改变时,视图会进行重渲染。值得注意的是只有当实例被创建时 data 中存在的属性才是响应式

    但是虽然好像似懂非懂,但是不知道怎么去测试。

    3:在控制台声明的新变量  dd = 888  ,并且去绑定到  vm的 data数据中 

    dd = 888
    vm.b = dd
    vm.b

    4:这时候改变  vm.b = 999,去查看下  dd  结果发现  dd的值还是 888  那么对 b 的改动将不会触发任何视图的更新

    5:这时候在去测试下   vm.a = 555  在去看   data.a    发现还是双向绑定的

       

    然后,在去看文档的这句话:     

    如果你知道你会在晚些时候需要一个属性,但是一开始它为空或不存在,那么你仅需要设置一些初始值。比如:

    data: {
      newTodoText: '',
      visitCount: 0,
      hideCompletedTodos: false,
      todos: [],
      error: null
    }

    明白了,只有当实例被创建时 data 中存在的属性才是响应式的    到此结束!!

  • 相关阅读:
    牛客编程巅峰赛S1第8场
    【杭电多校4】2020 Multi-University Training Contest 4
    2020牛客暑期多校训练营(第七场)
    DFS【搜索1】
    2020牛客暑期多校训练营(第六场)
    2020牛客暑期多校训练营(第五场)
    大数模板
    分布式前后端分离项目开发步骤
    Linux 查看服务器硬件信息
    写在前面
  • 原文地址:https://www.cnblogs.com/blogspring/p/10123271.html
Copyright © 2011-2022 走看看