uni-app中ref怎么获取子组件实例

夏丽君_4993

夏丽君_4993

2026-09-30

443人浏览

原创

$refs在非h5平台常为undefined,因小程序无dom、渲染层与逻辑层分离,且uni-app限制其仅能获取自定义组件实例;vue2需用onready+uni.nexttick并做存在性判断,vue3必须通过defineexpose显式暴露。

uni-app中ref怎么获取子组件实例

ref 在 uni-app 中能获取子组件实例,但**是否成功取决于平台、Vue 版本和调用时机**。H5 端基本可靠;微信小程序、App 等非 H5 端,$refs 在 Vue2 和 Vue3 下行为差异大,且容易返回 undefined。

为什么 $refs 在非 H5 平台经常是 undefined

uni-app 官方明确说明:ref 属性在非 H5 平台(如微信小程序)**不保证能直接访问子组件实例**,底层渲染机制不同,this.$refs.xxx 可能为空或为普通节点对象而非 Vue 实例。

  • Vue2 项目中,$refs 有时能取到,但不稳定——尤其在 onLoad 或 created 阶段就访问,大概率失败
  • Vue3(setup + defineExpose)必须显式暴露方法,否则即使拿到实例也调不到内部函数
  • 小程序原生组件(如 cover-view、自定义 tabbar)完全不支持 ref 获取 Vue 实例

Vue2 项目中安全获取子组件实例

必须等组件真正挂载完成,并做存在性判断:

  • 用 onReady(而非 onLoad 或 mounted)——这是 uni-app 小程序端最可靠的生命周期钩子
  • 配合 uni.nextTick 确保 DOM 和组件树已就绪
  • 每次调用前检查 this.$refs.xxx 是否存在,再检查方法是否为函数
onReady() {
  uni.nextTick(() => {
    const child = this.$refs.childRef;
    if (child && typeof child.doSomething === 'function') {
      child.doSomething('hello');
    }
  });
}

Vue3 项目中必须 defineExpose

Vue3 的 setup 默认不暴露任何内容,$refs 拿到的实例是空壳。子组件必须主动声明哪些方法/数据可被父组件访问:

uni-app
uni-app

uni-app 是基于 Vue 的跨端开发框架,适合开发 H5、App、小程序、鸿蒙和多端业务应用。

下载
  • 子组件内使用 defineExpose({ doSomething, data })
  • 父组件仍通过 ref 绑定 + this.$refs.xxx(选项式)或 ref 响应式变量(组合式)获取
  • 注意:Vue3 的 ref 在模板中写法不变,但 JS 层需用 ref() 创建响应式引用变量来接收
// 子组件 Child.vue
<script setup>
const doSomething = (msg) => console.log(msg);
defineExpose({ doSomething });
</script>

v-for 渲染多个子组件时 ref 怎么写

固定字符串 ref="item" 会导致所有子组件覆盖同一个 key,this.$refs.item 只返回最后一个。必须动态绑定:

  • 写成 :ref="el => { if (el) $refs.list.push(el) }"(Vue3 组合式推荐)
  • 或 Vue2 中用 :ref="'item' + index",然后遍历 Object.keys(this.$refs) 找匹配项
  • 更稳妥的做法:给每个子组件加唯一 id 属性,用 this.selectComponent('#id') 替代 $refs(全平台兼容)

真正跨端稳定的方式不是死磕 $refs,而是用 this.selectComponent + $vm——它绕过 Vue 层,直取小程序组件实例,再通过 $vm 访问其 Vue 实例属性。这点常被忽略,却是小程序端最可靠的方案。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2183

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

4683

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5830

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5278

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

743

5

vue2.0和3.0区别
vue2.0和3.0区别

vue2.0和3.0区别:vue2的响应式原理是利⽤“Object.defineProperty()”对数据进⾏劫持结合发布订阅模式的⽅式来实现,vue3中使⽤了es6的proxy API对数据代理,实现对数据的监控。本专题为大家提供vue2.0和3.0区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.17

1614

5

vue3的生命周期有哪些
vue3的生命周期有哪些

vue3的生命周期:1、beforecreate;2、created;3、beforemount;4、mounted;5、beforeupdate;6、updated;7、beforedestroy;8、destroyed;9、activated;10、deactivated等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

11762

5

Vue3组合式API与组件开发实战
Vue3组合式API与组件开发实战

本专题讲解 Vue 3 组合式 API 的核心概念与应用技巧,深入分析响应式系统、生命周期管理、组件设计与复用策略。通过完整项目案例,指导前端开发者实现高性能、结构清晰的 Vue 应用,提升开发效率与代码可维护性。

2026.02.10

276

23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习