Vue的生命周期一起来看看


Posted in Vue.js onFebruary 24, 2022

1. 生命周期(重要)

1.1 初步认识生命周期

  • 别名:生命周期回调函数、生命周期函数、生命周期钩子。
  • 生命周期是什么?Vue在关键时刻帮我们调用的一些特殊名称的函数。
  • 生命周期函数的名字不可更改,但函数内部的具体内容由程序员自行编写
  • 生命周期函数中的this指向也是vm 或 组件实例对象。

1.2 生命周期流程(8个)

1.初始化

​ 1.beforeCreate()

​ 2.created()

2.挂载(页面渲染)

​ 1.beforeMount()

​ 2.mounted()

3.更新

​ 1.beforeUpdate()

​ 2.updated()

4.销毁

​ 1.beforeDestory()

​ 2.destoryed()

1.3 生命周期详细流程图

Vue的生命周期一起来看看

1.4 常用的生命周期钩子:

beforeCreate():可以配置全局事件总线,后面会讲到先提一嘴

mounted(): 可以在此阶段发送ajax请求, 启动定时器、绑定自定义事件、订阅消息等异步任务【初始化操作】

beforeDestroy(): 在此阶段做收尾工作, 如: 清除定时器、解绑自定义事件、取消订阅消息等【首尾工作】

1.4.1 关于销毁

  • 销毁后借助Vue开发者工具看不到任何信息
  • 销毁后自定义事件会失效,但原生DOM事件依然有效
  • 一般不会在beforeDestroy操作数据,因为即使操作数据,也不会再触发更新流程了。

1.4.2 关于父子组件的生命周期 

1.加载渲染的过程

父beforeCreate ==> 父created ==> 父beforeMount ==> 子beforeCreate ==> 子created ==> 子beforeMount ==> 子mounted ==> 父mounted

2.更新的过程

父beforeUpdate ==> 子beforeUpdate ==> 子updated ==> 父updated

3.销毁过程

父beforeDestroy ==> 子beforeDestroy ==> 子destroyed ==> 父destroyed

1.5小案例

<div id="root">
        <!-- 让h3透明度产生过渡的效果 -->
        <h3 :style="{opacity:opacity}">欢迎学习Vue!</h3>
        <button @click="des">点击我销毁</button>
    </div>
    <script>
        Vue.config.productionTip = false
        let vm = new Vue({
            el: '#root',
            data: {
                opacity: 1
            },
            methods: {  
                des(){
                    // 触发此函数必定调用,beforeDestroy(),destroyed()
                    this.$destroy()
                }
            },
            mounted() { //挂载
                /*
                		- 完成模板解析后并且将初始的真实的DOM元素挂载到页面后,才执行的函数
                			只会执行一次
                		- this指向Vue
                		- 开发中常用的方法,当我们想要读取某个属性但是读不到,就可以
                		  将该属性绑定到共同能够访问到的元素上,例如下面定时器的例子
                */
                this.timer = setInterval(() => {
                    this.opacity -= 0.01
                    if (this.opacity <= 0)
                        this.opacity = 1
                }, 10);
            },
            beforeDestroy() {
                console.log("beforeDestroy - 清除定时器");
                clearInterval(this.timer)
            },
            destroyed() {
                console.log("destroyed - 销毁完毕")
            },
        })
    </script>

1.6 代码举例说明生命周期钩子

