异步请求到底放在生命周期中的created还是mounted?

异步请求到底放在生命周期中的created还是mounted

在这里插入图片描述

  created(){
	setTimeout(()=>{
      console.log('created',this.$el)
    },3000)
  	console.log('createdSync',this.$el)
  },
  mounted() {
    setTimeout(()=>{
      console.log('mounted',this.$el)
    },1000)
  	console.log('mountedSync',this.$el)
 }
 
//执行结果:
//createdSync  undefined
//mountedSync  <div>...</div>
//mounted  <div>...</div>(组件加载后的第1秒打印
//created  <div>...</div>(组件加载后的第3秒打印

created 和 mounted 是在同一个 tick 中执行的,而ajax 请求的时间一定会超过一个 tick。所以即便ajax的请求耗时是 0ms, 那么也是在 nextTick 中更新数据到 DOM 中。所以说在不依赖 DOM 节点的情况下一点区别都没有。

从执行结果可以看出,“mountedSync”和“mounted“的打印并没有因为create中的异步任务而阻塞mounted的执行

ajax是异步,所以根据EvenLoop事件循环机制,creaed跟mounted是同步调用的,ajax是异步任务,会经历一次EventLoop在created()、mounted()之后执行其中的异步宏微任务(如ajax请求),所以ajax不论是created还是beferCreated都一定会延迟到mounted()之后执行,所以即便ajax放到beferCreated()钩子中,ajax回调依旧可以操作子组件或节点。

问题

  1. 哪种方式更快的问题:有人会觉得ajax放在creaed中提前执行,会比mounted中挂载组件后再执行ajax更省时。
    答:普遍觉得因为creaed在挂载前提前请求数据的话,也比mounted挂载后再请求数据更快渲染出完整页面。但不论creaed还是beferCreated还是mounted,都是一样的,ajax异步都会因EvenLoop延迟至mounted后调用。所以不存在creaed比mounted更快的这一说。
  2. 白屏的问题:同样,普遍觉得create执行并且执行完内部的ajax异步后才会再执行mounted,认为create中的异步请求会阻塞mounted的挂载,造成白屏问题。但实际上create中的异步任务并不会阻塞mounted的挂载操作,从而不会带来所谓的因为将ajax放至creaed就会带来白屏问题。

结论:ajax异步请求的参数或databody不依赖dom的话,放在created和mounted都可以

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值