自定义组件事件
监听事件
事件系统是组件间通信的主要方式之一。自定义组件可以触发任意的事件,引用组件的页面可以监听这些事件。关于事件的基本概念和用法 。
监听自定义组件事件的方法与监听基础组件事件的方法完全一致:
示例代码:
<!-- 当自定义组件触发“myevent”事件时,调用“onMyEvent”方法 -->
<component-tag-name bindmyevent="onMyEvent" />
<!-- 或者可以写成 -->
<component-tag-name bind:myevent="onMyEvent" />
Page({
onMyEvent: function(e){
e.detail // 自定义组件触发事件时提供的detail对象
}
})
触发事件
自定义组件触发事件时,需要使用 triggerEvent
方法,指定事件名、detail对象和事件选项:
示例代码:
<!-- 在自定义组件中 -->
<button bindtap="onTap">点击这个按钮将触发“myevent”事件</button>
Component({
properties: {},
methods: {
onTap: function(){
var myEventDetail = {} // detail对象,提供给事件监听函数
var myEventOption = {} // 触发事件的选项
this.triggerEvent('myevent', myEventDetail, myEventOption)
}
}
})
触发事件的选项包括:
属性 | 类型 | 是否必填 | 默认值 | 描述 | 最低版本 | |
---|---|---|---|---|---|---|
bubbles | Boolean | 否 | false | 事件是否冒泡 | ||
composed | Boolean | 否 | false | 事件是否可以穿越组件边界,为false时,事件将只能在引用组件的节点树上触发,不进入其他任何组件内部 | ||
capturePhase | Boolean | 否 | false | 事件是否拥有捕获阶段 |
示例代码:
<!-- 页面 index.mcml -->
<another-component bindcustomevent="pageEventListener1">
<my-component bindcustomevent="pageEventListener2"></my-component>
</another-component>
<!-- 组件 another-component.mcml -->
<view bindcustomevent="anotherEventListener">
<slot />
</view>
<!-- 组件 my-component.mcml -->
<view bindcustomevent="myEventListener">
<slot />
</view>
// 组件 my-component.js
Component({
methods: {
onTap: function(){
this.triggerEvent('customevent', {}) // 只会触发 pageEventListener2
this.triggerEvent('customevent', {}, { bubbles: true }) // 会依次触发 pageEventListener2 、 pageEventListener1
this.triggerEvent('customevent', {}, { bubbles: true, composed: true }) // 会依次触发 pageEventListener2 、 anotherEventListener 、 pageEventListener1
}
}
})
获取组件实例
可在父组件里调用 this.selectComponent
,获取子组件的实例对象。
调用时需要传入一个匹配选择器 selector
,如:this.selectComponent(".my-component")
。
示例代码:
// 父组件
Page({
data: {},
getChildComponent: function () {
const child = this.selectComponent('.my-component');
console.log(child)
}
})
在上例中,父组件将会获取 class
为 my-component
的子组件实例对象,即子组件的 this
。
自定义的组件实例对象
若需要自定义 selectComponent
返回的数据,可使用内置 behavior
: mc://component-export
使用该 behavior 时,自定义组件中的 export
定义段将用于指定组件被 selectComponent
调用时的返回值。
示例代码:
// 自定义组件 my-component 内部
Component({
behaviors: ['mc://component-export'],
export() {
return { myField: 'myValue' }
}
})
<!-- index.mcml -->
<button bindtap="getComponentTap">获取组件对象</button>
<!-- 使用自定义组件时 -->
<my-component id="the-id" />
//index.js
Page({
getComponentTap: function(){
// 父组件调用
var child = this.selectComponent('#the-id') // 等于 { myField: 'myValue' }
}
})
在上例中,父组件获取 id
为 the-id
的子组件实例的时候,得到的是对象 { myField: 'myValue' }
。