小程序 父子组件通信
父子组件通信的三种方式:
- 属性绑定:用于父组件向子组件的指定属性设置数据,仅能设置 JSON 兼容的数据
- 事件绑定:用于子组件向父组件传递数据,可以传递任意数据
- 获取组件实例:父组件通过
this.selectComponent()
方法获取子组件实例对象,这样就可以直接访问子组件的任意数据和方法
一、父->子
Page({
data:{
count: 0
}
})
<son count="{{count}}"></son>
son.js
中
Component({
properties: {
count: Number
},
})
son.wxml
<text>数值:{{count}}</text>
二、子->父( triggerEvent
)
子组件使用 triggerEvent
方法向父组件传递数据。
父组件:
<!-- 当自定义组件触发“myevent”事件时,调用“onMyEvent”方法 -->
<component-tag-name bindmyevent="onMyEvent" />
<!-- 或者 -->
<component-tag-name bind:myevent="onMyEvent" />
Page({
onMyEvent: function(e){
e.detail // 自定义组件触发事件时提供的 detail 对象
}
})
子组件:
<!-- son.wxml -->
<button bindtap="onTap">点击这个按钮将触发“myevent”事件</button>
<!-- son.js -->
// 使用 triggerEvent 方法,指定事件名、detail 对象、事件选项
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 | 事件是否拥有捕获阶段 |
以下是使用说明:
// 定义组件 another-component.wxml
<view bind:customevent="anotherEventListener">
<slot />
</view>
// 定义组件 my-component.wxml
<view bind:customevent="myEventListener">
<slot />
</view>
// 页面 page.wxml
<another-component bind:customevent="pageEventListener1">
<my-component bind:customevent="pageEventListener2"></my-component>
</another-component>
// 组件 my-component.js
Component({
methods: {
onTap: function(){
// 1. 只会触发 pageEventListener2
this.triggerEvent('customevent', {})
// 2. 会依次触发 pageEventListener2 、 pageEventListener1
this.triggerEvent('customevent', {}, { bubbles: true })
// 3. 会依次触发 pageEventListener2 、 anotherEventListener 、 pageEventListener1
this.triggerEvent('customevent', {}, { bubbles: true, composed: true })
}
}
})
三、获取组件实例
可在父组件里调用 this.selectComponent
,获取子组件的实例对象。调用时需要传入一个匹配选择器 selector
,如: this.selectComponent(".my-component")
Page({
data: {},
getChildComponent: function () {
const child = this.selectComponent('.my-component'); // 父组件将会获取 class 为 my-component 的子组件实例对象,即子组件的 this
console.log(child)
}
})
注意 :默认情况下,小程序与插件之间、不同插件之间的组件将无法通过 selectComponent
得到组件实例(将返回 null
)。如果想让一个组件在上述条件下依然能被 selectComponent
返回,可以自定义其返回结果
- 使用内置
behavior
:wx://component-export
- 自定义组件中的
export
定义段将用于指定组件被selectComponent
调用时的返回值
// 自定义组件 my-component 内部
Component({
behaviors: ['wx://component-export'],
export() {
return { myField: 'myValue' }
}
})
<!-- 使用自定义组件时 -->
<my-component id="the-id" />
// 父组件调用
const child = this.selectComponent('#the-id') // 等于 { myField: 'myValue' }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 小程序 数据监听器 observers
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论