onmounted 是 vue 3 中操作真实 dom 的安全且推荐时机;应使用模板 ref(如 ref="container" 配合 const container = ref(null))而非 document 查询,确保元素存在后再操作,并注意 ssr 不执行、避免阻塞主线程及子组件就绪问题。

在 Vue 3 单文件组件中,onMounted 是操作真实 DOM 的**安全且推荐的时机**——此时组件模板已完成渲染,DOM 元素已插入页面,但子组件可能尚未全部就绪。
确保 DOM 元素可访问的两种方式
不能直接用 document.getElementById 或 querySelector 查找动态生成或条件渲染的元素(如 v-if 控制的节点),应优先使用 模板引用(template ref):
- 在
<template></template>中给目标元素添加ref="xxx" - 在
setup中声明同名响应式引用(const xxx = ref(null)) -
onMounted回调中,xxx.value就是该 DOM 元素实例
示例:
<script setup>
import { onMounted, ref } from 'vue'
const container = ref(null)
<p>onMounted(() => {
if (container.value) {
console.log('DOM 元素已就绪:', container.value)
container.value.focus() // 可安全调用原生方法
}
})
</script><p><template><div ref="container" tabindex="0">可聚焦容器</div>
</template></p>
避免常见错误操作
即使在 onMounted 中,也要注意以下限制:
- 不要修改响应式数据来触发新一轮更新(否则可能干扰当前渲染流程)
- 不建议在
onMounted中执行耗时同步操作(如大量 DOM 遍历),会阻塞主线程 - 若需操作子组件的 DOM,需确认其是否已挂载;对异步组件或
<suspense></suspense>内容,onMounted不保证其子节点已就绪 - 服务端渲染(SSR)时,
onMounted不会执行,所有 DOM 操作必须限定在客户端
结合第三方库初始化的典型场景
图表、富文本编辑器、地图等依赖真实 DOM 的库,应在 onMounted 中初始化:
- 传入正确的 DOM 容器引用(非字符串选择器)
- 检查引用是否存在,避免空值报错
- 如有清理需求(如销毁实例),对应在
onBeforeUnmount中处理
例如初始化 ECharts:
onMounted(() => {
const chartDom = chartRef.value
if (chartDom) {
const chart = echarts.init(chartDom)
chart.setOption({ /* 配置项 */ })
// 保存实例,便于后续更新或销毁
}
})
需要访问多个 DOM 节点时的处理技巧
当一个组件内需操作多个动态元素,可统一用 ref 绑定,或用 querySelectorAll 配合 onMounted:
- 多个独立 ref:分别声明
ref1、ref2… 更清晰可控 - 批量查询:用
container.value?.querySelectorAll('.item'),前提是容器本身已通过 ref 获取 - 避免在
onMounted外提前读取.value(仍为 null)
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











