vue2通过$refs调用子组件方法

文章讲述了在Vue项目中,父组件如何通过$refs调用子组件的resetFn方法时遇到错误,原因在于ref写在组件上时获取的是子组件实例。解决方案包括正确调用子组件方法和处理参数传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

提示:这里简述项目相关背景:

父组件更新筛选项时,需要重置子组件相关参数。使用$refs时使用this.$refs['productCostTableRef'].resetFn('resName') 的写法,发生以下报错:

在这里插入图片描述
但是该方法在调用elementui 组件时不会报错。

<el-popover ref="popover-ref">
</el-popover>
this.$refs["popover-ref"].doClose(); // 成功执行popover关闭的事件

原因分析:

ref 写在标签上时:this.$refs.名字 / this.$refs['名字'] 获取的是标签对应的dom元素
ref 写在组件上时:这时候获取到的是子组件的引用


解决方案:

使用$ref调用自定义子组件的方法时,要用this.$refs.refName.methodsName();去调用。
另外几种使用情形:
传参时:this.$refs.refName.methodsName('参数值');
获取参数值: this.$refs.refName.dataName
修改参数值: this.$refs.refName.dataName = newData

### Vue 3 中通过 `proxy.$refs` 调用子组件方法Vue 3 中,可以通过 `ref` 属性来获取子组件实例,并进而调用其公开的方法。为了实现这一点,在父组件中定义一个 `ref` 并将其绑定到子组件上;随后可以在父组件内使用 `$refs` 来访问该子组件并执行相应操作。 #### 子组件暴露 API 方法 为了让父组件能够调用子组件中的特定函数,需先确保这些函数已在子组件内部被声明为公共接口。这通常是在 `<script setup>` 或者选项式 API 的 `methods` 配置项里完成的。如果采用组合式 API,则可以利用 `defineExpose()` 明确指定哪些成员应该对外可见[^1]。 ```vue <!-- ChildComponent.vue --> <script> export default { methods: { childMethod() { alert('Child method called'); } } } </script> <template> <!-- 组件模板 --> </template> ``` 对于使用 `<script setup>` 的情况: ```vue <!-- ChildComponent.vue --> <script setup> function childMethod() { alert('Child method called from script setup'); } // 暴露给外部使用的API defineExpose({ childMethod, }); </script> <template> <!-- 组件模板 --> </template> ``` #### 父组件中引用子组件并通过 $refs 访问 接下来,在父组件中引入上述子组件,并为其设置唯一的 `ref` 名称以便后续查找。当需要触发子组件内的逻辑时,只需简单地通过这个名称加上 `.method_name()` 即可达成目的。 ```vue <!-- ParentComponent.vue --> <template> <div> <child-component ref="myChildRef"></child-component> <button @click="callChildMethod">Call Child Method</button> </div> </template> <script> import { ref } from 'vue'; import ChildComponent from './path/to/ChildComponent'; export default { components: { ChildComponent, }, setup() { const myChildRef = ref(null); function callChildMethod() { if (myChildRef.value && typeof myChildRef.value.childMethod === 'function') { myChildRef.value.childMethod(); } } return { myChildRef, callChildMethod, }; }, }; </script> ``` 这种方法不仅保持了良好的封装性,同时也遵循了 Vue 官方推荐的做法——即尽可能减少父子组件之间的耦合度,只允许必要的交互发生[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值