Vue的生命周期

在这里插入图片描述

一、阶段

1.挂载阶段

(1)beforeCreate无法拿到打印信息
(2)created 可以拿到data,已经为Vue实例开辟了内存空间
(3)beforeMount 无法拿到el
(4)mounted 虚拟dom已经挂载在了真实的元素上,可以拿到el

2.更新阶段(改变页面元素时)

(1)beforeUpdate
(2)updated

3.销毁阶段

在这个阶段仍然可以打印出语句,是我们离开这个组件才会被调用的生命周期

(1)beforeDestroy
(2)Destroyed

二、在不同的生命周期阶段我们可以做什么

1.created

在Vue实例创建完毕状态,我们可以去访问data、computed、watch、methods上的方法和数据,但现在还没有将虚拟Dom挂载到真实Dom上,所以我们在此时访问不到我们的Dom元素(el属性,ref属性此时都为空)。我们在此时可以进行一些简单的Ajax,并可以对页面进行初始化之类的操作

2.beforeMount

它是在挂载之前被调用的,会在此时去找到虚拟Dom,并将其编译成Render

3.mounted

虚拟Dom已经被挂载到真实Dom上,此时我们可以获取Dom节点,$ref在此时也是可以访问的。我们在此时可以去获取节点信息,做Ajax请求,对节点做一些操作

4.beforeupdate

响应式数据更新的时候会被调用,beforeupdate的阶段虚拟Dom还没更新,所以在此时依旧可以访问现有的Dom。我们可以在此时访问现有的Dom,手动移除一些添加的监听事件

5.updated

此时补丁已经打完了,Dom已经更新完毕,可以执行一些依赖新Dom的操作。但还是不建议在此时进行数据操作,避免进入死循环(这个坑我曾经踩过)

6.beforeDestroy

在Vue实例销毁之前被调用,在此时我们的实例还未被销毁。在此时可以做一些操作,比如销毁定时器,解绑全局事件,销毁插件对象等

三、父子组件的生命周期

挂载阶段:父组件 beforeMount -> 子组件 created -> 子组件 mounted -> 父组件 mounted
更新阶段:父组件 beforeUpdate -> 子组件 beforeUpdate -> 子组件 updated -> 父组件 updated
销毁阶段:父组件 beforeDestroy -> 子组件 beforeDestroy -> 子组件 destroyed -> 父组件 destroyed

四、请求放在哪个生命周期更合适

为什么created时间比mounted早,请求确不放在created中?
首先,它确实是早了,但是早不了几微秒,所以这其实没有提高性能
其次,我们在created阶段并没有去做渲染,所以在接下来我们会去做Dom渲染,但是如果此时我们还做了Ajax操作,在Ajax结束之后就会返回数据,我们就会将其插入到主线程中去运行,去处理数据,但是我们要知道,在浏览器机制中,渲染线程跟js线程是互斥的,所以有可能我们做渲染的同时,另一边可能要处理Ajax返回的数据了,这时候渲染就有可能被打断,在处理完数组后,去进行重新渲染。
那如果在created中有多个Ajax呢?我们又要重新进行渲染,所以在created去做Ajax请求这明显不太合适。
还有,有的时候我们接到返回的数据的时候可能要在回调函数中去进行一些Dom的操作,可是created阶段我们还没有将真实Dom加载出来,所以相对而言我们还是在mounted去调用要好一些
如果是服务端渲染,我们将其放入created中进行,因为服务端不支持mounted。

原文地址:https://juejin.cn/post/7032881219524100132

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值