0

0

vue 中 mounted 生命周期作用 vue 中 mounted 生命周期的使用场景

月夜之吻

月夜之吻

发布时间:2025-07-22 16:54:02

|

571人浏览过

|

来源于php中文网

原创

mounted钩子在vue组件挂载到dom后触发,用于执行依赖dom的操作。1. 初始化需dom的第三方库(如echarts、地图sdk);2. 直接操作dom元素(推荐使用ref而非queryselector);3. 发送依赖dom尺寸的请求;4. 设置全局事件监听器(须在beforeunmount中清理以防内存泄漏)。与created区别在于:created无dom访问权限,适合早于dom阶段的数据请求;mounted有dom访问权(this.$el、this.$refs),适合需真实dom的逻辑。数据请求优先放created以提升性能,仅当依赖dom时才放mounted,ssr场景下mounted不执行,需注意同构兼容性。

vue 中 mounted 生命周期作用 vue 中 mounted 生命周期的使用场景

mounted 是 Vue 组件生命周期中一个非常关键的钩子,它在组件挂载到DOM之后立即被调用。简单来说,就是当你的组件在浏览器里“活过来”并呈现在用户眼前时,这个钩子就触发了。它的主要作用是执行那些需要DOM存在的操作,比如初始化第三方库、发送数据请求(如果数据依赖DOM),或者直接操作DOM元素。

vue 中 mounted 生命周期作用 vue 中 mounted 生命周期的使用场景

解决方案

在我看来,理解 mounted 钩子,就像理解一个舞台剧的开幕。created 阶段是演员在后台准备,剧本都捋顺了,数据也到位了。但真正的“表演”——也就是组件在用户屏幕上呈现——得等到 mounted。在这个时刻,你的组件模板已经被编译成真实的HTML元素,并且被插入到了文档流中。这意味着,你终于可以安全地访问到 this.$el(组件的根DOM元素)以及通过 ref 标记的任何子元素了。

为什么这很重要?因为很多前端操作,尤其是与第三方库交互,或者需要测量、绘制DOM的场景,都必须在DOM元素实际存在后才能进行。比如,你想用ECharts画个图,或者用D3.js操作SVG,这些库都需要一个真实的DOM容器来承载它们的输出。如果你在 created 里就尝试这些,那多半会报错,因为容器还没影儿呢。

立即学习前端免费学习笔记(深入)”;

vue 中 mounted 生命周期作用 vue 中 mounted 生命周期的使用场景

我个人在使用 mounted 时,最常见的场景就是:

  1. 初始化需要DOM的第三方库:比如一个日历选择器、一个富文本编辑器、一个图表库(ECharts, Chart.js)、或者一个地图SDK(高德、百度地图)。这些东西都需要一个宿主DOM元素才能工作。
  2. 直接操作DOM:虽然Vue推崇数据驱动,尽量少直接操作DOM,但总有些时候你不得不这么做。比如,你想给某个特定的元素添加一个非Vue管理的事件监听器,或者做一些复杂的动画,甚至只是简单地获取一个元素的实际宽度或高度。
  3. 发送依赖DOM的请求:虽然大部分数据请求在 created 阶段就可以发了,但如果你的数据请求参数需要依赖DOM的尺寸、位置等信息,那 mounted 就是合适的时机。比如,你可能需要根据容器的宽度来决定加载哪种尺寸的图片。
  4. 设置全局事件监听:例如,监听 windowresize 事件来响应式调整布局,或者监听 document点击事件来关闭一个弹出层。不过,这里有个小提醒,在 mounted 里添加的全局事件监听器,记得在 beforeUnmount 里移除,不然可能会导致内存泄漏。

mountedcreated 的区别:何时选择谁?

说实话,这是个老生常谈的问题,但确实是理解Vue生命周期的核心。简单来说:

