游乐游手机版
首页/前端开发/文章详情

Vue组件Refs全面用法指南:直接访问组件实例与DOM节点

时间:2026-06-30 06:49
Vue 的 ref 必须绑定在模板的具体元素或组件标签上,组件挂载后方可安全使用。它主要用于访问原生 DOM 节点或子组件实例,并支持聚焦、滚动、尺寸测量以及调用通过 expose 暴露的方法。 Vue 的 ref 是访问组件实例与 DOM 节点最直接、最可控的方式,但并非万能钩子,正确把握使用时机
Vue 的 ref 必须绑定在模板的具体元素或组件标签上,组件挂载后方可安全使用。它主要用于访问原生 DOM 节点或子组件实例,并支持聚焦、滚动、尺寸测量以及调用通过 expose 暴露的方法。

Vue 组件 Refs 应用:直接访问组件实例与 DOM 节点

Vue 的 ref 是访问组件实例与 DOM 节点最直接、最可控的方式,但并非万能钩子,正确把握使用时机与方法才能真正发挥其作用。

先从基础说起。ref 绑定的规则并不复杂,牢记以下三个关键点即可。

第一,ref 必须绑定在模板中的具体元素或组件标签上,名称需唯一且符合变量命名规范。例如,为普通 DOM 元素绑定 ,即可获取原生 DOM 节点;为自定义组件绑定 ,则可获得该组件的实例,包括其 methods 和通过 expose 暴露出的内容。

第二,避免直接在 v-for 生成的多个同名 ref 上使用,因为值会被覆盖。若需批量操作,建议改用 ref 函数或配合 querySelectorAll 处理。

总结:绑定要找准位置,命名要规范,批量操作要换思路。

那么,何时才能安全使用 ref?

答案是:只能在组件挂载之后。ref 对应的值在组件挂载后才由 Vue 注入,渲染前访问只能得到 nullundefined。具体到不同 API,用法略有差异:

  • 选项 API:需在 mounted() 钩子内使用 this.$refs.xxx 引用。
  • 组合 API(setup):先声明 const xxx = ref(null),再在 onMounted 中读取 xxx.value
  • 切记:不要在 createdbeforeMount 中尝试读取,因为 DOM 尚未生成,读取无效。

一句话总结:时机正确、方法得当,ref 才能真正派上用场。

在实际开发中,最常见的应用场景包括聚焦、滚动和尺寸测量。这些操作无需任何第三方库,直接使用 ref 即可实现:

  • 让输入框自动获得焦点:this.$refs.inputEl.focus()
  • 滚动到底部:this.$refs.listEl.scrollTop = this.$refs.listEl.scrollHeight
  • 获取元素宽高位置:this.$refs.boxEl.getBoundingClientRect()

注意:这些操作不会触发 Vue 的响应式更新,也不受 Vue 监控,属于纯粹的 DOM 行为。简单来说,就是直接操作底层,框架不干涉。

再介绍一个高阶用法:通过 ref 调用子组件的方法。

这本质上是打破单向数据流的临时通道,适用于强耦合、明确控制的场景。但需注意边界:

  • 子组件必须显式暴露方法。Vue3 使用 defineExpose,Vue2 默认全部公开。
  • 父组件调用时,写法如下:this.$refs.childComp.submitForm()childRef.value?.submitForm()
  • 务必避免在子组件内部频繁监听父 ref 的变化,这并非响应式机制,也不推荐反向依赖。
  • 一旦通信变得复杂(如多层嵌套或事件分散),应优先考虑 emitprovide/inject 或状态管理方案。

总结:ref 是一把利器,用得好坏取决于时机与边界。瞄准目标、规范使用,它将成为你最得心应手的工具。

来源:https://www.php.cn/faq/2675988.html
上一篇大规模权限管理系统中HTML标签显隐逻辑与安全 下一篇多语言RTL环境下HTML文档流布局自动适配逻辑
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
如何在JavaScript中实现基于旋转视野的FOV射线绘制详解
前端开发 · 2026-07-01

如何在JavaScript中实现基于旋转视野的FOV射线绘制详解

如果用一句话概括核心,那就是:在 RayCasting 游戏开发中,绘制动态视野边界线(FOV)最可靠的方式是在逻辑层通过数学公式将坐标“算”出来,而不是依赖 Canvas 绘图上下文的旋转操作。 在实现类似 Doom 风格的 RayCasting 游戏时,动态视野(Field of View, F

TypeScript后端数据正确映射为前端接口类型的方法
前端开发 · 2026-07-01

TypeScript后端数据正确映射为前端接口类型的方法

在后端数据与前端类型之间来回转换,几乎是每位 TypeScript 开发者都无法回避的常态。后端返回的 car_brand、reg_number,和前端接口中定义的 brand、govtNumber,命名风格常常对不上号。此时,如果为了省事直接用 as 类型断言“强行”指认类型,那就踩进了常见的陷阱

动态HTML表格按层级条件合并单元格的JavaScript实现
前端开发 · 2026-07-01

动态HTML表格按层级条件合并单元格的JavaScript实现

本文详细讲解一种递归式 JavaScript 合并单元格方法,用于按列优先级(如前3列)智能合并表格行:仅当前一列已合并的前提下,才允许后续列合并相同值,从而精准实现多级分组与层级表格合并效果。 在动态生成的 HTML 表格中,按业务逻辑合并重复行是常见需求。然而,简单地对单列分别遍历合并——例如先

Next.js 13+重定向后滚动失效解决方案
前端开发 · 2026-07-01

Next.js 13+重定向后滚动失效解决方案

在 Next js App Router 的日常开发中,有一个令人颇为困扰的异常现象——当服务端执行 `redirect()` 跳转后,目标页面竟然无法正常滚动。没错,页面已经渲染完成,内容也完整显示,但垂直滚动条仿佛凭空消失。这个问题在 Next js 13 5 4 版本中尤为突出。 先给出结论:

WebGL图像加载延迟的纹理初始化时立即显示方法
前端开发 · 2026-07-01

WebGL图像加载延迟的纹理初始化时立即显示方法

本文详细介绍如何利用 Promise 与 async await 重构 WebGL 纹理加载流程,彻底解决首次渲染显示蓝色占位色、需要手动交互才能刷新的问题,实现文件导入后四张纹理平面即时正确渲染。 实际上,这个坑在 WebGL 开发中相当常见——纹理异步加载的小陷阱,说起来不大,但第一次遇到确实令