面试题:Vue 在 created 和 mounted 这两个生命周期钩子中请求数据有什么区别?

在 Vue 中,createdmounted 都是常用的生命周期钩子,都可以用来发起数据请求,但它们在执行时机适用场景上存在关键区别。

1. 执行时机

  • created 钩子
    • 在实例创建完成后立即调用。
    • 此时,Vue 实例已经完成了数据观测 (data observer)、属性和方法的运算、watch/event 事件回调的配置。
    • 但是,$el (挂载的 DOM 元素) 还没有被创建,页面上的 DOM 节点尚未生成。
  • mounted 钩子
    • 在实例被挂载到 DOM 之后调用。
    • 此时,vm.$el 已经被创建并替换掉了 el 选项所指向的 DOM 元素。
    • 页面上的 DOM 节点已经真实存在,可以进行 DOM 操作。

2. 在哪个钩子请求数据的区别

特性created 中请求数据mounted 中请求数据
数据获取时机更早。实例一创建就发起请求,能更快地获取数据。稍晚。需要等待模板挂载完成才发起请求。
对首屏渲染的影响推荐。数据获取与 DOM 渲染可以并行。获取到数据后,视图可以立即更新。⚠️ 不推荐(对首屏)。请求被延迟到 DOM 挂载后,增加了用户等待时间。
能否操作 DOM不能。此时 DOM 尚未生成,无法访问 this.$el 或使用 document.querySelector可以。DOM 已经存在,可以安全地进行 DOM 操作。
SSR (服务端渲染) 支持支持created 在服务端和客户端都会执行,适合 SSR 数据预取。不支持mounted 只在客户端执行,服务端渲染时不会调用。

3. 实际应用建议

  • 绝大多数情况下,应该在 created 钩子中请求数据
    • 原因:这样做可以让数据请求尽早开始,与视图的首次渲染并行进行。一旦数据返回,视图就能立即更新,从而缩短用户看到最终内容的等待时间,提升用户体验。
    • 示例:加载用户信息、文章列表、商品详情等首屏核心数据。
  • mounted 钩子中请求数据的场景
    • 需要依赖 DOM 的数据请求:例如,请求的数据需要根据某个 DOM 元素的尺寸、位置或内容来决定。
    • 第三方库初始化:某些需要操作 DOM 的第三方库(如图表库、地图)的初始化代码和数据请求放在 mounted 中更安全。
    • 非首屏关键数据:一些不影响首屏渲染的次要数据或“懒加载”内容。

总结

对比项createdmounted
执行时间早 (实例创建后)晚 (DOM 挂载后)
DOM 状态未生成已生成
数据请求时机早,推荐晚,不推荐(首屏)
适合场景首屏核心数据依赖 DOM 或非关键数据

核心结论:为了优化性能和用户体验,应该优先在 created 钩子中发起数据请求。只有在确实需要操作 DOM 才能决定如何请求数据时,才考虑使用 mounted

THE END
喜欢就支持一下吧
点赞6 分享