美文网首页
微信小程序以“npm”方式使用 ts-events

微信小程序以“npm”方式使用 ts-events

作者: 黠狼_AI | 来源:发表于2019-03-11 19:32 被阅读0次

    简介

    ts-events 是个提供类似 qt signal/slot 或者 c# event 事件响应的库。微信小程序本身也有使用事件响应的设计,但多是页面的响应事件(参考 WXS响应事件),ts-events提供纯js方面的响应事件。

    ts-events npm官方文档

    地址:https://www.npmjs.com/package/ts-events

    前提

    说明

    以下运行环境均为windows,使用的是npm方式引入,微信小程序使用npm详见另一篇文章 微信小程序以“npm”方式使用有赞组件 vant

    环境

    • 安装小程序开发工具(略)

    • 小程序使用npm(略)

    步骤

    一、在小程序目录下,CMD执行命令,安装有赞组件

    npm i ts-events -S --production -verbose

    二、构建npm

    三、使用

    以下代码为了简单,粗暴地在app.js中测试。

    主要介绍SyncEvent(同步),AsyncEvent(异步),AnyEvent(自定义)三种事件的简单用法,更深入的用法详见官方文档。

    同步、异步指的是事件触发和事件处理是否同步执行。

    detach()的用法请去掉注释。

    代码中均有注释,不再详细讲解代码。

    
    //app.js
    
    import {
    
      SyncEvent,
    
      AsyncEvent,
    
      AnyEvent
    
    } from 'ts-events'
    
    import * as tsEvents from 'ts-events'
    
    // 微信小程序没有 setImmediate(),会报错"setImmediate is not defined",替换 AsyncEvent.setScheduler()的默认实现方式
    
    AsyncEvent.setScheduler(function(callback) {
    
      setTimeout(callback, 0)
    
    })
    
    App({
    
      testSyncEvent: () => {
    
        let syncEvent = new SyncEvent()
    
        // 事件处理
    
        syncEvent.attach((values) => {
    
          // 注:%c 实现日志输出颜色,模拟器有效,真机无效
    
          console.log('%c syncEvent values:', 'color:#f80', values)
    
        })
    
        // 只执行一次的事件处理
    
        syncEvent.once((values) => {
    
          console.log('%c syncEvent once values:', 'color:#f80', values)
    
        })
    
        // 模拟事件触发1
    
        console.log('%c syncEvent before call post()', 'color:#f80')
    
        syncEvent.post('hello!')
    
        console.log('%c syncEvent after call post()', 'color:#f80')
    
        // 模拟事件触发2
    
        setTimeout(() => {
    
          console.log('%c syncEvent before call post() 2', 'color:#f80')
    
          syncEvent.post("hello 2!")
    
          console.log('%c syncEvent after call post() 2', 'color:#f80')
    
        })
    
        // 卸载事件处理
    
        // 请注意,执行detach(),模拟事件触发1 values会输出,模拟事件触发2 values不会输出
    
        // syncEvent.detach()
    
      },
    
      testAsyncEvent: () => {
    
        let asyncEvent = new AsyncEvent()
    
        // 挂载事件处理
    
        asyncEvent.attach((values) => {
    
          console.log('%c asyncEvent values:', 'color:#8f0', values)
    
        })
    
        // 模拟事件触发1
    
        console.log('%c asyncEvent before call post()', 'color:#8f0')
    
        asyncEvent.post('hello!')
    
        console.log('%c asyncEvent after call post()', 'color:#8f0')
    
        // 模拟事件触发2
    
        setTimeout(() => {
    
          console.log('%c asyncEvent before call post() 2', 'color:#8f0')
    
          asyncEvent.post("hello 2!")
    
          console.log('%c asyncEvent after call post() 2', 'color:#8f0')
    
        }, 1000)
    
        // 卸载事件处理
    
        // 请注意,执行detach(),模拟事件触发1,2 values都不会输出,对比SyncEvent
    
        // asyncEvent.detach()
    
      },
    
      testAnyEvent: () => {
    
        const anyEvent = new AnyEvent()
    
        // 挂载同步处理
    
        anyEvent.attachSync(function(values) {
    
          console.log('%c anyevent synchronous values:', 'color:#0f8', values)
    
        })
    
        // 挂载异步处理
    
        anyEvent.attachAsync(function(values) {
    
          console.log('%c anyevent asynchronous values:', 'color:#0f8', values)
    
        })
    
        // 挂载队列处理,必须执行flush才会得到响应
    
        anyEvent.attachQueued(function(values) {
    
          console.log('%c anyevent queued values:', 'color:#0f8', values)
    
        })
    
        // 挂载一次异步处理,只执行一次
    
        anyEvent.onceAsync(function(values) {
    
          console.log('%c anyevent after this event, I will be detached and print no more', 'color:#0f8', values)
    
        })
    
        console.log('%c anyevent before call post()', 'color:#0f8')
    
        anyEvent.post('hi!')
    
        console.log('%c anyevent after call post()', 'color:#0f8')
    
        setTimeout(() => {
    
          console.log('%c anyevent before call post() 2', 'color:#0f8')
    
          anyEvent.post('hi 2!')
    
          console.log('%c anyevent after call post() 2', 'color:#0f8')
    
          console.log('%c anyevent before call flush()', 'color:#0f8')
    
          // 触发 attachQueued
    
          tsEvents.flush()
    
        }, 300)
    
      },
    
      onLaunch: function() {
    
        // 测试同步
    
        this.testSyncEvent()
    
        // 测试异步
    
        // 编码打印混在一起,延迟执行
    
        setTimeout(this.testAsyncEvent, 2000)
    
        // 测试定制处理
    
        // 编码打印混在一起,延迟执行
    
        setTimeout(this.testAnyEvent, 4000)
    
      }
    
    })
    
    

    结果

    image

    相关文章

      网友评论

          本文标题:微信小程序以“npm”方式使用 ts-events

          本文链接:https://www.haomeiwen.com/subject/ezcipqtx.html