组件间通信与事件收藏我的收藏
收藏
我的收藏组件间通信
组件间的基本通信方式有以下几种:
- •
ttml
数据绑定:用于父组件向子组件的指定属性设置数据,仅能设置 json
兼容数据;- •事件:用于子组件向父组件传递数据,可以传递任意数据;
- •父组件可以通过
ref
获取子组件实例对象,这样就可以直接访问组件的任意数据和方法,参考 ref 获取组件实 例 。监听事件
监听自定义组件事件的方法与监听基础组件事件的方法完全一致:
<!-- 当自定义组件触发 myevent 事件时,调用“onMyEvent”方法 --> <my-component bindmyevent="onMyEvent" /> <!-- 或者可以写成 --> <my-component bind:myevent="onMyEvent" />
Page({ onMyEvent(e) { // 自定义组件触发事件时提供的detail对象 console.log(e.detail); }, });
触发事件
自定义组件触发事件时,需要使用
triggerEvent
方法,指定事件名、detail
对象和事件选项:代码示例
<!-- 在自定义组件中 --> <button bindtap="onTap">点击这个按钮将触发 myevent 事件</button>
Component({ properties: {}, methods: { onTap() { var myEventDetail = {}; // detail对象,提供给事件监听函数 var myEventOption = {}; // 触发事件的选项 this.triggerEvent("myevent", myEventDetail, myEventOption); }, }, });
触发事件的选项包括:
选项名 | 类型 | 必填 | 默认值 | 说明 |
bubbles | boolean | 否 | false | 事件是否冒泡 |
composed | boolean | 否 | false | 事件是否可以穿越组件边界,为 false 时,事件将只能在引用组件的节点树上触发,不进入其他任何组件内部 |
代码示例
页面
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() { // 只会触发 pageEventListener2 this.triggerEvent("customevent", {}); // 会依次触发 pageEventListener2 、 pageEventListener1 this.triggerEvent("customevent", {}, { bubbles: true }); // 会依次触发 pageEventListener2 、 anotherEventListener 、 pageEventListener1 this.triggerEvent("customevent", {}, { bubbles: true, composed: true }); }, }, });