Vue生命周期

一、Vue生命周期

Vue.js 的生命周期是指一个Vue实例从创建到销毁的整个过程,包括数据初始化、模板编译、挂载到DOM树、渲染、更新以及卸载等阶段。每个阶段都伴随着特定的钩子函数(生命周期钩子),允许开发者在组件的不同阶段执行自定义逻辑。

在Vue 2.x中,生命周期主要包含以下阶段:

  1. 初始化

    • beforeCreate:在创建Vue实例之前,可以执行这个方法,例如 加载动画操作
    • created:实例已经创建完成,属性已绑定,但DOM还未生成,$el属性还不存在。
  2. 模板编译及挂载前

    • beforeMount:模板已经在内存中编辑完成了,尚未被渲染到页面中
    • mounted:内存中的模板已经渲染到页面,用户已经可以看见内容
  3. 更新阶段

    • beforeUpdate:数据更新的前一刻,组件在发生更新之前,调用的函数
    • updated:updated执行时,内存中的数据已更新,并且页面已经被渲染
  4. 销毁阶段

    • beforeDestroy:钩子函数在实例销毁之前调用
    • destroyed:实例销毁后调用,所有指令解绑,所有数据观察器移除,所有子实例也已经被销毁。

二、代码演示

1、beforeCreate函数在组件实例化之前执行

  1. 代码

    <!DOCTYPE html>
    <html lang="en">
     <head>
       <meta charset="UTF-8" />
       <meta name="viewport" content="width=device-width, initial-scale=1.0" />
       <title>Document</title>
     </head>
     <body>
       <div id="app">
         <button @click="test">测试按钮</button>
         <h1>数据:{{msg}}</h1>
       </div>
     </body>
    
     <script src="js/vue.min.js"></script>
     <script>
       var Vm = new Vue({
         el: "#app",
         data: {
           msg: "测试数据",
         },
         methods: {
           test: function () {
             alert("测试事件发生!");
           },
         },
         beforeCreate() {
           alert("1.beforeCreate函数在组件实例化之前执行, msg: " + this.msg);
         },
       });
     </script>
    </html>
    
    
  2. 测试结果

    在这里插入图片描述

注意,此时msg是未定义的,证明Vue实例尚未生成


2、created函数执行时,组件实例化完成,但是DOM(页面)还未生成

  1. 修改代码

    <!DOCTYPE html>
    <html lang="en">
     <head>
       <meta charset="UTF-8" />
       <meta name="viewport" content="width=device-width, initial-scale=1.0" />
       <title>Document</title>
     </head>
     <body>
       <div id="app">
         <button @click="test">测试按钮</button>
         <h1>数据:{{msg}}</h1>
       </div>
     </body>
    
     <script src="js/vue.min.js"></script>
     <script>
       var Vm = new Vue({
         el: "#app",
         data: {
           msg: "测试数据",
         },
         methods: {
           test: function () {
             alert("测试事件发生!");
           },
         },
         // beforeCreate() {
         //   alert("1.beforeCreate函数在组件实例化之前执行, msg: " + this.msg);
         // },
         created() {
           alert(
             "2.created函数执行时,组件实例化完成,但是DOM(页面)还未生成, msg:" +
               this.msg
           );
         },
       });
     </script>
    </html>
    
    
  2. 测试结果

    在这里插入图片描述

注意,此时msg是已经有值了,证明Vue实例已经生成,但界面上没有东西,证明dom未生成,页面未渲染


3、 beforeMount函数执行时,模板已经在内存中编辑完成了,尚未被渲染到页面中

  1. 修改代码

    <!DOCTYPE html>
    <html lang="en">
     <head>
       <meta charset="UTF-8" />
       <meta name="viewport" content="width=device-width, initial-scale=1.0" />
       <title>Document</title>
     </head>
     <body>
       <div id="app">
         <button @click="test">测试按钮</button>
         <h1>数据:{{msg}}</h1>
    
         <h2 id="testBeforeMount">{{msg}}</h2>
       </div>
     </body>
    
     <script src="js/vue.min.js"></script>
     <script>
       var Vm = new Vue({
         el: "#app",
         data: {
           msg: "测试数据",
         },
         methods: {
           test: function () {
             alert("测试事件发生!");
           },
         },
         // beforeCreate() {
         //   alert("1.beforeCreate函数在组件实例化之前执行, msg: " + this.msg);
         // },
         // created() {
         //   alert(
         //     "2.created函数执行时,组件实例化完成,但是DOM(页面)还未生成, msg:" +
         //       this.msg
         //   );
         // },
         beforeMount() {
           alert(
             "3.beforeMount函数执行时,模板已经在内存中编辑完成了,尚未被渲染到页面中"
           );
           alert(document.getElementById("testBeforeMount").innerText);
         },
       });
     </script>
    </html>
    
    
  2. 测试结果

    在这里插入图片描述