<div id="root">
        <h3>n的值为:{{n}}</h3>
        <button @click="add">点击我n+1</button>
        <button @click="remove">点击销毁vm</button>
    </div>
    <script>
        Vue.config.productionTip = false
        let vm = new Vue({
            el: '#root',
            data: {
                n:1
            },
            methods: {
                add(){
                    this.n++
                },
                remove(){
                    this.$destroy()
                }
            },
            beforeCreate() {
                /* 
                    此时初始化生命周期,事件等,数据代理还未开始
                    vm无法访问到data中的数据,methods中的方法
                */
                console.log("beforeCreate");
                //console.log(this.n);  //undefined
                // console.log(this.add()); // this.add is not a function
                // debugger
            },
            created() {
                /* 
                    已经完成了初始化的数据监视和数据代理
                    vm可以访问到data中的数据和methods的方法
                */
                console.log("created");
                // console.log(this.n);  // 1
                // console.log(this.add());  // undefined
                // debugger
            },
            beforeMount() {
                /*
                    挂载之前,也就是图中的判断框里执行的,此阶段是Vue
                    在解析模板并且生成虚拟DOM存储在内存当中,页面还不能
                    看到解析后的样子
                 */
                 console.log("beforeMount");
                //  debugger
            },
            mounted() {
                /* 
                    完成模板解析后并且将初始的真实的DOM元素挂载到页面后,才执行的函数
                    一般在此:开启一些定时器、发送网络请求、订阅消息、
                    绑定自定义事件等等初始化
                 */
                console.log("mounted");
                // debugger
            },
            beforeUpdate() {
                /* 
                    当数据发生更新后,此时数据已经更新完成,但是页面
                    还是未更新的。
                    也就是面试所问的:页面和尚未和数据保持同步的阶段
                 */
                console.log("beforeUpdate");
            },
            updated() {
                /* 
                    在这之前会进行新旧虚拟DOM比较,最终完成页面的更新
                    此阶段就是页面和数据保持同步
                 */
                 console.log("updated");
            },
            beforeDestroy() {
                /* 
                    当我们调用vm.$destroy时,才会执行下面两个函数,
                    马上要执行销毁阶段,一般在这个阶段做一些收尾操作
                    比如:关掉定时器,取消订阅,解绑自定义事件
                 */
                console.log("beforeDestroy");
            },
            destroyed() {
                /*
                    所有的指令,所有的自定义事件监听器都没了(只留下原生的dom的事件)
                 */
                console.log("destroyed");
            },
        })
    </script>

总结

以上就是今天要讲的内容,本文介绍了生命周期的相关知识,希望对大家有所帮助!

Vue.js 相关文章推荐
Vue如何实现验证码输入交互
Dec 07 Vue.js
Vue+penlayers实现多边形绘制及展示
Dec 24 Vue.js
vue+elementui通用弹窗的实现(新增+编辑)
Jan 07 Vue.js
vue使用echarts画组织结构图
Feb 06 Vue.js
vue打开新窗口并实现传参的图文实例
Mar 04 Vue.js
Vue-Element-Admin集成自己的接口实现登录跳转
Jun 23 Vue.js
vue+element ui实现锚点定位
Jun 29 Vue.js
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 Vue.js
vue实现滑动解锁功能
Mar 03 Vue.js
vue+echarts实现多条折线图
Mar 21 Vue.js
Vue组件化(ref,props, mixin,.插件)详解
May 15 Vue.js
Vue2项目中对百度地图的封装使用详解
Jun 16 Vue.js
Vue的过滤器你真了解吗
Feb 24 #Vue.js
Vue监视数据的原理详解
Feb 24 #Vue.js
Vue的列表之渲染,排序,过滤详解
Vue3如何理解ref toRef和toRefs的区别
Feb 18 #Vue.js
Vue h函数的使用详解
Feb 18 #Vue.js
详解Vue中$props、$attrs和$listeners的使用方法
Feb 18 #Vue.js
前端vue+express实现文件的上传下载示例
You might like
漫荒推荐:画风超赞的国风漫画推荐 超长假期不无聊
2020/03/08 国漫
复杂检索数据并分页显示的处理方法
2006/10/09 PHP
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
2011/07/23 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
PHP框架laravel的.env文件配置教程
2017/06/07 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
jQuery带进度条全屏图片轮播特效代码分享
2020/06/28 Javascript
js绘制购物车抛物线动画
2020/11/18 Javascript
通过jquery实现页面的动画效果(实例代码)
2016/09/18 Javascript
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
2016/11/09 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
详解JavaScript中的属性和特性
2016/12/08 Javascript
Bootstrap缩略图与警告框学习使用
2017/02/08 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
ReactNative列表ListView的用法
2017/08/02 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
JavaScript 监听组合按键思路及代码实现
2020/07/28 Javascript
vue-cli脚手架的.babelrc文件用法说明
2020/09/11 Javascript
如何搜索查找并解决Django相关的问题
2014/06/30 Python
python中如何使用朴素贝叶斯算法
2017/04/06 Python
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
Django用户认证系统 组与权限解析
2019/08/02 Python
Python3 虚拟开发环境搭建过程(图文详解)
2020/01/06 Python
python ubplot使用方法解析
2020/01/10 Python
Python任务调度模块APScheduler使用
2020/04/15 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
Zadig&Voltaire官网:法国时装品牌
2018/01/05 全球购物
加拿大著名的奢侈品购物网站:SSENSE(支持中文)
2020/06/25 全球购物
员工年终自我评价
2014/09/14 职场文书
工资收入证明样本(5篇)
2014/09/16 职场文书
2014年语文教师工作总结
2014/12/18 职场文书
赔偿协议书怎么写
2015/01/28 职场文书