查看: 81|回复: 1

Vue.js created和mounted生命周期钩子区别:DOM操作时机详解

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
在Vue.js开发中,生命周期钩子是控制组件初始化、渲染、更新和销毁的关键手段。很多新手容易混淆created和mounted这两个钩子,尤其是在进行DOM操作或初始化插件时遇到报错。本文通过实际代码示例,梳理created和mounted的执行时机与应用场景,帮助开发者准确选择。

## 一、生命周期钩子概述

Vue实例会经历一系列初始化过程:配置data观测、编译模板、挂载实例到DOM,并在数据变化时更新DOM。每个阶段都会调用对应的生命周期钩子,方便开发者插入自定义逻辑。例如,created在实例创建完成后调用,mounted在模板渲染到DOM后调用。

## 二、created与mounted的核心区别

根据官方生命周期图示,可以归纳两点:
- created:在模板渲染成HTML之前调用。此时数据观测已完成,可以操作data,但HTML尚未生成,因此无法获取真实DOM节点。
- mounted:在模板渲染成HTML之后调用。此时DOM已挂载,可以访问和操作真实DOM元素。

## 三、典型问题:在created中操作DOM报错

下面是一个常见错误示例。定义一个组件,在created中尝试通过document.getElementById获取DOM元素,会抛出“找不到元素”的错误;而在mounted中则能正常获取。
  1. Vue.component("demo1", {
  2.   data: function() {
  3.     return {
  4.       name: "",
  5.       age: "",
  6.       city: ""
  7.     };
  8.   },
  9.   template: "<ul><li id='name'>{{name}}</li><li>{{age}}</li><li>{{city}}</li></ul>",
  10.   created: function() {
  11.     this.name = "唐浩益";
  12.     this.age = "12";
  13.     this.city = "杭州";
  14.     var x = document.getElementById("name");  // 报错:x为undefined
  15.     console.log(x.innerHTML);                 // 抛出TypeError
  16.   },
  17.   mounted: function() {
  18.     var x = document.getElementById("name");  // 正常获取元素
  19.     console.log(x.innerHTML);                 // 输出“唐浩益”
  20.   }
  21. });
  22. new Vue({
  23.   el: "#example1"
  24. });
复制代码

运行后,页面成功渲染三个列表项,但控制台在created阶段报错:“Uncaught TypeError: Cannot read property 'innerHTML' of null”。这是因为created时模板尚未渲染到DOM,document.getElementById找不到id为“name”的元素。而mounted时模板已经挂载,可以顺利获取DOM元素并输出内容。

## 四、实际应用场景

- created:常用于初始化数据、调用接口获取页面初始数据(如axios请求),此时可以安全设置data中的属性值,因为数据会驱动后续模板渲染。
- mounted:常用于需要操作真实DOM的场景,比如初始化第三方图表库(如Chart.js、ECharts)、绑定事件、获取元素尺寸等。例如使用Chart.js时,必须在mounted中调用var ctx = document.getElementById('myChart'),否则元素不存在。

## 五、总结

- created钩子在实例创建后、模板渲染前调用,适合处理数据初始化。
- mounted钩子在模板渲染完成、DOM挂载后调用,适合执行需要DOM的操作。
- 不要在created中直接操作DOM节点,否则会因元素未渲染而报错。
- 理解两者区别,能有效避免开发中的常见坑点,提高Vue项目代码的健壮性。
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层

Re: Vue.js created和mounted生命周期钩子区别:DOM操作时机详解

感谢楼主分享的这篇详解!例子很直观,created里拿不到DOM那个报错确实是新手常见坑,用console.log把报错展示出来特别有帮助。我补充一点小经验:有时在mounted里操作DOM如果依赖子组件渲染,可能还需要配合$nextTick或者updated,不过绝大多数情况用mounted就够了。楼主的总结很清晰,已收藏。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-12 22:14 , Processed in 0.029058 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部