微信小程序开发笔记 进阶篇③——onfire.js事件订阅和发布在微信小程序中的使用

一、前言

微信小程序开发笔记——导读

二、onfire.js介绍

一个简单实用的事件订阅和发布的库。

onfire.js 的 github地址

三、API介绍

函数说明
on(eventName, callback, context)订阅eventName事件,当事件触发时,回调callback
one(eventName, callback, context)订阅eventName事件,当事件触发时,只回调一次callback
fire(eventName)异步触发eventName事件,将数据发送给回调函数
fireSync(eventName)同步触发eventName事件,将数据发送给回调函数
un(event)取消event事件订阅
clear()取消所有事件订阅

四、实例应用

  • 新建小程序项目
  • 选择JavaScript - 基础模板
  • 导入TDesign - 组件库
  • 导入utils/onfire.js
  • 编写实例应用代码

在这里插入图片描述

  • 订阅事件1
  • 异步触发,同步触发,都有回调
  • 取消订阅事件1
  • 触发之后无回调

在这里插入图片描述

  • 单次订阅事件2
  • 异步触发,有回调
  • 再触发,无回调

在这里插入图片描述

  • 订阅事件1
  • 单次订阅事件2
  • 取消所有订阅
  • 怎么触发,都没有回调

在这里插入图片描述

五、onfire源码

onfire.js源码浅析请查阅:一个事件订阅和发布的库(onfire.js)的源码浅析

/**
  Copyright (c) 2016 hustcc http://www.atool.org/
  License: MIT 
  https://github.com/hustcc/onfire.js
**/
/* jshint expr: true */ 
!function (root, factory) {
  if (typeof module === 'object' && module.exports)
    module.exports = factory();
  else
    root.onfire = factory();
}(typeof window !== 'undefined' ? window : this, function () {
  var __onfireEvents = {},
   __cnt = 0, // evnet counter
   string_str = 'string',
   function_str = 'function',
   hasOwnKey = Function.call.bind(Object.hasOwnProperty),
   slice = Function.call.bind(Array.prototype.slice);

  function _bind(eventName, callback, is_one, context) {
    if (typeof eventName !== string_str || typeof callback !== function_str) {
      throw new Error('args: '+string_str+', '+function_str+'');
    }
    if (! hasOwnKey(__onfireEvents, eventName)) {
      __onfireEvents[eventName] = {};
    }
    __onfireEvents[eventName][++__cnt] = [callback, is_one, context];

    return [eventName, __cnt];
  }
  function _each(obj, callback) {
    for (var key in obj) {
      if (hasOwnKey(obj, key)) callback(key, obj[key]);
    }
  }
  /**
   *  onfire.on( event, func, context ) -> Object
   *  - event (String): The event name to subscribe / bind to
   *  - func (Function): The function to call when a new event is published / triggered
   *  Bind / subscribe the event name, and the callback function when event is triggered, will return an event Object
  **/
  function on(eventName, callback, context) {
    return _bind(eventName, callback, 0, context);
  }
  /**
   *  onfire.one( event, func, context ) -> Object
   *  - event (String): The event name to subscribe / bind to
   *  - func (Function): The function to call when a new event is published / triggered
   *  Bind / subscribe the event name, and the callback function when event is triggered only once(can be triggered for one time), will return an event Object
  **/
  function one(eventName, callback, context) {
    return _bind(eventName, callback, 1, context);
  }
  function _fire_func(eventName, args) {
    if (hasOwnKey(__onfireEvents, eventName)) {
      _each(__onfireEvents[eventName], function(key, item) {
        item[0].apply(item[2], args); // do the function
        if (item[1]) delete __onfireEvents[eventName][key]; // when is one, delete it after triggle
      });
    }
  }
  /**
   *  onfire.fire( event[, data1 [,data2] ... ] )
   *  - event (String): The event name to publish
   *  - data...: The data to pass to subscribers / callbacks
   *  Async Publishes / fires the the event, passing the data to it's subscribers / callbacks
  **/
  function fire(eventName) {
    // fire events
    var args = slice(arguments, 1);
    setTimeout(function () {
      _fire_func(eventName, args);
    });
  }
  /**
   *  onfire.fireSync( event[, data1 [,data2] ... ] )
   *  - event (String): The event name to publish
   *  - data...: The data to pass to subscribers / callbacks
   *  Sync Publishes / fires the the event, passing the data to it's subscribers / callbacks
  **/
  function fireSync(eventName) {
    _fire_func(eventName, slice(arguments, 1));
  }
  /**
   * onfire.un( event ) -> Boolean
   *  - event (String / Object): The message to publish
   * When passed a event Object, removes a specific subscription.
   * When passed event name String, removes all subscriptions for that event name(hierarchy)
  *
   * Unsubscribe / unbind an event or event object.
   *
   * Examples
   *
   *  // Example 1 - unsubscribing with a event object
   *  var event_object = onfire.on('my_event', myFunc);
   *  onfire.un(event_object);
   *
   *  // Example 2 - unsubscribing with a event name string
   *  onfire.un('my_event');
  **/
  function un(event) {
    var eventName, key, r = false, type = typeof event;
    if (type === string_str) {
      // cancel the event name if exist
      if (hasOwnKey(__onfireEvents, event)) {
        delete __onfireEvents[event];
        return true;
      }
      return false;
    }
    else if (type === 'object') {
      eventName = event[0];
      key = event[1];
      if (hasOwnKey(__onfireEvents, eventName) && hasOwnKey(__onfireEvents[eventName], key)) {
        delete __onfireEvents[eventName][key];
        return true;
      }
      // can not find this event, return false
      return false;
    }
    else if (type === function_str) {
      _each(__onfireEvents, function(key_1, item_1) {
        _each(item_1, function(key_2, item_2) {
          if (item_2[0] === event) {
            delete __onfireEvents[key_1][key_2];
            r = true;
          }
        });
      });
      return r;
    }
    return true;
  }
  /**
   *  onfire.clear()
   *  Clears all subscriptions
  **/
  function clear() {
    __onfireEvents = {};
  }
  return {
    on: on,
    one: one,
    un: un,
    fire: fire,
    fireSync: fireSync,
    clear: clear
  };
});