vue 中 mounted 生命周期作用 vue 中 mounted 生命周期的使用场景
  • created:这个钩子是在组件实例被创建之后、数据观测 (data observation) 和属性/方法初始化完成之后立即调用的。此时,组件的数据 data、计算属性 computed、方法 methods 等都已经可用了。但是,DOM还没有被渲染。换句话说,你还看不到 this.$el,也没有任何真实的HTML元素。
    • 适用场景:我通常会把不依赖DOM的数据请求放在这里。比如,加载用户配置、初始化一些不涉及UI的业务逻辑。这样做的好处是,数据可以更早地开始加载,甚至在组件的DOM结构还没完全准备好之前,这样用户感知到的加载时间可能会更短。
  • mounted:正如前面所说,这个钩子是在组件的模板被渲染成真实的DOM节点,并且被挂载到页面上之后才调用的。此时,this.$el 已经指向了组件的根DOM元素,你也可以通过 this.$refs 访问到模板中带有 ref 属性的子元素。
    • 适用场景:所有需要操作或依赖真实DOM的操作。比如,初始化第三方UI库、获取DOM元素的尺寸、设置Canvas绘图上下文等。

我个人在实际项目中,如果只是单纯地获取数据,通常会优先选择 created。因为数据加载往往是异步的,早点开始总没错。但如果我的组件需要一个图表,而这个图表必须绘制在一个特定的 div 里,并且可能需要根据这个 div 的实际宽度来初始化,那么 mounted 才是我的不二选择。

mounted 中进行数据请求:是最佳实践吗?

这个问题其实没有绝对的“是”或“否”,更多的是“看情况”。

从性能优化的角度看,如果你的数据请求不依赖于DOM,那么在 created 中发起请求通常是更好的选择。因为 created 阶段比 mounted 更早,这意味着你的数据可以在组件渲染DOM的同时开始加载,甚至可能在DOM渲染完成之前数据就已返回。这样可以避免用户在看到页面结构后,还要等待数据填充的空白期。尤其是在一些需要快速响应的场景下,这一点点的提前量可能就会带来更好的用户体验。

Rose.ai
Rose.ai

一个云数据平台,帮助用户发现、可视化数据

下载

但是,总有那么些特殊情况,你可能不得不把数据请求放在 mounted 里:

  1. 数据请求依赖DOM尺寸或属性:比如,你需要根据组件渲染后的实际宽度来决定请求不同分辨率的图片,或者为图表组件获取数据时,需要先初始化图表容器才能知道其可用的绘制区域大小。这种情况下,mounted 是你唯一的选择,因为只有这时DOM才真正可用。
  2. 与第三方库结合:有些第三方库可能需要先在 mounted 中完成初始化,然后才能通过其API发起数据请求。虽然这种情况相对少见,但确实存在。

还需要注意的是 SSR (Server-Side Rendering) 的场景。在SSR中,mounted 钩子是不会在服务器端执行的,因为它涉及到浏览器环境的DOM操作。而 created 钩子则会在服务器端执行。所以,如果你正在构建一个同构应用(Isomorphic App),并且希望数据在服务器端就能预取,那么 createdbeforeCreate (或者 Composition API 中的 setup 函数顶层)是更合适的选择。在 mounted 中发起的请求只会在客户端执行。

所以,我的建议是:优先考虑在 created 中进行数据请求。如果你的数据请求确实需要DOM的存在,或者你的应用是纯客户端渲染,那么在 mounted 中进行也完全没问题。关键在于理解不同生命周期钩子的执行时机和它们能访问到的上下文。

如何在 mounted 中安全地操作 DOM?

mounted 钩子中操作DOM,是其最核心的功能之一。但要“安全”地操作,意味着要遵循一些最佳实践,避免常见的坑。

首先,Vue本身是数据驱动的,它鼓励我们通过修改数据来让视图自动更新,而不是直接操作DOM。但总有一些场景,你确实需要绕过Vue的响应式系统,直接与底层的DOM元素打交道。

1. 使用 this.$el 访问根元素:this.$el 指向当前组件的根DOM元素。如果你只需要操作组件的最外层容器,这个属性非常方便。

<template>
  <div class="my-component">
    <!-- content -->
  </div>
</template>

