开发
API

组件间通信与事件

组件间通信

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

  • ttml 数据绑定:用于父组件向子组件的指定属性设置数据,仅能设置 json 兼容数据
  • 事件:用于子组件向父组件传递数据,可以传递任意数据。

监听事件

事件系统是组件间通信的主要方式之一。自定义组件可以触发任意的事件,引用组件的页面可以监听这些事件。关于事件的基本概念和用法,参见 事件

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

<!-- When the custom component triggers the myevent event, the "onMyEvent" method is called -->
<my-component bindmyevent="onMyEvent" />
<!--Or can be written as -->
<my-component bind:myevent="onMyEvent" />
Page({
  onMyEvent(e) {
    // The detail object provided when the custom component triggers the event
    console.log(e.detail);
  },
});

触发事件

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

代码示例

<!-- In a custom component -->
<button bindtap="onTap">Clicking this button will trigger the myevent event</button>
Component({
  properties: {}
  methods: {
    onTap() {
      var myEventDetail = {} // detail object, provided to the event monitoring function
      var myEventOption = {} // Options for triggering events

      this.triggerEvent(
        'myevent',
        myEventDetail,
        myEventOption
      )
    }
  }
})

触发事件的选项包括:

选项名类型是否必填默认值说明
bubblesBooleanfalse事件是否冒泡
composedBooleanfalse事件是否可以穿越组件边界,为 false 时,事件将只能在引用组件的节点树上触发,不进入其他任何组件内部
capturePhaseBooleanfalse事件是否拥有捕获阶段

关于冒泡和捕获阶段的概念,请阅读 事件 章节中的相关说明。

代码示例

页面 page.ttml 中:

<another-component bindcustomevent="pageEventListener1">
  <my-component bindcustomevent="pageEventListener2"></my-component>
</another-component>

组件 another-component.ttml 中:

<view bindcustomevent="anotherEventListener">
  <slot />
</view>

组件 my-component.ttml 中:

<view bindcustomevent="myEventListener">
  <slot />
</view>

组件代码中:

// 组件 my-component.js
Component({
  methods: {
    onTap: function () {
      // Will only trigger pageEventListener2
      this.triggerEvent("customevent", {});

      // Will trigger pageEventListener2, pageEventListener1 in turn
      this.triggerEvent("customevent", {}, { bubbles: true });

      // Will trigger pageEventListener2, anotherEventListener, pageEventListener1 in turn
      this.triggerEvent("customevent", {}, { bubbles: true, composed: true });
    },
  },
});
点击纠错
评价此篇文档