MIP 提供了强大的组件DOM通信,组件间通信功能,以解决在MIP组件开发中遇到的组件交互问题。可以通过 DOM 属性来触发某个 MIP 元素的自定义事件。

应用场景:

DOM通信:

  • 点击按钮,弹出层(<mip-lightbox>)显示。
  • 点击按钮,展开折叠元素(<mip-showmore>)。

组件间通信:

  • 当用户触发筛选(<mip-filter>)时,页面返回顶部(<mip-gototop>)。

语法

  • on="eventName:id.action"
  • on="eventName:id.action(args)"

组件内注册监听行为(action):

  1. /**
  2. * 组件内部绑定事件行为
  3. *
  4. * @param {Object} event 触发时透传的 event 对象
  5. * @param {string} str 在 HTML `on` 属性中透传的参数,如:on="tap:id.click(test)"
  6. */
  7. this.addEventAction('actionName', function (event, str) {});

组件内触发事件(event):

  1. /**
  2. * 触发事件
  3. * @param {string} eventName 事件名称
  4. * @param {HTMLElement} element 触发的目标元素,注意:事件往递归的向上传播找到匹配 `on="eventName:xxx.xx` 并执行
  5. * @param {Object} event 事件对象,原生的 Event 对象,如果没有事件对象可以为 {} ,支持透传自定义参数,如:{userinfo: {}}
  6. */
  7. viewer.eventAction.execute(eventName, element, event);

目前支持事件

1. 全局事件(event)

目前点击事件支持全局触发。用法示例:

  1. <div on="tap:id.custom_event">单击时触发</div>

2. 组件可被外界监听事件(event)

组件 事件 事件说明
mip-form submit 表单提交时触发
mip-form submitSuccess 表单提交成功
mip-form submitError 表单提交失败
mip-form input change 输入框内容变化

用法示例:

  1. <mip-form on="submitSuccess:xxx.xxx">表单提交成功后触发xx</mip-form>

3. 组件可被触发的事件(action)

组件 事件 事件说明
mip-fixed close 悬浮元素关闭
mip-semi-fixed close 悬浮元素关闭
mip-lightbox close 弹出层关闭
mip-lightbox open 弹出层展开
mip-lightbox toggle 弹出层状态切换
mip-sidebar close 侧边栏关闭
mip-sidebar open 侧边栏展开
mip-sidebar toggle 侧边栏状态切换
mip-list more 异步加载更多数据

用法示例:

  1. <div on="xxx:mip-fixed01.close">触发弹层关闭事件</div>

实际示例

示例1: DOM 点击通信

  1. <mip-test id="test"></mip-test>
  2. <div on="tap:test.custom_event">不带参数</div>
  3. <div on="tap:test.custom_event(test_button)">带参数</div>
  4. <div on="tap:test.custom_event(test_button) tap:test.custom_event(test_button1)">多个事件</div>
  1. // mip-test.js
  2. define(function (require) {
  3. var customEle = require('customElement').create();
  4. customEle.prototype.firstInviewCallback = function () {
  5. // 绑定事件,其它元素可通过 on='xxx' 触发
  6. this.addEventAction('custom_event', function (event/* 对应的事件对象 */, str /* 事件参数 */) {
  7. console.log(str); // undefined or 'test_button' or 'test_button1'
  8. });
  9. };
  10. return customEle;
  11. });

[info] DOM 点击通信可运行示例见 mip-showmore 示例

示例2:使用 DOM 属性实现组件间通信

当用户触发筛选(<mip-filter>)时,页面返回顶部(<mip-gototop>)。

  1. <-- on="主动通信组件内绑定的可监听事件:被通信组件id.被通信组件暴露出来的方法"-->
  2. <mip-filter on="filt:mygototop01.gototop"></mip-filter>
  3. <mip-fixed type="gototop">
  4. <mip-gototop id="mygototop01"></mip-gototop>
  5. </mip-fixed>
  1. // mip-filter.js 抛出 'filt' 事件(event),在 DOM 中通过 on 绑定。
  2. define(function (require) {
  3. var customEle = require('customElement').create();
  4. var viewer = require('viewer');
  5. customEle.prototype.firstInviewCallback = function () {
  6. this.element.addEventListener('click', function(event) {
  7. filt(); // 筛选逻辑
  8. // 触发组件本身的'filt'事件
  9. viewer.eventAction.execute('filt', event.target, event);
  10. });
  11. };
  12. return customEle;
  13. });
  14. // mip-gototop.js 定义 'gototop' 操作(action),方便 eventAction 从外部触发。
  15. define(function (require) {
  16. var customEle = require('customElement').create();
  17. var viewer = require('viewer');
  18. // 尽早绑定事件,写在 build 声明周期中。
  19. customEle.prototype.build = function () {
  20. addGotoTopEventHandler(); //组件点击事件监听及处理
  21. // 定义 gototop 事件,方便 eventAction 从外部触发。
  22. this.addEventAction('gototop', function (event/* 对应的事件对象 */, str /* 事件参数 */) {
  23. pageScrollTop(); //组件内定义的页面回顶操作。
  24. });
  25. };
  26. return customEle;
  27. });

注意事项

  1. HTML 属性中的on值空格用于分割多个事件,单个事件内部不能出现空格。
    1. <div on="tap:id01.custom_event1 tap:id02.custom_event2">多个事件</div>
  2. 传的参数将变成字符串,如 on="tap:id.action(1,2,3)",得到的不是1 ,而是"1"
  3. 事件将向上冒泡传播,如单击示例中mip-xx1, 两个标签的tap事件都会触发。
    1. <mip-xx1 on="tap:id.action">
    2. <mip-xx2 on="tap:id2.action2"></mip-xx2>
    3. </mip-xx1>