当前位置: 首页 > news >正文

Vue3 + TypeScript 父组件点击按钮触发子组件事件方法

在 Vue 3 和 TypeScript 中,父组件触发子组件事件方法主要有两种方式:使用模板引用(ref) 或 通过自定义事件(emit)。下面是两种方法的详细实现:


方法 1:使用模板引用(Ref)直接调用子组件方法(推荐)

子组件 ChildComponent.vue

vue

复制

下载

<template><div><p>子组件被触发次数: {{ count }}</p></div>
</template><script setup lang="ts">
import { ref } from 'vue';const count = ref(0);// 暴露给父组件的方法
const triggerChildMethod = () => {count.value++;console.log('子组件方法被触发');
};// 使用 defineExpose 暴露方法
defineExpose({triggerChildMethod
});
</script>
父组件 ParentComponent.vue

vue

复制

下载

<template><div><button @click="handleClick">父组件按钮</button><ChildComponent ref="childRef" /></div>
</template><script setup lang="ts">
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';// 定义子组件的 Ref 类型
const childRef = ref<InstanceType<typeof ChildComponent> | null>(null);const handleClick = () => {if (childRef.value) {childRef.value.triggerChildMethod(); // 直接调用子组件方法}
};
</script>

方法 2:通过自定义事件(Emit)

子组件 ChildComponent.vue

vue

复制

下载

<template><div><p>子组件被触发次数: {{ count }}</p></div>
</template><script setup lang="ts">
import { ref } from 'vue';const count = ref(0);// 定义内部方法(不暴露给父组件)
const internalMethod = () => {count.value++;console.log('子组件方法被触发');
};// 监听父组件传来的事件名(例如 "trigger-child")
defineEmits<{(e: 'trigger-child'): void;
}>();// 暴露方法(可选,如果父组件需要通过 ref 调用)
defineExpose({ internalMethod });
</script>
父组件 ParentComponent.vue

vue

复制

下载

<template><div><button @click="$refs.childRef?.internalMethod()">方式1: Ref 调用</button><button @click="emitEvent">方式2: 事件触发</button><ChildComponent ref="childRef" @trigger-child="childRef?.internalMethod()" /></div>
</template><script setup lang="ts">
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';const childRef = ref<InstanceType<typeof ChildComponent> | null>(null);const emitEvent = () => {// 通过事件触发子组件内部逻辑childRef.value?.$emit('trigger-child');
};
</script>

关键点说明:

  1. 使用 defineExpose
    子组件需显式暴露方法,父组件才能通过 ref 直接调用。

  2. TypeScript 类型安全

    ts

    复制

    下载

    const childRef = ref<InstanceType<typeof ChildComponent> | null>(null);

    确保调用子组件方法时有完整的类型提示。

  3. 两种方式选择

    • Ref 直调:适合直接操作子组件

    • 自定义事件:适合解耦场景(子组件自行响应事件)

  4. 注意事项

    • 避免过度使用 ref 破坏组件封装性

    • 事件驱动方式更符合 Vue 的数据流原则


完整工作流程:

  1. 子组件用 defineExpose 暴露方法

  2. 父组件声明 ref 并关联子组件

  3. 父组件按钮点击时通过 childRef.value.methodName() 调用

  4. 子组件方法执行并更新状态

根据你的项目结构选择合适的方式即可实现父子组件通信。

相关文章:

  • RK AndroidFramework 内置应用可,卸载,恢复出厂设置恢复安装
  • 项目拓展-Apache对象池,对象池思想结合ThreadLocal复用日志对象
  • HEAD ` 只返回响应头(Headers),不返回正文内容(Body)
  • 融智学教育观及其数学公式体系凝练汇总
  • 11_13小结
  • 芯片测试之trim详解
  • AI首次自主发现人工生命
  • 用Python写一个可视化大屏
  • Kubernetes 部署 Kafka 集群:容器化与高可用方案(二)
  • Transformer实战——从词袋模型到Transformer:NLP技术演进
  • 浏览器指纹-探究前端如何识别用户设备
  • 【硬件】相机的硬件测试
  • python使用milvus教程
  • 从零开始:VMware上的Linux与Java开发环境配置
  • linux-部署go开发环境
  • 在 Linux 系统中使用 `sudo su`切换超级管理员不用提示密码验证的配置方法
  • 「Linux中Shell命令」Shell常见命令
  • Linux--磁盘寻址:从 CHS 到 LBA 的深度解码之旅
  • 笔记本电脑安装win11哪个版本好_笔记本电脑安装win11专业版图文教程
  • 洛谷 P5716:月份天数 ← 闰年判断
  • 小程序开发教程文档/seo网站关键词优化报价
  • 网站怎样做优化调整/深圳搜索竞价账户托管
  • 网站做聚合页面方案如何写/seo自然排名
  • 做英文网站怎么赚钱/百度推广后台登录入口官网
  • 做时时彩网站多少钱/百度广告推广怎么做
  • 晋州网站建设/电商代运营公司排名