【Vue3从零开始-第二章】2-2 生命周期函数

简介: 【Vue3从零开始-第二章】2-2 生命周期函数

]UWOD(KIB9LJS9~S[T{QHM9.png


前言


上一篇文章中,讲过了vue应用的基础概念,今天我们要更深入的了解一下vue了。


之前的文章中,也大致用过和了解过部分生命周期函数,在今天的文章中,将会带大家了解vue所有的生命周期函数。


什么是生命周期函数?


  • 在某一时刻会自动执行的函数


触发函数


在之前的代码中,我们会在元素上用v-on:click绑定一个点击事件,当我们点击元素之后就会触发方法中的逻辑。


<script>
    Vue.createApp({
        data(){
            return {
                message: 'Hello World'
            }
        },
        methods: {
            handleClick(){
                alert('点击触发')
            }
        },
        template: "<div v-on:click='handleClick'>{{message}}</div>"
    }).mount('#root');
</script>
复制代码


DVTY0L_9UQ%D$2JID]AL7H4.png


通过上面的代码可以看出,点击事件触发时,是调用的methods里面的函数,下面我们就用mounted函数来简单介绍一下这两者的区别。


<script>
    Vue.createApp({
        data(){
            return {
                message: 'Hello World'
            }
        },
        mounted(){
            alert('mounted函数')
        },
        methods: {
            handleClick(){
                alert('点击触发')
            }
        },
        template: "<div v-on:click='handleClick'>{{message}}</div>"
    }).mount('#root');
</script>
复制代码


7X6PFQY`BTI)0@3CITDRE`P.png


通过刷新浏览器,我们会发现页面中的元素还没加载出来的时候,就自动执行了mounted函数,而且mounted函数是和methods同级的,并不是像其他函数一样包含在methods中的。


生命周期详解


~{8CF}AB9QO~D@})I`ZXP[G.png


此处是生命周期详解的通用代码,下面的生命周期函数或者相关代码都会在此基础上增改。


<!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>Hello World</title>
    <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
    <div id="root"></div>
</body>
<script>
    Vue.createApp({
        data(){
            return {
                message: 'Hello World'
            }
        },
        // 此处开始写生命周期函数
        // 此处是模板
        template: "<div>{{message}}</div>"
    }).mount('#root');
</script>
</html>
复制代码


首先我们看到的就是创建一个vue实例,紧接着就开始执行vue里面的逻辑了。


  • 第一步:初始化vue代码,分析vue代码是否有一些事件的绑定(如:v-on)或者是上面提到的生命周期函数(如:mounted


  • 第二步:执行vue中的第一个生命周期函数beforeCreate


  • beforeCreate:在实例生成之前会自动执行的函数


  • 在代码模板中,写下beforeCreate函数,打开浏览器看看执行效果


beforeCreate(){
   console.log('beforeCreate函数')
},
复制代码


~8@7L4_2@BB21[{`[XYC$UK.png


  • 第三步:继续对vue进行初始化,开始分析代码中数据和模板的绑定相关的内容。


  • 第四步:执行vue中的第二个生命周期函数created


  • created:在实例生成之后会自动执行的函数


  • 在执行完beforeCreate函数之后,会紧接着执行created函数


created(){
   console.log('created函数')
},
复制代码


F[]_PKV{%%{1W``14AX%A`0.png


  • 第五步:判断代码中是否有template选项,有则走左侧的yes,无则走右侧的no


  • 第六步:为yes的时候,vue会将template转为一个render函数,变为函数之后,会将数据和这个函数结合,才能把最终的内容渲染出来。


  • 第七步:执行vue中的第三个生命周期函数beforeMount


  • beforeMount:在组件内容被渲染到页面之前自动执行的函数


  • template转为render函数之后,就会执行beforeMount函数


beforeMount(){
   console.log('beforeMount函数')
},
复制代码


F[]_PKV{%%{1W``14AX%A`0.png


  • 第八步:用生命周期的函数对数据进行一个结合,生成我们最终想要的一个新的DOM,然后用新的DOM去替换掉body中和vue实例相匹配的DOM(在之前的代码中,是替换掉id=rootdiv标签),最终页面上展示的就是vue实例想要创建出的内容了。


  • 第九步:当页面挂载完成之后,会执行vue中的第三个生命周期函数mounted


  • mounted:在组件内容被渲染到页面之后自动执行的函数


  • beforeMount执行完成之后,就表示页面已经被渲染出来了,此时就会执行mounted函数


mounted(){
   console.log('mounted函数')
},
复制代码


D_]T}GV6K[XK)(CQ23NFBLG.png


beforeMount和mounted对比


代码运行成功之后,只能看到浏览器上打印出来的顺序,但是不知道页面渲染的情况,那么下面我们就一起来对beforeMountmounted两个函数做一个对比。


<body>
    <div id="root"></div>
</body>
复制代码


  • body里面,是有一个id = root的标签元素


Vue.createApp({
    data(){
        return {
            message: 'Hello World'
        }
    },
    beforeCreate(){
        console.log('beforeCreate函数')
    },
    created(){
        console.log('created函数')
    },
    beforeMount(){
        console.log(document.getElementById('root').innerHTML, 'beforeMount函数')
    },
    mounted(){
        console.log(document.getElementById('root').innerHTML, 'mounted函数')
    },
    template: "<div>{{message}}</div>"
}).mount('#root');
复制代码


  • beforeMountmounted两个函数里面,我们打印一下root下面的innerHTML内容


$C~YTSE%(2GV~87MXXWWUT7.png


  • 通过打印出来的内容可以看出,页面加载完成之后,但是模板还没生成render函数时,beforeMount函数前面是没有打印出任何数据的。在页面渲染完成之后,mounted函数就会打印出root标签下渲染的内容了。


做完上面九个步骤之后,一个完整的vue页面就被渲染出来了,但是我们看到图中还有其他的四个生命周期函数,这四个生命周期函数并不是主动触发的,而是当你有操作之后才会触发的,下面我们就详细讲解一下这四个生命周期函数吧。


  • beforeUpdate:当data中的数据发生变化时自动执行的函数


  • 首先我们把代码里面的逻辑改造一下,为了后面方便触发函数,并在代码中写上了beforeUpdate函数


const app = Vue.createApp({
    data(){
        return {
            message: 'Hello World'
        }
    },
    beforeCreate(){
        console.log('beforeCreate函数')
    },
    created(){
        console.log('created函数')
    },
    beforeMount(){
        console.log('beforeMount函数')
    },
    mounted(){
        console.log('mounted函数')
    },
    beforeUpdate(){
        console.log('beforeUpdate函数')
    },
    template: "<div>{{message}}</div>"
});
const vm = app.mount('#root');
复制代码


image.png


但是在浏览器中,并没有看到beforeUpdate被执行,这时候我们应该怎么触发效果呢?


在下图中,我们可以看到用vm.$data改变data里面的数据时,会自动执行beforeUpdate函数,而且是在页面渲染之前触发的。


@(A0~Q0Y6Y49IG1$K92E6TF.png


  • updated:当data中的数据发生变化,同时页面完成更新后,会自动执行的函数


  • beforeUpdate的代码基础上,我们加上updated函数


updated(){
    console.log('updated函数')
},
复制代码


Y58L`P7`LB@Z0~MO{HGZ_F4.png


此时打开浏览器更新的时候,发现并没有很直观的感受,那么我们就对这两个函数做一个对比看看。


beforeUpdate和updated对比


我们像上面对比beforeMountmounted函数时一样,将root标签里面的innerHTML打印出来看看


beforeUpdate(){
    console.log(document.getElementById('root').innerHTML, 'beforeUpdate函数')
},
updated(){
    console.log(document.getElementById('root').innerHTML, 'updated函数')
},
复制代码


I4RA)1Y(7)UHU5R8]H~`0HF.png


根据浏览器中的输出内容可以看出,在beforeUpdate函数执行的时候,还未更新data中的数据,所以打印出来的还是之前的innerHTML内容;但是当更新完成之后,就会在updated函数中打印出新的innerHTML内容了。


把上面的生命周期函数搞懂之后,接下来就是最后两个生命周期函数了。


当vue实例创建完成之后,页面也会挂载到id=root的节点上,但是当我们不想要挂载了,想要把vue实例给销毁掉,那我们应该怎么操作呢?


  • 上面生命周期的图示中已经给到答案了,就是用app.unmount函数可以模拟操作销毁vue实例


LNJ7YVL_GILJ)G74UNMJW`8.png


当执行app.unmount函数之后,页面上渲染的内容也被清空了,此时也就表示vue实例被销毁了。


  • beforeUnmount:当vue应用失效时,自动执行的函数


  • unmounted:当vue应用失效时,且DOM完全销毁之后,自动执行的函数


beforeUnmount(){
    console.log('beforeUnmount函数')
},
unmounted(){
    console.log('unmounted函数')
},
复制代码


SFYNSK(ER{PQ2(L5Y7VFA5I.png


beforeUnmount和unmounted对比


同样,我们可以在这两个函数里面打印innerHTML来看看最终的效果


beforeUnmount(){
    console.log(document.getElementById('root').innerHTML, 'beforeUnmount函数')
},
unmounted(){
    console.log(document.getElementById('root').innerHTML, 'unmounted函数')
},
复制代码


LI}{L8WJXPNTUSWC]{Y6[_R.png


在页面销毁之前,也就是beforeUnmount函数执行时,页面的内容还是不变的;当页面彻底销毁之后,unmounted函数打印出来的内容就没有vue实例里面的任何节点内容了。


总结


在本节内容中,我们主要学习了vue所有的生命周期函数:beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeUnmountunmounted


但是生命周期这么多,该如何使用呢?在后面的文章中,会用各种案例带着大家对生命周期的使用有更多的了解。

相关文章
|
3天前
|
JavaScript
|
3天前
|
JavaScript
vue3 生命周期
【10月更文挑战第14天】vue3 生命周期
|
2天前
|
JavaScript 前端开发 API
深入探索挖掘vue3 生命周期
【10月更文挑战第10天】
13 0
|
2天前
|
缓存 JavaScript 前端开发
《基础篇第4章:vue2基础》:使用vue脚手架创建项目
《基础篇第4章:vue2基础》:使用vue脚手架创建项目
11 3
|
4天前
|
JavaScript 前端开发 开发者
Vue v-for 进阶指南:in 与 of 的区别及应用场景 | 笔记
Vue.js 中的 v-for 是强大的遍历指令,但其中的 in 和 of 关键字往往被开发者忽视。尽管它们的用法相似,但适用的场景和数据结构却各有不同。本文将详细探讨 v-for 中 in 和 of 的区别、适用场景以及在实际开发中的最佳使用时机。通过理解它们的差异,你将能够编写更加高效、简洁的 Vue.js 代码,灵活应对各种数据结构的遍历需求。
40 6
|
2天前
|
缓存 JavaScript
Vue 中 computed 与 method 的区别
【10月更文挑战第15天】computed 和 method 是 Vue 中两个重要的选项,它们在功能和特点上存在着明显的区别。理解并合理运用它们的区别,可以帮助我们构建更高效、更具可维护性的 Vue 应用。在实际开发中,要根据具体情况灵活选择使用,以满足不同的需求。
5 2
|
2天前
|
JavaScript 搜索推荐 UED
vue的自定义指令
【10月更文挑战第14天】Vue 自定义指令为我们提供了一种强大的工具,使我们能够更灵活地控制和扩展 Vue 应用的行为。通过合理地使用自定义指令,可以提高开发效率,增强应用的功能和用户体验。
|
5天前
|
缓存 JavaScript 前端开发
Vue 中动态导入的注意事项
【10月更文挑战第12天】 在 Vue 项目中,动态导入是一种常用的按需加载模块的技术,可以提升应用性能和效率。本文详细探讨了动态导入的基本原理及注意事项,包括模块路径的正确性、依赖关系、加载时机、错误处理、缓存问题和兼容性等,并通过具体案例分析和解决方案,帮助开发者更好地应用动态导入技术。
|
5天前
|
JavaScript API
vue 批量自动引入并注册组件或路由等等
【10月更文挑战第12天】 vue 批量自动引入并注册组件或路由等等
|
4天前
|
JavaScript UED
Vue + ElementUI 实现动态添加和删除表单项的多层嵌套表单
【10月更文挑战第5天】本示例展示了如何在 Vue.js 中使用 Element UI 组件实现动态添加和删除嵌套表单项。该表单包含设备信息、设备部位及其对应的任务列表,支持用户动态添加设备部位和任务,并提供相应的表单验证规则。
23 0
Vue + ElementUI 实现动态添加和删除表单项的多层嵌套表单