美文网首页
Vue生命周期

Vue生命周期

作者: Darkdreams | 来源:发表于2018-12-05 15:33 被阅读0次

    钩子函数

    Vue里提供了8种钩子函数,在不同的生命周期中进行不同的方法。


    Vue生命周期
    1. beforeCreate
    2. created
    3. beforeMount
    4. mounted
    5. beforeUpdate
    6. updated
    7. beforeDestroy
    8. destroyed
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>vue生命周期学习</title>
      <script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script>
    </head>
    <body>
      <div id="app">
        <h1>{{message}}</h1>
      </div>
    </body>
    <script>
      var vm = new Vue({
        el: '#app',
        data: {
          message: 'Vue的生命周期'
        },
        beforeCreate: function() {
          console.group('------beforeCreate创建前状态------');
          console.log("%c%s", "color:red" , "el     : " + this.$el); //undefined
          console.log("%c%s", "color:red","data   : " + this.$data); //undefined 
          console.log("%c%s", "color:red","message: " + this.message) 
        },
        created: function() {
          console.group('------created创建完毕状态------');
          console.log("%c%s", "color:red","el     : " + this.$el); //undefined
          console.log("%c%s", "color:red","data   : " + this.$data); //已被初始化 
          console.log("%c%s", "color:red","message: " + this.message); //已被初始化
        },
        beforeMount: function() {
          console.group('------beforeMount挂载前状态------');
          console.log("%c%s", "color:red","el     : " + (this.$el)); //已被初始化
          console.log(this.$el);
          console.log("%c%s", "color:red","data   : " + this.$data); //已被初始化  
          console.log("%c%s", "color:red","message: " + this.message); //已被初始化  
        },
        mounted: function() {
          console.group('------mounted 挂载结束状态------');
          console.log("%c%s", "color:red","el     : " + this.$el); //已被初始化
          console.log(this.$el);    
          console.log("%c%s", "color:red","data   : " + this.$data); //已被初始化
          console.log("%c%s", "color:red","message: " + this.message); //已被初始化 
        },
        beforeUpdate: function () {
          console.group('beforeUpdate 更新前状态===============》');
          console.log("%c%s", "color:red","el     : " + this.$el);
          console.log(this.$el);   
          console.log("%c%s", "color:red","data   : " + this.$data); 
          console.log("%c%s", "color:red","message: " + this.message); 
        },
        updated: function () {
          console.group('updated 更新完成状态===============》');
          console.log("%c%s", "color:red","el     : " + this.$el);
          console.log(this.$el); 
          console.log("%c%s", "color:red","data   : " + this.$data); 
          console.log("%c%s", "color:red","message: " + this.message); 
        },
        beforeDestroy: function () {
          console.group('beforeDestroy 销毁前状态===============》');
          console.log("%c%s", "color:red","el     : " + this.$el);
          console.log(this.$el);    
          console.log("%c%s", "color:red","data   : " + this.$data); 
          console.log("%c%s", "color:red","message: " + this.message); 
        },
        destroyed: function () {
          console.group('destroyed 销毁完成状态===============》');
          console.log("%c%s", "color:red","el     : " + this.$el);
          console.log(this.$el);  
          console.log("%c%s", "color:red","data   : " + this.$data); 
          console.log("%c%s", "color:red","message: " + this.message)
        }
      })
    </script>
    </html>
    
    Vue实例创建过程中调用的几个生命周期钩子
    1. beforeCreatecreated之间的生命周期

    在这个生命周期之间,进行初始化事件,进行数据的观测,可以看到在created时候数据已经和data属性进行了绑定。
    created完毕后,el还是undefined

    2. createdbeforeMount

    首先判断对象中是否有el选项,如果没有el选项,则停止编译,如下图,注释掉el: "#app"

    没有el选项,则停止编译
    接下来,如果在该Vue实例中,调用vm.$mount(el),代码继续向后执行,如下图
    调用vm.$mount("#app"),代码则继续执行

    template参数选项的有无对生命周期的影响
    1). Vue实例对象中有template参数选项,则将其作为模板编译成render函数;
    2). 如果没有template,则将外部HTML作为模板编译;
    3). template中的模板优先级要高于外部HTML的优先级。

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>vue生命周期学习</title>
      <script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script>
    </head>
    <body>
      <div id="app">
        <!--html中修改的-->
        <h1>{{message + '这是在outer HTML中的'}}</h1>
        <h2></h2>
      </div>
    </body>
    <script>
      var vm = new Vue({
        el: '#app',
        template: "<h1>{{message +'这是在template中的'}}</h1>", //在vue配置项中修改的
        data: {
          message: 'Vue的生命周期'
        },
        //render: function(createElement) {
            //return createElement('h1', 'this is createElement')
        //},
        created: function() {
    
        },
        mounted: function() {
    
        }
       // render函数 > template > 外部HTML标签
      })
    </script>
    </html>
    
    1. 代码执行后:


      template优先级高于外部HTML标签
    2. 将Vue中template注释掉,代码执行为:


      则加载外部HTML标签

    这就是为什么el要在template之前,因为Vue需要通过el找到对应的外部标签。

    1. render函数,它是以createElement作为参数,然后做渲染操作,而且我们可以直接潜入JSX。
      打开上面代码render函数注释,则执行

    优先级为:render函数 > template > 外部HTML标签

    3. beforeMountmounted

    此时的Vue实例对象添加$el,并且替换掉挂在DOM元素。在之前console中打印的结果可以看到beforeMount之前el还是undefined

    4. mounted

    这时我们在看h1标签中内容发生了变化。

    3和4的前后变化
    5. beforeUpdate钩子函数和updated钩子函数间的生命周期

    当Vue发现data中的数据发生了改变,会触发对应组件的重新渲染,先后调用beforeUpdateupdated钩子函数。我们在控制台console中输入:

    vm.message = '触发组件更新'
    
    组件更新
    5. beforeDestroydestroyed

    beforeDestroy 实例销毁之前调用。在这一步,实例仍然完全可用。
    该钩子在服务器端渲染期间不被调用。

    ```destroyed`` `Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。
    该钩子在服务器端渲染期间不被调用。

    原链接:https://segmentfault.com/a/1190000011381906 作者:fsrookie

    相关文章

      网友评论

          本文标题:Vue生命周期

          本文链接:https://www.haomeiwen.com/subject/ppjicqtx.html