vue mounted(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 100w+ 字,讲解图 4013+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3700+ 小伙伴加入学习 ,欢迎点击围观

前言

在 Vue 开发中,组件的生命周期管理是开发者必须掌握的核心概念之一。其中,mounted 钩子函数因其直接关联到 DOM 操作和组件初始化的特性,成为许多场景下的关键工具。无论是处理第三方库集成、表单验证,还是动态修改页面样式,mounted 的灵活运用都能显著提升开发效率。本文将从基础概念到实战案例,系统性解析 vue mounted 的作用原理、应用场景及常见误区,帮助读者在项目中高效使用这一功能。


一、Vue 生命周期与 mounted 的定位

1.1 组件生命周期的比喻

可以将 Vue 组件的生命周期想象为一个新生儿的成长过程:

  • 出生前beforeCreatecreated):如同胎儿阶段,此时组件数据已准备就绪,但尚未与“世界”(DOM)接触。
  • 睁眼时刻beforeMountmounted):婴儿第一次看到外界,组件的 DOM 结构正式生成,开发者可以开始与真实 DOM 交互。
  • 成长阶段beforeUpdateupdated):如同青少年时期,随着数据变化,组件不断更新自身状态。

1.2 mounted 的具体定义

mounted 是 Vue 生命周期中的一个重要钩子函数,它在以下条件满足后触发:

  1. 模板编译完成:Vue 已将模板渲染为虚拟 DOM(Virtual DOM)。
  2. DOM 挂载完成:虚拟 DOM 已替换真实 DOM 节点,并注入到页面中。

此时,开发者可以通过 this.$el 访问到渲染后的 DOM 元素,执行需要依赖真实 DOM 的操作。


二、mounted 与 created 的关键区别

2.1 对比表格:生命周期阶段对比

钩子函数触发条件是否可操作 DOM典型用途
created数据初始化完成发起异步请求、处理数据逻辑
mountedDOM 渲染完成操作 DOM、绑定事件、集成第三方库

2.2 实例演示:通过代码理解差异

// 示例代码:created 与 mounted 的对比
export default {
  created() {
    // 此时 DOM 还未生成,访问 this.$el 会返回空节点
    console.log('created:', this.$el); // 输出:空 <div>  
    this.fetchData(); // 可安全发起异步请求
  },
  mounted() {
    // DOM 已渲染,可安全操作元素
    console.log('mounted:', this.$el); // 输出:完整的渲染后的 DOM 结构
    this.$el.style.backgroundColor = '#f0f0f0'; // 直接修改样式
  }
}

三、mounted 的核心应用场景

3.1 场景一:第三方库的初始化

许多 UI 库(如 Chart.js、TinyMCE)需要在元素渲染完成后才能正确初始化。例如:

// 案例:在 mounted 中初始化 ECharts
mounted() {
  // 确保 DOM 存在后获取元素
  const chartDom = this.$refs.chartContainer;
  const myChart = echarts.init(chartDom);
  myChart.setOption({
    xAxis: { data: ['Mon', 'Tue', 'Wed'] },
    yAxis: {},
    series: [{ type: 'bar', data: [10, 20, 30] }]
  });
}

3.2 场景二:表单验证与焦点控制

当需要默认聚焦输入框或执行表单校验时,mounted 是理想选择:

mounted() {
  // 自动聚焦输入框
  this.$refs.usernameInput.focus();
  
  // 手动触发表单验证
  this.validateForm();
}

3.3 场景三:动态样式与动画

直接操作 DOM 实现 CSS 动画:

mounted() {
  // 添加过渡类名触发 CSS 动画
  this.$el.classList.add('animate-fade-in');
  
  // 或者使用 JavaScript 动态设置样式
  this.$el.style.transform = 'translateX(100px)';
}

四、进阶用法与注意事项

4.1 在 mounted 中处理异步操作

虽然 created 更适合发起异步请求,但在 mounted 中仍可处理依赖 DOM 的异步逻辑。例如:

mounted() {
  this.fetchData().then(data => {
    // 更新数据后重新渲染图表
    this.updateChart(data);
  });
}

4.2 避免在 mounted 中直接修改 props

直接修改 props 会导致 Vue 警告,应通过事件或计算属性替代:

// 错误写法
mounted() {
  this.someProp = 'new value'; // 触发 Vue 警告
}

// 正确写法
mounted() {
  this.$emit('update:someProp', 'new value');
}

4.3 处理 DOM 未更新的异常

当数据变化后立即操作 DOM,可能因虚拟 DOM 更新延迟导致问题。此时可使用 this.$nextTick()

methods: {
  updateContent() {
    this.content = '新内容'; // 数据更新
    this.$nextTick(() => { // 确保 DOM 更新后再操作
      console.log(this.$el.textContent); // 输出新内容
    });
  }
}

五、常见问题与解决方案

5.1 问题:mounted 没有触发

可能原因

  • 组件未被正确挂载到 Vue 根实例。
  • 使用了 v-if 导致组件未渲染。

解决方案
检查模板中组件是否被正确引入,并确保 v-if 条件为真。

5.2 问题:DOM 操作未生效

可能原因

  • created 钩子中尝试操作 DOM。
  • 动态元素未正确绑定 ref

解决方案

  • 将代码移至 mounted 钩子。
  • 确保 ref 名称与模板中的一致:
    <div ref="chartContainer"></div>
    

六、实战案例:实现一个动态标签页组件

6.1 需求分析

构建一个支持自动计算标签宽度、鼠标悬停显示全名的组件,涉及以下步骤:

  1. mounted 中获取标签元素尺寸。
  2. 根据容器宽度动态计算显示的文本。
  3. 监听窗口大小变化更新布局。

6.2 代码实现

export default {
  props: {
    items: Array
  },
  mounted() {
    this.updateLabels(); // 初始化布局
    window.addEventListener('resize', this.updateLabels);
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.updateLabels);
  },
  methods: {
    updateLabels() {
      const containerWidth = this.$refs.container.offsetWidth;
      this.items.forEach(item => {
        const labelElement = this.$refs[`label-${item.id}`][0];
        if (labelElement.offsetWidth > containerWidth * 0.3) {
          item.showTooltip = true;
        }
      });
    }
  }
}

结论

vue mounted 是连接 Vue 数据驱动特性和真实 DOM 的关键桥梁,其应用场景覆盖从基础 DOM 操作到复杂第三方库集成的多个层面。通过理解其生命周期阶段、合理规避常见陷阱,并结合 $nextTick 等工具,开发者能够更高效地构建动态交互丰富的 Vue 应用。建议读者在实际项目中多尝试通过 mounted 实现 DOM 操作,逐步掌握这一核心技能。

提示:实践时可尝试在 mounted 中实现一个动态加载图片的组件,或通过 window.scrollTo 控制页面滚动,进一步巩固相关知识。

最新发布