父组件中如何处理子组件内点击事件?

父组件中如何处理子组件内点击事件

阅读 1k
avatarAI BotBETA

在父组件中处理子组件内的点击事件,通常需要使用事件冒泡机制或者使用自定义事件。

方法一:事件冒泡

事件冒泡是 HTML DOM 的一种特性,当子元素被点击时,这个点击事件会向父元素传播。父元素可以通过监听其自身的事件来捕获子元素的点击事件。

例如,假设我们有一个子组件 <ChildComponent>,它内部有一个按钮,我们希望在父组件中处理这个按钮的点击事件:

  1. 子组件 (ChildComponent.vue)
<template>
  <button @click="handleClick">Click me</button>
</template>

<script>
export default {
  methods: {
    handleClick() {
      this.$emit('child-click'); // 触发自定义事件
    }
  }
}
</script>
  1. 父组件 (ParentComponent.vue)
<template>
  <ChildComponent @child-click="handleChildClick" />
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: { ChildComponent },
  methods: {
    handleChildClick() {
      console.log('Child component button clicked!');
    }
  }
}
</script>

在这个例子中,当子组件中的按钮被点击时,它会触发一个名为 child-click 的自定义事件。父组件通过在子组件标签上添加 @child-click 监听器来捕获这个事件,并执行相应的处理函数 handleChildClick

方法二:使用全局事件总线或局部事件总线

如果父子组件之间存在深度嵌套关系,或者多个组件之间需要共享事件,可以使用全局或局部事件总线来传递事件。这样,任何一个组件都可以触发和监听这些事件。

例如,你可以在 Vue 实例中创建一个事件总线:

// main.js 或其他合适的地方
import Vue from 'vue';
export const EventBus = new Vue(); // 全局事件总线

然后在父组件中触发和监听事件:

  1. 父组件 (ParentComponent.vue)
<template>
  <ChildComponent @child-click="handleChildClick" />
</template>

<script>
import { EventBus } from './EventBus'; // 引入全局事件总线
import ChildComponent from './ChildComponent.vue';

export default {
  components: { ChildComponent },
  methods: {
    handleChildClick() {
      EventBus.$emit('child-click', 'Button clicked in child component!'); // 触发全局事件总线上的事件
    }
  }
}
</script>
2 个回答

在父组件中初始化子组件时,将父组件中定义的方法,传递给子组件,在子组件中调用该方法,类似于变量传递。

示例代码

class Model { 
  value: string 
} 
 
@Entry 
@Component 
struct EntryComponent { 
  test() { 
    console.log('testTag test in my component'); 
  } 
  build() { 
    Column() { 
      MyComponent({ title: { value: 'Hello World 2' }, count: 7, onClick: this.test })  // 初始化时传递定义的方法 
    } 
  } 
} 
 
@Component 
struct MyComponent { 
  @State title: Model = { value: 'Hello World' }; 
  @State count: number = 0; 
  onClick: any; 
  private toggle: string = 'Hello World'; 
  private increaseBy: number = 1; 
 
  build() { 
    Column() { 
      Text(`${this.title.value}`).fontSize(30) 
      Button(`Click to increase count=${this.count}`) 
        .margin(20) 
        .onClick(() => { 
          // 修改内部状态变量count 
          this.count += this.increaseBy; 
          this.onClick(); 
        }) 
    } 
  } 
}

组件的话肯定就是父子组件通信了。

不过本身的通用事件大多数也是支持冒泡的

本文参与了思否 HarmonyOS 技术问答马拉松,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进