Vue created 与 mounted 的时间差

created 和 mounted 钩子之间的时间差受哪些因素影响

问题

Vue 中 createdmounted 两个生命周期钩子之间的调用时间差受什么影响?

解答

createdmounted 分别在实例创建和挂载的不同阶段被调用,它们之间的时间差主要受以下因素影响:

模板编译时间

Vue 需要将模板转换为渲染函数。如果模板包含大量指令、组件或复杂的嵌套结构,编译过程会更耗时。

// 复杂模板会增加编译时间
export default {
  template: `
    <div>
      <complex-component v-for="item in largeList" :key="item.id">
        <nested-component v-if="condition" />
      </complex-component>
    </div>
  `,
  created() {
    console.time('created-to-mounted');
  },
  mounted() {
    console.timeEnd('created-to-mounted');
  }
}

虚拟 DOM 渲染时间

mounted 调用前,Vue 会将虚拟 DOM 渲染为真实 DOM。组件树越复杂、数据绑定越多,渲染时间越长。

export default {
  data() {
    return {
      // 大量数据会增加渲染时间
      items: Array.from({ length: 10000 }, (_, i) => ({ id: i, value: i }))
    }
  }
}

生命周期钩子中的同步操作

createdbeforeMount 等钩子中的同步代码会阻塞挂载流程。

export default {
  created() {
    // 耗时的同步操作会延迟 mounted 的触发
    for (let i = 0; i < 1000000; i++) {
      // 复杂计算
    }
  }
}

异步操作的间接影响

created 中的异步操作本身不会阻塞 mounted,但如果异步操作触发了数据更新,可能导致额外的重新渲染。

export default {
  created() {
    // 异步操作不会直接延迟 mounted
    fetch('/api/data').then(data => {
      // 但数据更新可能触发重新渲染
      this.items = data;
    });
  }
}

浏览器性能

设备硬件配置和浏览器性能会影响模板编译和 DOM 渲染的速度。

关键点

  • 模板复杂度直接影响编译和渲染时间,应避免过深的组件嵌套
  • 生命周期钩子中的同步操作会阻塞挂载流程,耗时操作应异步处理
  • 大量数据绑定会增加虚拟 DOM 渲染时间,可使用虚拟滚动等优化手段
  • 异步操作不会直接延迟 mounted,但可能触发额外的渲染周期