On this page
created与mounted钩子的差异与应用
created和mounted生命周期钩子分别在什么时间节点触发?从数据初始化、DOM访问权限、第三方库集成等角度,说明两者的典型应用场景及使用限制。
考察点分析
该题主要考察候选人对Vue.js核心机制的理解深度及工程实践能力,重点评估:
- 生命周期阶段认知:能否准确区分不同生命周期钩子的执行时机
- 响应式系统理解:数据初始化与DOM渲染的时序关系
- 框架整合能力:第三方库集成时的生命周期选择策略
- SSR兼容意识:服务端渲染场景下的特殊处理
技术解析
关键知识点
生命周期时序 > DOM渲染机制 > SSR限制 > 第三方库初始化
原理剖析
Vue生命周期中:
created
:组件实例创建完成,数据观测/计算属性/watch已配置,但尚未挂载DOM($el
未创建)mounted
:组件挂载到真实DOM后触发,可通过$el
访问渲染结果
数据初始化应在created
阶段完成,因为此时已建立响应式数据但未触发渲染消耗。访问DOM必须等待mounted
,因Virtual DOM到真实DOM的挂载是异步过程。
常见误区
- 在
created
中使用document.querySelector
获取组件DOM - 在服务端渲染(SSR)场景的
created
中访问浏览器特有API - 将需要DOM操作的第三方库初始化放在
created
问题解答
created
在组件实例创建后、DOM挂载前触发,用于数据初始化和非DOM相关操作;mounted
在DOM挂载完成后执行,用于DOM操作和需要元素存在的库初始化。典型应用:
- 数据初始化:在
created
中触发API请求,尽早获取数据 - DOM访问:图表库(如ECharts)初始化必须在
mounted
执行 - 第三方库整合:依赖CSS选择器的库(如jQuery插件)需等待
mounted
- SSR兼容:避免在
created
中使用window
等浏览器特有对象
解决方案
export default {
async created() {
// 正确:数据初始化
this.userData = await fetchUserData();
// 错误示例:此时DOM未生成
// document.querySelector('.chart') => null
},
mounted() {
// 正确:DOM相关初始化
const chartEl = this.$el.querySelector('.chart');
this.chart = echarts.init(chartEl);
// 添加事件监听(需在beforeDestroy移除)
window.addEventListener('resize', this.handleResize);
},
beforeDestroy() {
window.removeEventListener('resize', this.handleResize);
}
}
优化建议:
- 大数据量使用虚拟滚动时,在
mounted
中计算容器尺寸 - SSR项目通过
process.client
判断执行环境 - 第三方库初始化做好内存管理
深度追问
如何避免组件未挂载时的异步数据更新?
⇒ 使用
this.$nextTick
确保DOM就绪SSR场景如何安全访问window对象?
⇒ 通过
mounted
钩子或process.client
条件判断多次数据更新如何优化DOM操作?
⇒ 在
updated
中使用防抖或标记位控制执行频率
Last updated 06 Mar 2025, 13:07 +0800 .