六、实例源码

onfire.js

import Message from 'tdesign-miniprogram/message/index';
var onfire = require("../../utils/onfire.js");

Page({
    data: {},
    onEvent1Btn(e) {
        console.log("订阅事件1")
        onfire.on(
            "event1",
            function (data) {
                console.log("事件1回调,数据=" + data)
                Message.info({
                    offset: [20, 32],
                    duration: 2000,
                    icon: false,
                    content: "事件1回调,数据=" + data,
                });
            }
        )
    },
    unEvent1Btn(e) {
        console.log("取消订阅事件1")
        onfire.un("event1")
    },
    oneEvent2Btn(e) {
        console.log("单次订阅事件2")
        onfire.one(
            "event2",
            function (data) {
                console.log("事件2回调,数据=" + data)
            }
        )
    },
    unEvent2Btn(e) {
        console.log("取消订阅事件2")
        onfire.un("event2")
    },
    clearBtn(e) {
        console.log("取消所有订阅")
        onfire.clear()
    },
    fireEvent1Btn(e) {
        console.log("异步触发事件1(数据123)")
        onfire.fire("event1", 123)
    },
    fireSyncEvent1Btn(e) {
        console.log("同步触发事件1(数据456)")
        onfire.fire("event1", 456)
    },
    fireEvent2Btn(e) {
        console.log("异步触发事件2(数据789)")
        onfire.fire("event2", 789)
    },
    fireSyncEvent2Btn(e) {
        console.log("同步触发事件2(数据012)")
        onfire.fireSync("event2", "012")
    },
});

onfire.json

{
  "navigationBarTitleText": "onfire",
  "navigationBarBackgroundColor": "#fff",
  "usingComponents": {
    "t-button": "tdesign-miniprogram/button/button",
    "t-demo": "../../components/demo-block/index"
  }
}

onfire.wxml

<view class="demo">
  <view class="demo-title">onfire.js </view>
  <view class="demo-desc"> 一个简单实用的事件订阅和发布的库。 </view>
  
  <t-demo title="订阅">
    <view class="box">
      <!-- <t-button theme="primary" block bindtap="">强按钮</t-button> -->
      <t-button theme="primary" variant="plain" block bindtap="onEvent1Btn">订阅事件1</t-button>
      <t-button theme="plain" variant="plain" block bindtap="unEvent1Btn">取消订阅事件1</t-button>
      <t-button theme="primary" variant="plain" block bindtap="oneEvent2Btn">单次订阅事件2</t-button>
      <t-button theme="plain" variant="plain" block bindtap="unEvent2Btn">取消订阅事件2</t-button>
      <t-button variant="plain" block bindtap="clearBtn">取消所有订阅</t-button>
    </view>
  </t-demo>
  
  <t-demo title="发布">
    <view class="box">
      <t-button theme="primary" block bindtap="fireEvent1Btn">异步触发事件1(数据123)</t-button>
      <t-button theme="primary" variant="plain" block bindtap="fireSyncEvent1Btn">同步触发事件1(数据456)</t-button>
      <t-button theme="primary" block bindtap="fireEvent2Btn">异步触发事件2(数据789)</t-button>
      <t-button theme="primary" variant="plain" block bindtap="fireSyncEvent2Btn">同步触发事件2(数据012)</t-button>
    </view>
  </t-demo>
  <t-message id="t-message" bind:actionBtnClick="clickMessageBtnHadnle" t-class="t-class-content" />
