# 原生事件

# 原生事件监听

在 APICloud 项目中,监听原生事件如下所示:

api.addEventListener({
  name: 'eventName'
}, (ret, err) => {
  if (ret) {
    // TODO
  } else {
    // Error Handle
  }
});

在 vue-apicloud-quickstart 中,可以和上面一样,直接使用 addEventListener 方法监听原生事件,如

<script>
export default {
  name: 'event-demo',
  methods: {
    listenKeyBack () {
      this.api.addEventListener({
        name: 'keyback'
      }, (ret, err) => {
        if (ret) {
          this.$toast({ msg: '按下了返回键' })
        } else {
          // Error Handle
        }
      });
    },
    loadMore () {
      this.api.addEventListener({
        name: 'scrolltobottom',
        extra: { threshold: 0 }
      }, (ret, err) => {
        // loadMore TODO
        this.$toast({ msg: '已滚动到底部' });
      });
    }
  },
  onReady () {
    this.listenKeyBack();
    this.loadMore();
  }
}
</script>

也可以使用更加便捷的 apiEvent 语法糖,如

<script>
export default {
  name: 'event-demo',
  apiEvent: {
    keyback (ret, err) {
      if (ret) {
        this.$toast({ msg: '按下了返回键' });
      } else {
        // Error Handle
      }
    },
    scrolltobottom: {
      extra: {
        threshold: 0
      },
      handle (/*ret, err*/) {
        // loadMore TODO
        this.$toast({ msg: '已滚动到底部' });
      }
    }
  }
}
</script>

# 支持的原生事件

支持除 apiready 外所有的原生事件,包括自定义事件。

发送自定义事件如下所示,

<template>
  <div @click="sendMyEvent">
    content
  </div>
</template>

<script>
export default {
  name: 'send-event-demo',
  methods: {
    sendMyEvent () {
      this.api.sendEvent({
        name: 'myEventName',
        extra: {
          key1: 'value1',
          key2: 'value2'
        }
      });
    },
  }
}
</script>

监听自定义事件如下所示,

<script>
export default {
  name: 'event-listener-demo',
  apiEvent: {
    myEventName (ret, err) {
      if (ret) {
        const { key1, key2 } = ret.value;
        // TODO width  key1, key2 
      } else {
        // Error Handle
      }
    },
  }
}
</script>

提示

以下是支持 apiEvent 监听的原生事件列表,来自 APICloud 官方文档。关于详细的原生事件参数,请参考APICloud 官方文档-API对象-Event (opens new window)

