组件间通信与事件

组件间通信

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

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

监听事件

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

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

  1. <!-- 当自定义组件触发 myevent 事件时,调用“onMyEvent”方法 -->
  2. <my-component bindmyevent="onMyEvent" />
  3. <!-- 或者可以写成 -->
  4. <my-component bind:myevent="onMyEvent" />
  1. Page({
  2. onMyEvent(e) {
  3. // 自定义组件触发事件时提供的detail对象
  4. console.log(e.detail);
  5. }
  6. })

触发事件

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

代码示例

  1. <!-- 在自定义组件中 -->
  2. <button bindtap="onTap">点击这个按钮将触发 myevent 事件</button>
  1. Component({
  2. properties: {}
  3. methods: {
  4. onTap() {
  5. var myEventDetail = {} // detail对象,提供给事件监听函数
  6. var myEventOption = {} // 触发事件的选项
  7. this.triggerEvent(
  8. 'myevent',
  9. myEventDetail,
  10. myEventOption
  11. )
  12. }
  13. }
  14. })

触发事件的选项包括:

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

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

代码示例

页面 page.ttml 中:

  1. <another-component bindcustomevent="pageEventListener1">
  2. <my-component bindcustomevent="pageEventListener2"></my-component>
  3. </another-component>

组件 another-component.ttml 中:

  1. <view bindcustomevent="anotherEventListener">
  2. <slot />
  3. </view>

组件 my-component.ttml 中:

  1. <view bindcustomevent="myEventListener">
  2. <slot />
  3. </view>

组件代码中:

  1. // 组件 my-component.js
  2. Component({
  3. methods: {
  4. onTap: function(){
  5. // 只会触发 pageEventListener2
  6. this.triggerEvent('customevent', {})
  7. // 会依次触发 pageEventListener2 、 pageEventListener1
  8. this.triggerEvent('customevent', {}, { bubbles: true })
  9. // 会依次触发 pageEventListener2 、 anotherEventListener 、 pageEventListener1
  10. this.triggerEvent('customevent', {}, { bubbles: true, composed: true })
  11. }
  12. }
  13. })

原文: https://developer.toutiao.com/docs/framework/custom_component_events.html