Vue 生命周期

一、引入生命周期

生命周期:

1.又名:生命周期回调函数、生命周期函数、生命周期钩子。

2.是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数。

3.生命周期函数的名字不可更改,但函数的具体内容是程序员根据具体需求编写的。

4.生命周期函数中的this指向是vm 或 组件实例对象。

html 复制代码
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>引出生命周期</title>
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <body>
        <div id="root">
            <h2 :style="{opacity}">欢迎学习Vue</h2>
        </div>
    </body>
    <script type="text/javascript">
        Vue.config.productionTip = false

        new Vue({
            el:'#root',
            data:{
                opacity:1
            },
            //Vue完成模板的解析并把初始的真实DOM元素放入页面后(挂载完毕)调用mounted
            mounted(){
                change:{
                    setInterval(()=>{
                        this.opacity -= 0.01
                        if(this.opacity <=0) this.opacity = 1
                    },16)
                }
            }
        })

        //通过外部的定时器实现(不推荐)
        // setInterval(() => {
        //     vm.opacity -= 0.01
        //     if(vm.opacity<=0) vm.opacity = 1
        // },16)
    </script>
</html>

二、生命周期_挂载流程(初始化)

生命周期初始化全程包含以下函数:

beforeCreate:生命周期、事件,但数据代理还未开始。此时无法通过vm访问到data中的数据、methods中的方法。

created:已经完成数据监测、数据代理。此时可以通过vm访问到data中的数据、methods中配置的方法。

beforeMount:此阶段Vue开始解析模板,生成虚拟DOM(内存中),页面还不能显示解析好的内容。此时:

1.页面呈现的是未经Vue编译的DOM结构,

2.所有对DOM的操作,最终都不奏效。

mounted:将内存中的 虚拟DOM 转为 真实DOM 插入页面。此时:

1.页面中呈现的是经过Vue编译的DOM

2.对DOM的操作均有效(尽可能避免)。至此初始化过程结束,一般在此进行:开启定时器、发送网络请求、订阅消息、绑定自定义事件、等初始化操作。

html 复制代码
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>分析生命周期</title>
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <body>
        <div id="root">
            <h2>此时n的值为:{{n}}</h2>
            <button @click="n++">点击n+1</button>
        </div>
    </body>
    <script type="text/javascript">
        Vue.config.productionTip = false

        new Vue({
            el:'#root',
            // template:`
            //     <div>
            //         <h2>此时n的值为:{{n}}</h2>
            //         <button @click="n++">点击n+1</button>
            //     </div>
            // `,
            data:{
                n:1
            },
            //此时页面内为原始html代码渲染结果,vm中不存在_data
            beforeCreate() {
                console.log("beforeCreate",this)
                debugger;
            },
            //此时页面内为原始html代码渲染结果,vm已经完成数据代理和数据监视,但还未开始解析模板
            created() {
                console.log("Create",this)
                debugger;
            },
            //此时页面内为原始html代码渲染结果,Vue模板解析完成,但还未将虚拟DOM挂载到页面上
            beforeMount() {
                console.log("beforeMount",this)
                debugger;
            },
            //此时已经将Vue的所有虚拟DOM与对应的真实DOM替换完成
            mounted() {
                console.log("Mount",this)
                debugger;
            },
        })
    </script>
</html>

三、生命周期_更新流程

更新流程包含:

beforeUpdate:此时,数据是新的,但页面是旧的,即:页面尚未和数据保持同步。

Updated:根据新数据,生成新的虚拟DOM,随后与1日的虚拟DOM进行比较,最终完成页面更新,即完成了Model> View的更新。此时,数据是新的,页面也是新的,即:页面和数据保持同步。

html 复制代码
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>分析生命周期</title>
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <body>
        <div id="root">
            <h2>此时n的值为:{{n}}</h2>
            <button @click="n++">点击n+1</button>
        </div>
    </body>
    <script type="text/javascript">
        Vue.config.productionTip = false

        new Vue({
            el:'#root',
            // template:`
            //     <div>
            //         <h2>此时n的值为:{{n}}</h2>
            //         <button @click="n++">点击n+1</button>
            //     </div>
            // `,
            data:{
                n:1
            },
            //此时页面内为原始html代码渲染结果,vm中不存在_data
            beforeCreate() {
                console.log("beforeCreate",this)
                debugger;
            },
            //此时页面内为原始html代码渲染结果,vm已经完成数据代理和数据监视,但还未开始解析模板
            created() {
                console.log("Create",this)
                debugger;
            },
            //此时页面内为原始html代码渲染结果,Vue模板解析完成,但还未将虚拟DOM挂载到页面上
            beforeMount() {
                console.log("beforeMount",this)
                debugger;
            },
            //此时已经将Vue的所有虚拟DOM与对应的真实DOM替换完成
            mounted() {
                console.log("Mount",this)
                debugger;
            },
            //当数据发生修改时,新的数据已经保存,但页面上的数据还没有更改
            beforeUpdate() {
                console.log("beforeUpdate",this)
                debugger;
            },
            //当数据发生修改时,vm的数据已经完成修改,且新的虚拟DOM已经和旧的真实DOM完成比较替换
            updated() {
                console.log("Update",this)
                debugger;
            },
        })
    </script>