事件名 事件说明
batterylow (opens new window) 设备电池电量低事件,字符串类型
batterystatus (opens new window) 设备电池状态改变事件,如电量变化或正在充电,字符串类型
keyback (opens new window) 设备 back 键被点击事件,仅 Android 平台有效,字符串类型。该事件必须在 Window 中注册才有效,Frame 中注册无效,并且只在当前屏幕上的 window 才能收到回调
keymenu (opens new window) 设备 menu 键被点击事件,仅 Android 平台有效。该事件必须在 Window 中注册才有效,Frame 中注册无效,并且只在当前屏幕上的 window 才能收到回调
volumeup (opens new window) 设备音量加键被点击事件,仅 Android 平台有效。该事件必须在 Window 中注册才有效,Frame 中注册无效,并且只在当前屏幕上的 window 才能收到回调
volumedown (opens new window) 设备音量减键被点击事件,仅 Android 平台有效。该事件必须在 Window 中注册才有效,Frame 中注册无效,并且只在当前屏幕上的 window 才能收到回调
offline (opens new window) 监听设备断开网络的事件,字符串类型
online (opens new window) 监听设备连接到网络的事件,字符串类型
pause (opens new window) 应用进入后台事件,字符串类型
resume (opens new window) 应用从后台回到前台事件,字符串类型
scrolltobottom (opens new window) Window 或者 Frame 页面滑动到底部事件,字符串类型。可用于实现滚动到底部,加载更多功能
shake (opens new window) 设备摇动事件,字符串类型。设置该监听后,当前 APP 将立即开启摇动检测功能。可用于实现摇一摇功能
takescreenshot (opens new window) 应用在前台运行期间,用户屏幕截图事件(比如同时按下了 home 键和电源键),只支持 iOS
appidle (opens new window) 应用多长时间不操作屏幕后触发的事件,字符串类型
swipedown (opens new window) Window 或者 Frame 的页面全局向下轻扫事件,字符串类型
swipeleft (opens new window) Window 或者 Frame 的页面全局向左轻扫事件,字符串类型
swiperight (opens new window) Window 或者 Frame 的页面全局向右轻扫事件,字符串类型
swipeup (opens new window) Window 或者 Frame 的页面全局向上轻扫事件,字符串类型
tap (opens new window) Window 或者 Frame 的页面全局单击事件,字符串类型。监听该事件后,点击 window 或者 frame 的任意位置,都将收到 tap 回调。
longpress (opens new window) Window 或者 Frame 的页面全局长按事件,字符串类型。
viewappear (opens new window) Window 显示到屏幕的事件,字符串类型。收到 viewappear 事件回调,即标识当前 Window 已经动画结束,并且完全显示到屏幕上。该事件的作用对象为 Window,Frame 的显示不会收到事件
viewdisappear (opens new window) Window 离开屏幕的事件,字符串类型。收到 viewdisappear 事件回调,即标识当前 Window 已经动画结束,并且完全从屏幕上移除。该事件的作用对象为 Window,Frame 的隐藏不会收到事件,若是 Window 被关闭,此事件不会再回调
noticeclicked (opens new window) 状态栏通知被用户点击后的回调,字符串类型。注意:该事件仅针对api.notification以及官方 push 模块发出的状态栏通知有效,无法接收第三方模块或者SDK发出的状态栏通知
appintent (opens new window) 本应用被其他应用调起来时(Android 平台也可以通过 Activity 打开),收到相关数据的回调,字符串类型。在任意页面中注册该监听后,如果本应用被其他应用调起,将触发该监听函数,同时将传给该应用的数据回调给网页
smartupdatefinish (opens new window) 云修复使用静默修复时,更新完毕事件。可通过监听此事件来通知用户做是否强制重启应用等操作或者提示,以使更新生效,字符串类型。如果是提示修复,则不会触发该事件
launchviewclicked (opens new window) 闪屏广告被用户点击后的回调,字符串类型
keyboardshow (opens new window) 系统键盘弹出的回调,只支持iOS,字符串类型
keyboardhide (opens new window) 系统键盘隐藏的回调,只支持iOS,字符串类型
safeareachanged (opens new window) 页面安全区域发生变化的回调,可以在回调里根据需要调整页面,只iOS 11及以上系统有效,字符串类型
navtitle (opens new window) 监听 tabLayout 中导航栏标题点击事件
navbackbtn (opens new window) 监听 tabLayout 中导航栏默认返回按钮点击事件。点击返回按钮时默认会关闭当前 window,如果监听了此事件则不会自动关闭
navitembtn (opens new window) 监听 tabLayout 中导航栏左右两边自定义按钮点击事件,字符串类型
tabitembtn (opens new window) 监听 tabLayout 中 tabBar 项的点击事件。默认点击每一项时会切换到对应的页面,如果监听了此事件则页面不会自动切换过去,可以通过setTabBarAttr设置选中项,字符串类型
tabframe (opens new window) 监听 tabLayout 中有 tabBar 时 frame 项的切换事件。字符串类型

# 监听屏幕方向的变化

监听屏幕方向变化有所不同,如下所示:

<script>
export default {
  name: 'on-window-change-demo',
  onWindowChange () {
    // TODO
    this.$toast({ msg: '屏幕方向发生了改变' })
  }
}
</script>

# 使用 Typescript

Typescript 中,将使用 VueAPICloudAPIEvent 两个装饰器完成, 其中 onWindowChange 不需要装饰器





 



 




 
















<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
import { VueAPICloud, APIEvent } from 'vue-apicloud-quickstart'

@VueAPICloud
@Component
export default class Demo extends Vue {

  @APIEvent({ extra: { threshold: 0 } })
  scrolltobottom () {
    this.$toast({ msg: '已滚动到底部' });
  }

  @APIEvent()
  myEventName (ret: any, err: any) {
    if (ret) {
      const { key1, key2 } = ret.value;
      // TODO width  key1, key2 
    } else {
      // Error Handle
    }
  }

  onWindowChange () {
    // TODO
    this.$toast({ msg: '屏幕方向发生了改变' })
  }
}
</script>