codecamp

组件间通信与事件

组件间通信

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

  • ttml/wxml 数据绑定:用于父组件向子组件的指定属性设置数据,仅能设置 json 兼容数据
  • 事件:用于子组件向父组件传递数据,可以传递任意数据。


监听事件

事件系统是组件间通信的主要方式之一。自定义组件可以触发任意的事件,引用组件的页面可以监听这些事件。关于事件的基本概念和用法,参见 事件 。

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

<!-- 当自定义组件触发 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 时,事件将只能在引用组件的节点树上触发,不进入其他任何组件内部
capturePhase Boolean 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: function() {
      // 只会触发 pageEventListener2
      this.triggerEvent("customevent", {});

      // 会依次触发 pageEventListener2 、 pageEventListener1
      this.triggerEvent("customevent", {}, { bubbles: true });

      // 会依次触发 pageEventListener2 、 anotherEventListener 、 pageEventListener1
      this.triggerEvent("customevent", {}, { bubbles: true, composed: true });
    }
  }
});


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; }