4、 mounted函数执行时,模板已经渲染到页面,执行完页面显示

  1. 修改代码

    <!DOCTYPE html>
    <html lang="en">
     <head>
       <meta charset="UTF-8" />
       <meta name="viewport" content="width=device-width, initial-scale=1.0" />
       <title>Document</title>
     </head>
     <body>
       <div id="app">
         <button @click="test">测试按钮</button>
         <h1>数据:{{msg}}</h1>
    
         <h2 id="testBeforeMount">{{msg}}</h2>
       </div>
     </body>
    
     <script src="js/vue.min.js"></script>
     <script>
       var Vm = new Vue({
         el: "#app",
         data: {
           msg: "测试数据",
         },
         methods: {
           test: function () {
             alert("测试事件发生!");
           },
         },
         // beforeCreate() {
         //   alert("1.beforeCreate函数在组件实例化之前执行, msg: " + this.msg);
         // },
         // created() {
         //   alert(
         //     "2.created函数执行时,组件实例化完成,但是DOM(页面)还未生成, msg:" +
         //       this.msg
         //   );
         // },
         // beforeMount() {
         //   alert(
         //     "3.beforeMount函数执行时,模板已经在内存中编辑完成了,尚未被渲染到页面中"
         //   );
         //   alert(document.getElementById("testBeforeMount").innerText);
         // },
         mounted() {
           alert("4.mounted函数执行时,模板已经渲染到页面,执行完页面显示");
           alert(document.getElementById("testBeforeMount").innerText);
         },
       });
     </script>
    </html>
    
    
  2. 测试结果

    在这里插入图片描述


5、 beforeUpdate执行时,内存中的数据已更新,但是页面尚未被渲染

  1. 修改代码

    <!DOCTYPE html>
    <html lang="en">
     <head>
       <meta charset="UTF-8" />
       <meta name="viewport" content="width=device-width, initial-scale=1.0" />
       <title>Document</title>
     </head>
     <body>
       <div id="app">
         <button @click="test">测试按钮</button>
         <h1>数据:{{msg}}</h1>
    
         <!-- <h2 id="testBeforeMount">{{msg}}</h2> -->
         <button @click="change">更新数据</button>
         <h2 id="msgchange">{{msg}}</h2>
       </div>
     </body>
    
     <script src="js/vue.min.js"></script>
     <script>
       var Vm = new Vue({
         el: "#app",
         data: {
           msg: "测试数据",
         },
         methods: {
           test: function () {
             alert("测试事件发生!");
           },
           change: function () {
             this.msg = "新的数据";
           },
         },
         // beforeCreate() {
         //   alert("1.beforeCreate函数在组件实例化之前执行, msg: " + this.msg);
         // },
         // created() {
         //   alert(
         //     "2.created函数执行时,组件实例化完成,但是DOM(页面)还未生成, msg:" +
         //       this.msg
         //   );
         // },
         // beforeMount() {
         //   alert(
         //     "3.beforeMount函数执行时,模板已经在内存中编辑完成了,尚未被渲染到页面中"
         //   );
         //   alert(document.getElementById("testBeforeMount").innerText);
         // },
         // mounted() {
         //   alert("4.mounted函数执行时,模板已经渲染到页面,执行完页面显示");
         //   alert(document.getElementById("testBeforeMount").innerText);
         // },
         beforeUpdate() {
           alert(
             "5.beforeUpdate执行时,内存中的数据已更新,但是页面尚未被渲染,内存数据msg:" +
               this.msg
           );
           alert(
             "页面显示的内容:" + document.getElementById("msgchange").innerText
           );
           alert("data中msg:" + this.msg);
         },
       });
     </script>
    </html>
    
    
  2. 测试结果

    在这里插入图片描述


6、 updated执行时,内存中的数据已更新,此方法执行完显示页面!

  1. 修改代码

    <!DOCTYPE html>
    <html lang="en">
     <head>
       <meta charset="UTF-8" />
       <meta name="viewport" content="width=device-width, initial-scale=1.0" />
       <title>Document</title>
     </head>
     <body>
       <div id="app">
         <button @click="test">测试按钮</button>
         <h1>数据:{{msg}}</h1>
    
         <!-- <h2 id="testBeforeMount">{{msg}}</h2> -->
         <button @click="change">更新数据</button>
         <h2 id="msgchange">{{msg}}</h2>
       </div>
     </body>
    
     <script src="js/vue.min.js"></script>
     <script>
       var Vm = new Vue({
         el: "#app",
         data: {
           msg: "测试数据",
         },
         methods: {
           test: function () {
             alert("测试事件发生!");
           },
           change: function () {
             this.msg = "新的数据";
           },
         },
         // beforeCreate() {
         //   alert("1.beforeCreate函数在组件实例化之前执行, msg: " + this.msg);
         // },
         // created() {
         //   alert(
         //     "2.created函数执行时,组件实例化完成,但是DOM(页面)还未生成, msg:" +
         //       this.msg
         //   );
         // },
         // beforeMount() {
         //   alert(
         //     "3.beforeMount函数执行时,模板已经在内存中编辑完成了,尚未被渲染到页面中"
         //   );
         //   alert(document.getElementById("testBeforeMount").innerText);
         // },
         // mounted() {
         //   alert("4.mounted函数执行时,模板已经渲染到页面,执行完页面显示");
         //   alert(document.getElementById("testBeforeMount").innerText);
         // },
         // beforeUpdate() {
         //   alert(
         //     "5.beforeUpdate执行时,内存中的数据已更新,但是页面尚未被渲染,内存数据msg:" +
         //       this.msg
         //   );
         //   alert(
         //     "页面显示的内容:" + document.getElementById("msgchange").innerText
         //   );
         //   alert("data中msg:" + this.msg);
         // },
         updated() {
           alert(
             "6.updated执行时,内存中的数据已更新,此方法执行完显示页面!msg:" +
               this.msg
           );
         },
       });
     </script>
    </html>
    
    
  2. 测试结果

    在这里插入图片描述

  • 31
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值