</view>

onfire.wxss

page {
  background: #fff;
}
.demo-block__oper {
  padding: 0 32rpx;
}
.button-group {
  margin-top: 32rpx;
}
.button-group .button-group-item {
  margin-bottom: 32rpx;
}

.box {
  margin: 0 32rpx;
}

.demo .t-button {
  margin-top: 32rpx;
}
.demo .full-width {
  background: rgba(0, 0, 0, 0.4);
  padding: 8px 0;
  margin-top: 16px;
}
.demo .full-width .t-button {
  margin-top: 0;
}
.demo .no-border {
  border: 0;
}
.demo .no-border-radius {
  border-radius: 0;
}
.demo .content-margin-right {
  margin-right: 32rpx;
}
.demo .box {
  margin: 0 32rpx;
}
.demo .align-bottom {
  display: flex;
  flex-direction: row;
  align-items: flex-end;
}

觉得好,就一键三连呗(点赞+收藏+关注)

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
onfire.js 是一个很简单的事件分发的Javascript库(仅仅 0.9kb),简洁实用。 可以用于: 简单的事件分发; 在 react / vue.js / angular 用于跨组件的轻量级实现; 事件订阅发布; API方法: 1.on(event_name, callback) 绑定事件,参数为event_name和callback, 当有名字为event_name的事件发生的时候,callback方法将会被执行。 这个方法会返回一个eventObj,这个可以用于使用un(eventObj)方法来取消事件绑定。 2.one(event_name, callback) 绑定(订阅事件,参数为 event_name with callback. 当被触发一次之后失效。只能被触发一次,一次之后自动失效。 3.fire(event_name, data) 触发名字为event_name的事件,并且赋予变量data为callback方法的输入值。 4.un(eventObj / eventName / function) 取消事件绑定。可以仅仅取消绑定一个事件回调方法,也可以直接取消全部的事件; 5.clear() 清空所有事件使用Demo: 1. 引入js文件 npm install onfire.js 可以使用[removed]标签直接引入; 也可以使用require或者import关键字引入,会得到全局变量 onfire。 import onfire from 'onfire.js'; // or var onfire = require("onfire.js"); 2. 简单使用 使用方法on来订阅事件, 使用un来取消订阅, 使用fire方法来触发事件。 import onfire from 'onfire.js'; // 绑定事件 var eventObj = onfire.on('test_event', function(data) {     console.log('this is a event 1'); }); var eventObj2 = onfire.on('test_event', function(data) {     console.log('this is a event 2'); }); // 触发事件 onfire.fire('test_event', 'test_data'); // 取消绑定 onfire.un(eventObj); // 取消绑定这个事件. onfire.un('test_event'); // 取消绑定所有的 `test_event`. 标签:onfire
好的,关于微信小程序开发和电影小程序的基础目录和欢迎页面的创建,我可以为您提供一些帮助。 1. 基础目录的创建 在微信开发者工具创建一个新的小程序项目,会自动生成一些基础的目录和文件。其比较重要的有以下几个: - app.js:小程序的入口文件,可以在这里定义全局的变量和函数。 - app.json:小程序的全局配置文件,可以设置小程序的页面路径、窗口设置、导航栏样式等。 - pages/:小程序的页面目录,可以在这里创建小程序的各个页面。 - utils/:小程序的工具目录,可以在这里封装一些公用的函数和工具类。 2. 欢迎页面的创建 在小程序的根目录下,创建一个名为“index”的页面,作为小程序的欢迎页面。具体步骤如下: - 在pages目录下创建一个名为“index”的目录,然后在该目录下创建一个名为“index.wxml”的文件。这个文件就是欢迎页面的布局文件,可以在里面定义页面的结构和样式。 - 创建一个名为“index.js”的文件,这个文件是欢迎页面的逻辑文件,可以在里面定义页面的事件处理函数和数据。 - 在app.json文件,将“index”页面设置为小程序的启动页面,即将“index”页面的路径配置到“pages”数组的第一个元素。 至此,您已经成功创建了微信小程序的基础目录和欢迎页面。接下来,您可以根据自己的需求,添加更多的页面和功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小康师兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值