---
title: 组件间通信与事件
summary: "介绍自定义组件间的通信方式，包括数据绑定、triggerEvent 触发自定义事件及 selectComponent 获取子组件实例。"
questions:
  - 组件间的基本通信方式有哪几种？
  - TYML 数据绑定仅能设置什么类型的数据？
  - 如何在页面中监听自定义组件的事件？
  - 自定义组件如何使用 triggerEvent 触发事件？
  - triggerEvent 方法接受哪些参数？
  - 事件选项中 bubbles 和 composed 分别控制什么行为？
  - 父组件如何通过 selectComponent 获取子组件实例？
---

## 组件间通信

组件间的基本通信方式有以下几种。

- TYML 数据绑定：用于父组件向子组件的指定属性设置数据，仅能设置 JSON 兼容数据。
- 事件：用于子组件向父组件传递数据，可以传递任意数据。
- 如果以上两种方式不足以满足需要，父组件还可以通过 `this.selectComponent` 方法获取子组件实例对象，这样就可以直接访问组件的任意数据和方法。

## 监听事件

事件系统是组件间通信的主要方式之一。自定义组件可以触发任意的事件，引用组件的页面可以监听这些事件。关于事件的基本概念和用法，参见 [事件](/cn/miniapp/develop/miniapp/framework/event/interaction)。

监听自定义组件事件的方法与监听基础组件事件的方法完全一致：

**示例代码：**

```xml
<!-- 当自定义组件触发“myevent”事件时，调用“onMyEvent”方法 -->
<component-tag-name bind:myevent="onMyEvent" />
<!-- 或者可以写成 -->
<component-tag-name bindmyevent="onMyEvent" />
```

```js
Page({
  onMyEvent: function (e) {
    e.detail; // 自定义组件触发事件时提供的 detail 对象
  },
});
```

## 触发事件

自定义组件触发事件时，需要使用 `triggerEvent` 方法，指定事件名、`detail` 对象和事件选项。

```ts
type ComponentEventOptions = {
  /**
   * 事件是否冒泡
   */
  bubbles?: boolean;
  /**
   * 事件是否可以穿越组件边界，为 false 时，事件将只能在引用组件的节点树上触发，不进入其他任何组件内部
   */
  composed?: boolean;
  /**
   * 是否含捕获阶段
   */
  capturePhase?: boolean;
}

type triggerEvent = (
  type: string,
  detail: Record<string, any> = {},
  options?: ComponentEventOptions,
) => void;
```

**示例代码：**

```xml
<!-- 在自定义组件中 -->
<button bind:tap="onTap">单击这个按钮将触发 “myevent” 事件</button>
```

```js
Component({
  properties: {},
  methods: {
    onTap: function () {
      var myEventDetail = {}; // detail 对象，提供给事件监听函数
      this.triggerEvent('myevent', myEventDetail);
    },
  },
});
```
