echart实例数据 本地加载_手把手教你深刻理解vue实例的生命周期和钩子函数

f2e49dd592277a76500db8aa783f45f0.png

虽然经常使用mounted、created等几个钩子函数,但是并没有很系统的将它和生命周期关联一起去理解,这导致我在最近项目里踩了坑。所以现在花点时间,整理一下这方面的知识。

转载链接:https://www.jianshu.com/p/98517bd49179

我的其他文章,也可以了解一下:

《使用vue-cli(vue脚手架)快速搭建项目》

《一张图教你快速玩转vue-cli3》

《手把手教你深入浅出vue-cli3升级vue-cli4的方法》

《手把手教你深入Vue3.0(Vue-cli4)项目打包性能优化实践》

《手把手教你Vue之父子组件间通信实践讲解【props、$ref 、$emit】》

《vue之将echart封装为组件》

1. vue实例的生命周期

通俗来说 vue的生命周期就是vue实例从创建到销毁的过程,我将这个过程中的一些关键点抽取出来,简化为下面这个流程图:

3ffe8d5afb26535370e54b2512cd5389.png

生命周期

2. 结合生命周期理解钩子函数

vue2.0提供了一系列钩子函数,这些函数和生命周期的各个阶段一一对应:

1231519887c1a21ede9b365bcbfdf76d.png

生命周期和钩子函数

钩子函数 描述 beforeCreate 组件实例刚被创建,组件属性计算之前,如data属性等 created 组件实例创建完成,属性已绑定,但DOM还未生成,$el属性还不存在 beforeMount 模板编译 / 挂载之前 mounted 模板编译 / 挂载之后 beforeUpdate 组件更新之前 update 组件更新之后 activated 组件被激活时调用 deactivated 组件被移除时调用 beforeDestory 组件销毁前调用 destoryed 组件销毁后调用

3. 结合代码理解钩子函数

为了更深入的理解各个钩子函数的区别,我们结合代码去看看:

{{ message }}

(1)创建阶段

创建的标志点是New vue(),beforeCreate和created都发生在创建动作之后,但区别在于 beforeCreate触发的时候数据还没初始化和绑定,而created的时候就生成好了,具体我们看看console的内容:

a2975d0bb300058511407adb8d194cbc.png

创建阶段

数据很明显了,beforeCreate触发的时el、data都没初始化,但到created的时候虽然el依然没有初始化,但是data已经生成了,并且成功将message的值绑定上。

(2)挂载阶段

beforeMount和mounted两者主要区别在于模板是否编译和挂载了。

c7351e3c51261183fdfc2a1fb6fe7958.png

挂载阶段

el是用来告诉实例在那个元素上进行挂载的,我们可以看到beforeMount触发的时候el还是没有初始化,而到mounted的时候已经找到要挂载的元素,并且将模板编译了。

大家有没有发现,created和beforeMount的console内容一模一样?看到的时候我自己也疑惑了一下,那这样两个函数有什么区别?翻了一下网上一些文章,我发现他们的console结果和我不一样的:

7ee1376d7faf839f3790aa279d10f84c.png

网友console结果

如果根据这个结果分析的话,beforeMount触发的时候el已经初始化了,但是只是占了坑,挂上了编译前的模板。这和我的结果有挺大出入的,我也没找出是什么原因造成这样的结果差异,大家可以自己亲自试试,再对beforeMount这个函数下定义。

(3)更新阶段

加载页面的时候,其实到mounted这里就结束了,更新和销毁并不会触发到。 这里我另外写了一个方法去改变message的值,触发更新:

 methods:{      change(){        this.message = '不如更新一下咯'      }    },

控制台的结果:

15e428515b2bfce1462d282be6150abc.png

更新阶段

我们可以看到,当我们去改变message的值的时候,触发了beforeUpdate函数,这个时候$el的值已经更改了,但是dom并没有变动。到update的时候,才真正去更新dom结构。

(4)销毁阶段

再写一个方法来触发销毁:

 methods:{      destroy(){        this.$destroy()      }    },

控制台的结果:

3af82bef97e5bf466a56924ffb4ac007.png

可以发现beforeDestory和destoryed打印出来的结果并没有什么特别,el的值data的数据依然在的。这是因为$destroy只是销毁一个实例,清理它与其它实例的连接,解绑它的全部指令及事件监听器,并不会清除data的数据或者清除dom。具体理解可参考:https://cn.vuejs.org/v2/api/#vm-destroy


转载链接:https://www.jianshu.com/p/98517bd49179

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值