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渲染完成之前数据就已返回。这样可以避免用户在看到页面结构后,还要等待数据填充的空白期。尤其是在一些需要快速响应的场景下,这一点点的提前量可能就会带来更好的用户体验。

Android入门之Fragment用法 WORD版
Android入门之Fragment用法 WORD版

本文档主要讲述的是Android入门之Fragment用法;Fragment用来描述一些行为或一部分用户界面在一个Activity中,我们可以通过合并多个fragment在一个单独的activity中建立多个UI面板,也可以同时重用fragment在多个activity中。可以认为fragment作为activity的一节模块,fragment有自己的生命周期,接收自己的输入事件,可以从运行中的activity中添加/移除。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载

但是,总有那么些特殊情况,你可能不得不把数据请求放在 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元素。如果你只需要操作组件的最外层容器,这个属性非常方便。



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



安全操作的注意事项:

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


  • 警惕非响应式更新:当你直接操作DOM时,Vue的响应式系统不会追踪这些变化。如果你通过 this.$refs.someElement.textContent = 'New Text' 改变了内容,Vue的数据 dataprops 并不会随之更新,也不会触发Vue的重新渲染。如果你的DOM操作最终需要反映到Vue的数据模型上,或者需要触发Vue的后续渲染,你可能需要重新审视你的方法,看看是否可以通过数据绑定来实现。

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

相关专题

更多
ECharts是什么
ECharts是什么

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

269

2023.08.04

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

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

450

2023.09.13

html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

582

2023.06.14

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

637

2023.06.21

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

456

2023.07.31

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

240

2023.08.01

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2844

2023.08.11

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

500

2023.08.11

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

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

精品课程

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

共42课时 | 5.4万人学习

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

共26课时 | 1.3万人学习

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

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