codecamp

百度智能小程序 组件间通信与事件

组件间通信

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

  • 在父组件中可以通过设置子组件的 properties 来向子组件传递数据;
  • 在父组件中定义 messages 对象,对子组件 dispatch 方法进行拦截,从而达到子组件向上通信;
  • 子组件可以通过 triggerEvent 方法触发父组件的自定义事件进行传参;
  • 如果以上几种方式不足以满足需要,父组件还可以通过 this.selectComponent 方法获取子组件实例对象,这样就可以直接访问组件的任意数据和方法。

监听事件

解释:

事件系统是组件间通信的主要方式之一。自定义组件可以触发任意的事件,引用组件的页面可以监听这些事件。

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

代码示例

<!-- 父组件模板 -->
<component-tag-name bindmyevent="onMyEvent" />

通过 dispatch 方法与父组件通信

通过 dispatch 方法,子组件可以向组件树的上层派发消息。消息将沿着组件树向上传递,直到遇到第一个处理该消息的组件,则停止。

通过 messages 可以声明组件要处理的消息,messages 是一个对象,key 是消息名称,value 是消息处理的函数,接收一个包含 target(派发消息的组件) 和 value(消息的值) 的参数对象。

代码示例 

在开发者工具中打开
/* 父组件逻辑 */
Component({
    messages: {
        'childmessage': function (e) {
            console.log('childmessage', e);
        }
    }
});
/* 子组件逻辑 */
Component({
    created() {
        this.dispatch('childmessage', {
            name: 'swan'
        });
    }
});

通过 triggerEvent 方法与父组件通信

解释:

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

<button bindtap="onTap">点击这个按钮将触发 myevent 事件</button>

代码示例 

在开发者工具中打开
/* 组件child页面 */
<button bindtap="onTap">点击这个按钮将触发 myevent 事件</button>
/* 组件child逻辑 */
Component({
    properties: {},
    methods: {
        onTap: function() {
            var myEventDetail = {} // detail对象,提供给事件监听函数
            var myEventOption = {bubbles:true} // 触发事件的选项
            this.triggerEvent('myevent', myEventDetail, myEventOption);
        }
    }
});
/* 使用该组件的页面 */
<child bindmyevent="listener"></child>
/* 使用该组件的逻辑 */
Page({
    listener: function (e) {
        console.log(e);
    }
})

触发事件的选项包括:

选项名类型是否必填默认值描述
bubblesBooleanfalse事件是否冒泡
capturePhaseBolleanfalse事件是否拥有捕获阶段

关于自定义组件的冒泡和捕获阶段。

代码示例

<!-- 页面 index.swan -->
<parent bindcustomevent="pageEventListener1">
  <child bindcustomevent="pageEventListener2"></child>
</parent>
 <!-- 组件 parent.swan -->
<view bindcustomevent="anotherEventListener">
  <slot />
</view>
 <!-- 组件 child.swan -->
<view bindcustomevent="myEventListener">
  <button bindtap="onTap">点我触发</button>
</view>
// 组件 child.js
Component({
  methods: {
    onTap: function(){
      this.triggerEvent('customevent', {}) // 只会触发 pageEventListener2
    //   this.triggerEvent('customevent', {}, { bubbles: true }) // 会依次触发 pageEventListener2 、 pageEventListener1
    //   this.triggerEvent('customevent', {}, { bubbles: true, capturePhase: true }) // 会依次触发 pageEventListener2 、 anotherEventListener 、 pageEventListener1
    }
  }
})

注意:

  • 对于 triggerEvent 方法,在基础库版本 2.0.3 之前(不包含 2.0.3)只支持传递类型为 object 的数据,从 2.0.3 开始支持传递其它数据类型(不包括 function 和 undefined),其它低版本请做好兼容
  • 对于很多 UI 组件库需要实现组件间关系,实际上组件间通信同样可以满足此需求。(之前组件间通信无法在存在 slot 环境使用,我们将于基础版本库 3.110.14 修复此问题)
  • 通过 triggerEvent 方式触发的自定义事件,只能在拥有父子关系的组件之间传播。
  • 只能触发绑定在组件自身标签上的事件监听方法。


百度智能小程序 Component构造器
百度智能小程序 behaviors
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

百度智能小程序开发文档

百度智能小程序 组件

百度智能小程序 地图

百度智能小程序 画布

百度智能小程序 API

百度智能小程序 界面

百度智能小程序 关注小程序引导组件

百度智能小程序 自定义组件

百度智能小程序 媒体

百度智能小程序 设备

百度智能小程序 拨打电话

百度智能小程序 内存警报

百度智能小程序 手机联系人

百度智能小程序 用户截屏事件

百度智能小程序 第三方平台

百度智能小程序 开放接口

百度智能小程序 百度收银支付

百度智能小程序 分包预下载

百度智能小程序 数据分析

百度智能小程序 服务端

百度智能小程序 云开发

百度智能小程序 初始化

百度智能小程序 云函数

百度智能小程序 服务端初始化

百度智能小程序 服务器获取上下文

百度智能小程序 服务端云函数

百度智能小程序 开发教程

百度智能小程序 功能开发

百度智能小程序 基本原理

百度智能小程序 小程序自动化

百度智能小程序 视频教程

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }