组件间通信
组件间的基本通信方式有以下几种。
- TYML 数据绑定:用于父组件向子组件的指定属性设置数据,仅能设置 JSON 兼容数据。
- 事件:用于子组件向父组件传递数据,可以传递任意数据。
- 如果以上两种方式不足以满足需要,父组件还可以通过
this.selectComponent
方法获取子组件实例对象,这样就可以直接访问组件的任意数据和方法。
监听事件
事件系统是组件间通信的主要方式之一。自定义组件可以触发任意的事件,引用组件的页面可以监听这些事件。关于事件的基本概念和用法,参见 事件。
监听自定义组件事件的方法与监听基础组件事件的方法完全一致:
示例代码:
<!-- 当自定义组件触发“myevent”事件时,调用“onMyEvent”方法 -->
<component-tag-name bind:myevent="onMyEvent" />
<!-- 或者可以写成 -->
<component-tag-name bindmyevent="onMyEvent" />
Page({
onMyEvent: function (e) {
e.detail; // 自定义组件触发事件时提供的 detail 对象
},
});
触发事件
自定义组件触发事件时,需要使用 triggerEvent
方法,指定事件名、detail
对象和事件选项。
type ComponentEventOptions = {
/**
* 事件是否冒泡
*/
bubbles?: boolean;
/**
* 事件是否可以穿越组件边界,为 false 时,事件将只能在引用组件的节点树上触发,不进入其他任何组件内部
*/
composed?: boolean;
/**
* 是否含捕获阶段
*/
capturePhase?: boolean;
}
type triggerEvent = (
type: string,
detail: Record<string, any> = {},
options?: ComponentEventOptions,
) => void;
示例代码:
<!-- 在自定义组件中 -->
<button bind:tap="onTap">单击这个按钮将触发 “myevent” 事件</button>
Component({
properties: {},
methods: {
onTap: function () {
var myEventDetail = {}; // detail 对象,提供给事件监听函数
this.triggerEvent('myevent', myEventDetail);
},
},
});