在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中则能正常获取。
- Vue.component("demo1", {
- data: function() {
- return {
- name: "",
- age: "",
- city: ""
- };
- },
- template: "<ul><li id='name'>{{name}}</li><li>{{age}}</li><li>{{city}}</li></ul>",
- created: function() {
- this.name = "唐浩益";
- this.age = "12";
- this.city = "杭州";
- var x = document.getElementById("name"); // 报错:x为undefined
- console.log(x.innerHTML); // 抛出TypeError
- },
- mounted: function() {
- var x = document.getElementById("name"); // 正常获取元素
- console.log(x.innerHTML); // 输出“唐浩益”
- }
- });
- new Vue({
- el: "#example1"
- });
复制代码
运行后,页面成功渲染三个列表项,但控制台在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项目代码的健壮性。 |