vue3-父子组件传函数方法

Vue父子组件传值策略:propsvsemit&函数方法,
本文介绍了Vue2和Vue3中父子组件之间的传值方法,包括props从父传子和emit从子传父,以及Vue3中的依赖注入。特别关注了函数方法的传值过程,如通过ref接收函数参数和使用Promise格式。同时提到了在TypeScript项目中的类型定义。

1.父子组件传值

逻辑代码和vue2大差不差,父传子可以通过props传值页面接受即可,子传父通过emit传值即可。

当然vue3还提供了依赖注入的跨组件传值方法,但是项目中出现过多的inject provide可能会导致维护不便且代码污染问题,所以笔者现在的项目是通过父子组件一层层传值得到的。

2.子传父内容为函数方法

父传子数值笔者上一篇文章已经介绍过了,有兴趣的可以移步 ​​​​​​Vue3+element-plus项目开发小结(父子组件传值)_sunyeei的博客-优快云博客s

传值为函数方法其实步骤也一样。

当前组件为index父组件,子组件就是其中的dialog弹窗

首先需要用到 :绑定props,笔者项目中需要传的值是function函数传的projectId 和 projectName俩个值

在index注册这个ref的时候需要注意,如果是简单的字符串 ref()即可,但是function函数就得箭头函数的方式去接收,ref((x  , y  )=>{x   ;   y  })

那么回到dialog子组件中又该如何传输当前dialog的值呢?

重点的格式在于:(x , y )=>      Promise<void>

当然项目规定需要用到ts,所以需要提前定义一下类型

通过事件将form的值传出去,这里需要注意用props.需要的项

### Vue3父子组件之间方法调用的实现方式 #### 父组件调用子组件的方法Vue3 中,父组件可以通过 `ref` 来访问子组件实例并调用其定义的方法。具体实现如下: 父组件可以使用 `<child ref="childRef"></child>` 定义一个子组件,并通过 `this.$refs.childRef.methodName()` 调用子组件中的方法[^2]。 ```html <template> <div> <!-- 使用 ref 属性 --> <Child ref="childComp" /> <button @click="callChildMethod">调用子组件方法</button> </div> </template> <script> import Child from &#39;./Child.vue&#39;; export default { components: { Child }, methods: { callChildMethod() { // 访问子组件实例并通过它调用方法 this.$refs.childComp.someMethod(); } } }; </script> ``` 在此例子中,当按钮被点击时,会触发 `callChildMethod` 方法,该方法通过 `$refs` 获取子组件实例并调用其中的 `someMethod` 函数--- #### 子组件调用父组件的方法 子组件可以通过事件机制来通知父组件执行某些操作。这通常由 `$emit` 实现,允许子组件向上递数据或信号给父组件[^1]。 以下是具体的实现过程: 子组件可以在某个特定条件下发出自定义事件,而父组件则监听这些事件并对它们作出响应。 ```html <!-- 子组件 --> <template> <button @click="notifyParent">通知父组件</button> </template> <script> export default { methods: { notifyParent() { // 发送名为 sayHello 的事件至父级 this.$emit(&#39;sayHello&#39;); } } }; </script> ``` ```html <!-- 父组件 --> <template> <Child @sayHello="handleEventFromChild" /> </template> <script> import Child from &#39;./Child.vue&#39;; export default { components: { Child }, methods: { handleEventFromChild() { console.log(&#39;子组件已成功调用了我的方法!&#39;); } } }; </script> ``` 在这个场景下,每当子组件内的按钮被按下时,就会触发 `notifyParent` 方法,进而发射 `sayHello` 自定义事件;随后,父组件捕获此事件并运行相应的处理程序 `handleEventFromChild`。 --- #### TypeScript 支持下的增强型 Props 和 Emits 为了提高开发体验以及减少错误,在现代项目里推荐利用 TypeScript 提供更精确的数据类型验证功能。借助于 `defineProps` 和 `defineEmits` 可以为属性递与事件分发提供静态分析能力[^4]。 例如下面展示了如何声明接受字符串类型的参数同时还能发送更新消息回上级组件的例子: ```javascript // 子组件 script 部分 const emit = defineEmits<{ (e: &#39;update&#39;, value: string): void; }>(); function updateMessage(newMsg) { emit(&#39;update&#39;, newMsg); } ``` 这样做的好处在于编译阶段就能发现潜在问题从而提升代码质量[^4]。 --- ### 总结 综上所述,Vue3 提供了灵活简便的方式来完成父子间互相调用彼此的功能需求。一方面可通过设置 reference 直接作用于目标对象内部成员变量或者行为;另一方面依靠 event bus 构建起轻量化的通信桥梁让双方能够无缝协作起来[^1].
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值