【Vue】组件通信与方法暴露实践

在Vue.js应用中,组件通信和方法的暴露是常见的需求,特别是当我们需要在一个组件中访问另一个组件的方法时。本文将介绍如何使用Vue.js来实现这一功能,以及一个实际的示例。

组件通信

Vue.js提供了多种方法来实现组件之间的通信,其中一个常见的方式是使用自定义事件。在组件内部,我们可以使用$emit来触发自定义事件,而在父组件中,我们可以使用@符号来监听这些事件。

在下面的示例中,我们有一个名为base-info-form的子组件,它在mounted钩子中触发了一个自定义事件init

mounted() {
  this.$nextTick(() => {
    this.$emit('init', this.provideInterface())
  });
},

方法暴露

在上述示例中,我们需要将一些内部方法暴露给父组件。为了实现这一点,我们创建了一个名为provideInterface的方法,该方法返回一个包含需要暴露的方法和属性的对象:

provideInterface() {
  return {
  	// 这里只是举几个例子,可以根据你的需求增添
    waitSubsidyList: this.waitSubsidyList, // 暴露属性
    validate: this.$refs.uForm.validate // 暴露方法
  }
},

其中,waitSubsidyList是一个属性,而validate是一个方法。我们希望能够在父组件中访问validate方法。

一定要注意!!!!
validate: this.$refs.uForm.validate 这里方法后面不要加括号,否则就是指向方法,而不是属性了!!!!!
waitSubsidyList: this.waitSubsidyList 这里只适用于对象、数组这种引用类型,并且后续改变他们的值的时候不可以改变this.waitSubsidyList其引用地址!!!!!

在页面中的使用

在父组件中,我们可以使用@init来监听子组件触发的init事件,并将返回的对象保存在一个变量中:

<base-info-form @init="baseInfoInit" ref="baseInformation"></base-info-form>
// 基本信息初始化
baseInfoInit(baseInfoCtx) {
  this.baseInfoCtx = baseInfoCtx
},

现在,我们可以通过baseInfoCtx变量来访问子组件base-info-form暴露的方法和属性。

方法调用

最后,让我们看一下如何在父组件中调用子组件的方法。假设我们想调用子组件的validate方法:

const valid = await this.baseInfoCtx.validate();
// 如果使用原本的 $refs 查找调用就应这样写,可读性大大降低:
// const valid = await this.$refs.baseInformation.$refs.uForm.validate();

通过上述步骤,我们成功地将子组件的方法暴露给了父组件,并且可以在父组件中调用它们。

总结

在Vue.js中,组件通信和方法的暴露是非常常见的需求。通过使用自定义事件和对象暴露方法,我们可以轻松地在组件之间实现通信和方法调用。这种模式使代码更加清晰和可维护,有助于更好地组织Vue.js应用程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中,父子组件通信有以下三种方式: 1. 父组件给子组件传参: 父组件中通过props向子组件传递数据,子组件中通过props接收数据。 2. 子组件调用父组件方法: 父组件中通过v-on绑定一个方法,子组件中通过$emit触发这个方法,并传递数据。 3. 子组件暴露属性给父组件: 子组件中通过defineExpose暴露属性或方法,父组件中通过ref获取子组件实例,再调用子组件的属性或方法。 以下是三种方式的代码示例: 1. 父组件给子组件传参: 父组件中: ```vue <template> <child-component :message="msg"></child-component> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent, }, data() { return { msg: 'Hello World', }; }, }; </script> ``` 子组件中: ```vue <template> <div>{{ message }}</div> </template> <script> export default { props: { message: String, },}; </script> ``` 2. 子组件调用父组件方法: 父组件中: ```vue <template> <child-component @change-visible="handleChangeVisible"></child-component> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent, }, methods: { handleChangeVisible(visible) { console.log(visible); }, }, }; </script> ``` 子组件中: ```vue <template> <button @click="handleClick">Change Visible</button> </template> <script> export default { methods: { handleClick() { this.$emit('change-visible', false); }, }, }; </script> ``` 3. 子组件暴露属性给父组件: 子组件中: ```vue <template> <div>{{ message }}</div> </template> <script> import { defineExpose } from 'vue'; export default { setup() { const message = 'Hello World'; defineExpose({ message, }); return { message, }; }, }; </script> ``` 父组件中: ```vue <template> <child-component ref="child"></child-component> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent, }, mounted() { console.log(this.$refs.child.message); }, }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值