</html>

四、生命周期_销毁流程

销毁流程包含:

beforeDestroy:此时,vm中所有的:data、methods、指令等等,都处于可用状态,马上要执行销毁过程般在此阶段:关闭定时器、取消订阅消息、解绑白定义事件等收尾操作。

destroyed:vm完全销毁。

html 复制代码
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>分析生命周期</title>
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <body>
        <div id="root">
            <h2>此时n的值为:{{n}}</h2>
            <button @click="n++">点击n+1</button>
            <button @click="destroy">点击销毁</button>
        </div>
    </body>
    <script type="text/javascript">
        Vue.config.productionTip = false

        new Vue({
            el:'#root',
            // template:`
            //     <div>
            //         <h2>此时n的值为:{{n}}</h2>
            //         <button @click="n++">点击n+1</button>
            //     </div>
            // `,
            data:{
                n:1
            },
            methods: {
                destroy(){
                    this.$destroy()
                }
            },
            //此时页面内为原始html代码渲染结果,vm中不存在_data
            beforeCreate() {
                console.log("beforeCreate",this)
                debugger;
            },
            //此时页面内为原始html代码渲染结果,vm已经完成数据代理和数据监视,但还未开始解析模板
            created() {
                console.log("create",this)
                debugger;
            },
            //此时页面内为原始html代码渲染结果,Vue模板解析完成,但还未将虚拟DOM挂载到页面上
            beforeMount() {
                console.log("beforeMount",this)
                debugger;
            },
            //此时已经将Vue的所有虚拟DOM与对应的真实DOM替换完成
            mounted() {
                console.log("mount",this)
                debugger;
            },
            //当数据发生修改时,新的数据已经保存,但页面上的数据还没有更改
            beforeUpdate() {
                console.log("beforeUpdate",this)
                debugger;
            },
            //当数据发生修改时,vm的数据已经完成修改,且新的虚拟DOM已经和旧的真实DOM完成比较替换
            updated() {
                console.log("update",this)
                debugger;
            },
            //此时vm还未销毁,与vm相关的其它实例的连接,解绑它的全部指令及自定义事件监听器
            beforeDestroy() {
                console.log("beforeDestroy",this)
                this.n = 99 // 页面不再更新
                debugger;
            },
            //销毁完成
            destroyed() {
                console.log("destroy")
                debugger;
            },
        })
    </script>
</html>

五、生命周期_总结

生命周期流程图

常用的生命周期钩子:

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

2.beforeDestory:清除定时器、解绑自定义事件、取消订阅等【收尾操作】。

关于销毁Vue实例:

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

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

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

html 复制代码
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>总结生命周期</title>
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <body>
        <div id="root">
            <h2 :style="{opacity}">欢迎学习Vue</h2>
            <button @click="destroy">点击停止变化</button>
        </div>
    </body>
    <script type="text/javascript">
        Vue.config.productionTip = false

        new Vue({
            el:'#root',
            data:{
                opacity:1
            },
            methods:{
                destroy(){
                    this.$destroy()
                }
            },
            //Vue完成模板的解析并把初始的真实DOM元素放入页面后(挂载完毕)调用mounted
            mounted(){
                change:{
                    this.change = setInterval(()=>{
                        this.opacity -= 0.01
                        if(this.opacity <=0) this.opacity = 1
                    },16)
                }
            },
            beforeDestroy() {
                clearInterval(this.change)
            },
        })
    </script>
</html>
相关推荐
_AaronWong42 分钟前
Electron 实现仿豆包划词取词功能:从 AI 生成到落地踩坑记
前端·javascript·vue.js
cxxcode43 分钟前
I/O 多路复用:从浏览器到 Linux 内核
前端
用户5433081441941 小时前
AI 时代,前端逆向的门槛已经低到离谱 — 以 Upwork 为例
前端
JarvanMo1 小时前
Flutter 版本的 material_ui 已经上架 pub.dev 啦!快来抢先体验吧。
前端
JohnYan1 小时前
工作笔记-CodeBuddy应用探索
javascript·ai编程·aiops
恋猫de小郭1 小时前
AI 可以让 WIFI 实现监控室内人体位置和姿态,无需摄像头?
前端·人工智能·ai编程
哀木1 小时前
给自己整一个 claude code,解锁编程新姿势
前端
程序员鱼皮2 小时前
GitHub 关注突破 2w,我总结了 10 个涨星涨粉技巧!
前端·后端·github
UrbanJazzerati2 小时前
Vue3 父子组件通信完全指南
前端·面试
是一碗螺丝粉2 小时前
5分钟上手LangChain.js:用DeepSeek给你的App加上AI能力
前端·人工智能·langchain