<script>
export default {
  mounted() {
    // 假设你想给这个根div添加一个类名,或者获取它的宽度
    console.log('Component root element:', this.$el);
    this.$el.style.backgroundColor = 'lightblue';
  }
}
</script>

2. 使用 ref 访问特定子元素(推荐): 这是在Vue中访问组件内部特定DOM元素的首选方式。通过在模板元素上添加 ref 属性,你可以在 mounted 之后,通过 this.$refs 对象来访问到这些元素。

<template>
  <div>
    <canvas ref="myCanvas"></canvas>
    <button @click="drawOnCanvas">Draw</button>
  </div>
</template>

<script>
export default {
  mounted() {
    // 初始化一个Canvas上下文,通常需要等到DOM元素可用
    const canvas = this.$refs.myCanvas;
    if (canvas) { // 总是检查一下,以防万一
      const ctx = canvas.getContext('2d');
      ctx.fillStyle = 'red';
      ctx.fillRect(0, 0, 100, 100);
    }
  },
  methods: {
    drawOnCanvas() {
      // 可以在mounted之后,通过方法继续操作这个DOM元素
      const canvas = this.$refs.myCanvas;
      if (canvas) {
        const ctx = canvas.getContext('2d');
        ctx.fillStyle = 'blue';
        ctx.fillRect(50, 50, 100, 100);
      }
    }
  }
}
</script>

安全操作的注意事项:

  • 避免直接使用 document.querySelectorgetElementById:尽管它们能工作,但这种方式会使你的组件与全局DOM结构紧密耦合,降低组件的可复用性。如果页面上有多个相同组件的实例,或者DOM结构发生变化,你的选择器可能会失效或选中错误的元素。ref 机制是Vue提供的一种更安全、更局部的访问方式。
  • 清理副作用:如果你在 mounted 中添加了全局的事件监听器(比如 window.addEventListenerdocument.addEventListener),或者初始化了需要销毁的第三方实例(比如地图实例、图表实例),那么务必在组件销毁前(即 beforeUnmount 钩子中)进行清理。否则,这些监听器或实例会继续存在于内存中,导致内存泄漏。
<template>
  <div>
    <p>Window width: {{ windowWidth }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      windowWidth: window.innerWidth
    };
  },
  mounted() {
    // 在mounted中添加resize事件监听器
    this.handleResize = () => {
      this.windowWidth = window.innerWidth;
    };
    window.addEventListener('resize', this.handleResize);
  },
  beforeUnmount() {
    // 在组件销毁前移除监听器,防止内存泄漏
    window.removeEventListener('resize', this.handleResize);
  }
}
</script>
  • 警惕非响应式更新:当你直接操作DOM时,Vue的响应式系统不会追踪这些变化。如果你通过 this.$refs.someElement.textContent = 'New Text' 改变了内容,Vue的数据 dataprops 并不会随之更新,也不会触发Vue的重新渲染。如果你的DOM操作最终需要反映到Vue的数据模型上,或者需要触发Vue的后续渲染,你可能需要重新审视你的方法,看看是否可以通过数据绑定来实现。

总的来说,mounted 是你与真实DOM“亲密接触”的绝佳时机。只要记住通过 ref 安全地访问元素,并在离开时清理好现场,你就能充分利用它的强大功能。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
ECharts是什么
ECharts是什么

ECharts是基于JavaScript的开源可视化库,能够帮助开发者轻松地实现各种复杂的数据可视化效果,提供了丰富的图表类型和交互功能。本专题为大家提供ECharts是什么的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.08.04

echarts自适应大小设置
echarts自适应大小设置

使用ECharts的自适应大小设置可以使图表能够根据不同屏幕尺寸和设备进行自适应。一种是使用resize事件,在图表容器大小改变时重新渲染图表;另一种是使用CSS样式,通过设置图表容器的宽度和高度为百分比值,使图表容器根据父元素的大小进行自适应。根据实际需求选择合适的方法,可以使图表在不同设备上都能够良好地显示和交互 。

487

2023.09.13

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

531

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

576

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

6257

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

492

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 9.5万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号