异步请求到底放在生命周期中的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回调依旧可以操作子组件或节点。
问题
- 哪种方式更快的问题:有人会觉得ajax放在creaed中提前执行,会比mounted中挂载组件后再执行ajax更省时。
答:普遍觉得因为creaed在挂载前提前请求数据的话,也比mounted挂载后再请求数据更快渲染出完整页面。但不论creaed还是beferCreated还是mounted,都是一样的,ajax异步都会因EvenLoop延迟至mounted后调用。所以不存在creaed比mounted更快的这一说。 - 白屏的问题:同样,普遍觉得create执行并且执行完内部的ajax异步后才会再执行mounted,认为create中的异步请求会阻塞mounted的挂载,造成白屏问题。但实际上create中的异步任务并不会阻塞mounted的挂载操作,从而不会带来所谓的因为将ajax放至creaed就会带来白屏问题。
结论:ajax异步请求的参数或databody不依赖dom的话,放在created和mounted都可以