Vue2生命周期详解

目录

1,生命周期概念

1.1概念:

1.2生命周期图解:

2.生命周期过程解读

2.1创建阶段

 2.2更新阶段

 2.3销毁阶段

 3.完整代码

4,总结:


1,生命周期概念

1.1概念:

所谓生命周期指的是vue实例的从创建到更新再到销毁的这么一个过程,就如同我们人类的一生一样,说起来就莫名有点伤感,从出生,到成长,到辉煌顶峰,最后到死亡......(自己的见解)

生命周期函数别名‘钩子函数’,类似a(){}   b(){}   这种在vue中为生命周期函数,重点的为mounted(创建完成函数),beforeDestroy(销毁前善后工作),这两个钩子常用。

1.2生命周期图解:

直接看图肯定是一脸懵逼的,所以我们坐下来慢慢说

2.生命周期过程解读

2.1创建阶段

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./vue.js"></script>
</head>

<body>
    <div id="app">

        计算器:{{num}}
      
    </div>
</body>
<script>
    new Vue({
        el: '#app',
        data() {
            return {
                num: 0,
            };
        },
//生命周期,,钩子函数a(){}  b(){}  此类型为生命周期函数
        beforeCreate() {//vue实例创造之前,没有解析模板,没有挂载,data数据
            console.log(this.num)//undefind
            // debugger;打断点
        },
        created() {//vue实例创建完成,但并未挂载,没有解析模板
            console.log(this.num)//0
            // debugger;
        },
        beforeMount() {//在挂载渲染前最后一次更改数据的机会,这个阶段操作dom不奏效
            this.num = 100;
            console.log('beforeMount', this.num)//beforeMount 100
            // debugger;
        },

        mounted() {//vue实例挂载完成,解析模板,初始化
            console.log(this.num)

            setInterval(() => {
                this.num++
            }, 1000)
        },
   })

</script>

 beforeCreate() vue实例创造之前,没有解析模板,没有挂载,data数据

created() vue实例创建完成,但并未挂载,没有解析模板 

 

 beforeMount() 在挂载渲染前最后一次更改数据的机会,这个阶段操作dom不奏效 

 

mounted() vue实例挂载完成,解析模板,初始化 

 

 2.2更新阶段

 // 2,更新状态阶段
        beforeUpdate() {//(data中数据已发生变化,view层数据变化之前),后vue的虚拟dom机制会从新构建虚拟dom
            //  与上一次的虚拟dom树利用diff算法进行对比以后从新渲染。
            console.log('beforeUpdate', this.num)//打印num为101,视图层{{num}}未渲染,只是占位符
            // debugger;
        },
        updated() {//完成更新
            console.log('updated', this.num)//updated 101  ,更新完成,页面渲染也完成{{num}}为101
            // debugger;
        },

beforeUpdate() (data中数据已发生变化,view层数据变化之前),后vue的虚拟dom机制会从新构建虚拟dom 与上一次的虚拟dom树利用diff算法进行对比以后从新渲染。

       updated()更新完成,页面渲染也完成{{num}}为101 

 

 2.3销毁阶段

  beforeDestroy() {//这里善后:清除计时器、清除非指令绑定的事件等等…’)。
            console.log('beforeDestroy', '处理善后工作');
        },
        destroyed() {//销毁后(Dom元素存在,只是再也不受vue控制)
            console.log(' destroyed', this)//this指向还是vue,vue存在,只是销毁后,断开vue和dom的联系,无法操作dom
        },

执行两个销毁函数

beforeDestroy() 这里善后:清除计时器、清除非指令绑定的事件等等…’)。

 destroyed()销毁后(Dom元素存在,只是再也不受vue控制)

this指向还是vue,vue存在,只是销毁后,断开vue和dom的联系,无法操作dom 

 3.完整代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./vue.js"></script>
</head>

<body>
    <div id="app">
        计算器:{{num}}
        <button @click="add">点我加1</button>
        <button @click="destroy">点我销毁</button>
    </div>
