21、Vue的生命周期


1、什么是Vue的生命周期

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

2、生命周期图示

在这里插入图片描述

3、举例使用生命周期函数

3.1、beforeCreate(创建前)

表示实例完全被创建之前会执行的函数,data和methods的数据并没有初始化。
举例1:当我们不使用beforeCreate时,使用fn自定义函数是可以打印出msg的:

<div id="app">
      <button @click="fn">点我打印msg</button>
  </div>
  <script src="./学习例子/vue2.6.js"></script>
  <script>
      new Vue({
        el:"#app",
        data:{
          msg:"use beforeCreate"
        },
        methods:{
          fn(){
            console.log(this.msg)
          }
        }
      })
  </script>

在这里插入图片描述
举例2:当我们使用beforeCreate的时候:

<div id="app">
      <button @click="">点我打印msg</button>
  </div>
  <script src="./学习例子/vue2.6.js"></script>
  <script>
      new Vue({
        el:"#app",
        data:{
          msg:"use beforeCreate"
        },
        beforeCreate(){
          console.log("-------")
          console.log(this.msg)
        },
      })
  </script>

在这里插入图片描述
可以看到我们的生命周期函数是会直接执行的,不用在#app中调用的。
通过例子以及查找资料,我们知道beforeCreate这个时期,this变量还不能使用,在data下的数据,和methods下的方法,watcher中的事件都是不能获得到。

3.2、created(创建后)

data和methods已经初始化好了,如果要调用data中的属性或methods中的方法,可以在created中调用。但是不能获取到dom元素,因为此时的元素并没有挂载上去。

<div id="app">
    <h1 ref="m">{{msg}}</h1>
  </div>
  <script src="./学习例子/vue2.6.js"></script>
  <script>
      new Vue({
        el:"#app",
        data:{
          msg:"use create"
        },
        methods:{
          fn(){}
        },
        created(){
          console.log("use created");
          console.log(this.msg);
          console.log(this.fn)
          console.log(this.$refs.m)
        }
      })
  </script>

在这里插入图片描述

3.3、beforeMount(载入前)

在挂载开始之前被调用,相关的render函数首次被调用。实例已完成以下的配置:编译模板,把data里面的数据和模板生成html。此时模板已经在内存中编译好了,但是还没有挂载到页面中去,此时的页面还是旧的,因此此时还是无法获取到dom元素的。

<div id="app">
    <h3 ref="m">{{msg}}</h3>
  </div>
  <script src="./学习例子/vue2.6.js"></script>
  <script>
      new Vue({
        el:"#app",
        data:{
          msg:"use beforeMount"
        },
        created(){
          console.log("use beforeMount");
          console.log(this.$refs.m)
        }
      })
  </script>

在这里插入图片描述

3.4、mounted(载入后)

组件已经脱离了创建阶段,进入到了运行阶段,如果需要操作DOM节点,最早要在mounted中进行。实例已完成以下的配置:用上面编译好的html内容替换el属性指向的DOM对象。完成模板中的html渲染到html页面中。此过程中进行ajax交互。

<div id="app">
    <h3 ref="m">{{msg}}</h3>
  </div>
  <script src="./学习例子/vue2.6.js"></script>
  <script>
      new Vue({
        el:"#app",
        data:{
          msg:"use mounted"
        },
        mounted(){
          console.log("use mounted");
          console.log(this.$refs.m)
        }
      })
  </script>

在这里插入图片描述

3.5、beforeUpdate(更新前)

在数据更新之前调用,发生在虚拟DOM重新渲染和打补丁之前。可以在该钩子中进一步地更改状态,不会触发附加的重渲染过程。

<div id="app">
    <h3 ref="m">{{msg}}</h3>
    <button @click="fn">点我修改h3中内容</button>
  </div>
  <script src="./学习例子/vue2.6.js"></script>
  <script>
      new Vue({
        el:"#app",
        data:{
          msg:"use beforeUpdate"
        },
        methods:{
          fn(){
            this.msg = "修改后的msg";
          }
        },
        beforeUpdate(){
          console.log("use beforeUpdate");
          console.log(this.$refs.m)
          console.log(this.$refs.m.innerText)
        }
      })
  </script>

在这里插入图片描述
通过上面的例子,我们可以看到beforeUpdata不会自动执行,只有数据发生修改的时候才会执行,同时我们的beforeUpdata执行的时候,其里面的内容还是未发生变化的,从 上面的例子中我们看到this.$refs.m.innerText中的值还是未修改前的use beforeUpdata。

3.6、updated(更新后)

数据和页面已经保持了同步,都是最新的内容。由于数据更改导致的虚拟DOM重新渲染和打补丁之后调用。调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作。然而在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务器端渲染期间不被调用。

<div id="app">
    <h3 ref="m">{{msg}}</h3>
    <button @click="fn">点我修改h3中内容</button>
  </div>
  <script src="./学习例子/vue2.6.js"></script>
  <script>
      new Vue({
        el:"#app",
        data:{
          msg:"use updated"
        },
        methods:{
          fn(){
            this.msg = "修改后的msg";
          }
        },
        updated(){
          console.log("use updated");
          console.log(this.$refs.m)
          console.log(this.$refs.m.innerText)
        }
      })
  </script>

在这里插入图片描述

3.7、beforeDestroy(销毁前)

在实例销毁之前调用。实例仍然完全可用。

<div id="app">
    <son v-if="bool"></son>
    <button @click="bool=!bool">点我删除/添加子组件</button>
  </div>
  <script src="./学习例子/vue2.6.js"></script>
  <script>
      var son = {
        template:`
        <div>
          <h3>这是生命周期函数演示</h3>
          <h4 ref="m">{{msg}}</h4>
        </div>
        `,
        data(){
           return {
             msg:"use beforeDestroy"
           }
        },
        beforeDestroy(){
          console.log("-- beforeDestroy--")
          console.log("data的数据:",this.msg);
          console.log("页面的数据:",this.$refs.m.innerText);
        }
    }
      new Vue({
        el:"#app",
        data:{
          bool:true,
        },
        components:{
          "son":son
        },
       
      })
  </script>

在这里插入图片描述
当我们删除子组件的时候,就会执行beforeDestory生命周期函数,此时data的内容还能够使用。

3.8、destroyed(销毁后)

组件已经完全被销毁,此时所有的数据和方法、指令等等,都不可以用了。

<div id="app">
    <son v-if="bool"></son>
    <button @click="bool=!bool">点我删除/添加子组件</button>
  </div>
  <script src="./学习例子/vue2.6.js"></script>
  <script>
      var son = {
        template:`
        <div>
          <h3>这是生命周期函数演示</h3>
          <h4 ref="m">{{msg}}</h4>
        </div>
        `,
        data(){
           return {
             msg:"use destroyed"
           }
        },
        destroyed(){
          console.log("-- destroyed--")
          console.log("data的数据:",this.msg);
          console.log("页面的数据:",this.$refs.m.innerText);
        }
    }
      new Vue({
        el:"#app",
        data:{
          bool:true,
        },
        components:{
          "son":son
        },
       
      })
  </script>

在这里插入图片描述
在实例销毁之后调用。调用后,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值