</body>
<script>
    new Vue({
        el: '#app',
        data() {
            return {
                num: 0,
            };
        },
        methods: {
            add() {
                this.num++
            },
            destroy() {
                console.log('即将销毁');
                this.$destroy()//Vm.$destroy():销毁后自定义事件会失效,但原生DOM事件依然有效。销毁后会调用销毁阶段的两个钩子。
            }
        },
        //生命周期,,钩子函数a(){}  b(){}  此类型为生命周期函数
        beforeCreate() {//vue实例创造之前,没有解析模板,没有挂载,data数据
            console.log(this.num)//undefind
            // debugger;  打断点
        },
        created() {//vue实例创建完成,但并未挂载,没有解析模板
            console.log(this.num)//0
            // debugger;
        },
        beforeMount() {//在挂载渲染前最后一次更改数据的机会,这个阶段操作dom不奏效
            this.num = 100;
            console.log('beforeMount', this.num)//beforeMount 100
            // debugger;
        },

        mounted() {//vue实例挂载完成,解析模板,初始化
            console.log(this.num)
            // debugger;
            setInterval(() => {
                this.num++
            }, 1000)
        },
        // 2,更新状态阶段
        beforeUpdate() {//(data中数据已发生变化,view层数据变化之前),后vue的虚拟dom机制会从新构建虚拟dom
            //  与上一次的虚拟dom树利用diff算法进行对比以后从新渲染。
            console.log('beforeUpdate', this.num)//打印num为101,视图层{{num}}未渲染,只是占位符
            // debugger;
        },
        updated() {//完成更新
            console.log('updated', this.num)//updated 101  ,更新完成,页面渲染也完成{{num}}为101
            // debugger;
        },
        //3,销毁阶段
        beforeDestroy() {//这里善后:清除计时器、清除非指令绑定的事件等等…’)。
            console.log('beforeDestroy', '处理善后工作');
        },
        destroyed() {//销毁后(Dom元素存在,只是再也不受vue控制)
            console.log(' destroyed', this)//this指向还是vue,vue存在,只是销毁后,断开vue和dom的联系,无法操作dom
        },



    })

</script>

</html>

4,总结:

 beforeCreate初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用。

vue实例中的el,data,data中的message都为undefined。

 created实例已经创建完成之后被调用。在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算, watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。 主要应用:调用数据,调用方法,调用异步函数

beforeMount载入前(完成了data和el数据初始化),可是页面中的内容仍是vue中的占位符,data中的message信息没有被挂在到Bom节点中,在这里能够在渲染前最后一次更改数据的机会,不会触发其余的钩子函数,通常能够在这里作初始数据。这个阶段操作DOM是不奏效的。

 mounted载入后html已经渲染(ajax请求能够放在这个函数中),把vue实例中的data里的message挂载到BOM节点中去。

 beforeUpdate状态完成更新之前(data中数据已发生变化,view层数据变化之前),后vue的虚拟dom机制会从新构建虚拟dom与上一次的虚拟dom树利用diff算法进行对比以后从新渲染。

updated数据已经更改完成,dom也从新render完成。

Vm.$destroy():销毁后自定义事件会失效,但原生DOM事件依然有效。销毁后会调用下面两个钩子。

 beforeDestroy销毁前执行($destroy方法被调用的时候就会执行),通常在这里善后:清除计时器、清除非指令绑定的事件等等…’)。

destroyed销毁后 (Dom元素存在,只是再也不受vue控制),卸载watcher,事件监听,子组件

常用的生命周期钩子:

mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】。

beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】。

关于销毁Vue实例:

1.销毁后借助Vue开发者工具看不到任何信息。

2.销毁后自定义事件会失效,但原生DOM事件依然有效。

3.一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了。

  • 30
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
Vue.js 是一个流行的 JavaScript 框架,它有一套完整的生命周期钩子函数,用于在组件的不同阶段执行特定的操作。下面是 Vue 组件的生命周期钩子函数及其对应的阶段: 1. beforeCreate: 在实例被创建之前调用,此时 data 和 methods 等属性还未初始化。 2. created: 在实例创建完成后调用,此时可以访问 data 和 methods,并可以进行一些初始化操作。 3. beforeMount: 在编译模板之前调用,此时模板还未被渲染成真实的 DOM。 4. mounted: 在编译模板之后调用,此时模板已经被渲染成真实的 DOM,并且可以进行 DOM 操作。 5. beforeUpdate: 在数据更新之前调用,此时可以进行一些更新准备工作。 6. updated: 在数据更新之后调用,此时 DOM 已经被更新。 7. beforeDestroy: 在实例销毁之前调用,此时实例仍然可用。 8. destroyed: 在实例销毁之后调用,此时实例及其所有的监听器都已被移除。 下面是一个简单的示例代码,演示了 Vue 组件的生命周期函数的使用: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue Lifecycle Demo</title> </head> <body> <div id="app"> {{ message }} </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script> new Vue({ el: '#app', data: { message: 'Hello, Vue!' }, beforeCreate() { console.log('beforeCreate hook') }, created() { console.log('created hook') }, beforeMount() { console.log('beforeMount hook') }, mounted() { console.log('mounted hook') }, beforeUpdate() { console.log('beforeUpdate hook') }, updated() { console.log('updated hook') }, beforeDestroy() { console.log('beforeDestroy hook') }, destroyed() { console.log('destroyed hook') } }) </script> </body> </html> ``` 你可以在浏览器中打开该示例,然后在控制台中查看不同生命周期阶段的输出信息。
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值