Files
Hippy/docs/web/custom-module.md
2022-08-17 17:54:24 +08:00

2.1 KiB
Executable File
Raw Permalink Blame History

自定义 Web 模块

使用 Hippy 开发过程中,当前的能力可能无法满足一些特定场景,这时候就需要使用第三方库或者通过自定义实现来提供额外的能力,下面就来介绍如何提供一个自定义模块


模块的扩展

扩展模块主要包括:

  1. 创建 HippyWebModule 的子类
  2. 设置 Moduel 的 name 属性
  3. 实现 Module 需要暴露给前端的 API

其中 HippyWebModule 类标准化了 HippyWebRenderer 可使用的模块,提供了一些 HippyWebRenderer 的上下文,在一个自定义组件中有几个比较重要的属性:

  • name:定义了模块的名字,与 JS 业务侧使用 callNative(moduleName,methodName) 中的 moduleName 相对应
  • context:提供了一系列的方法
sendEvent(type: string, params: any); //发送事件
sendUiEvent(nodeId: number, type: string, params: any); // 发送 UI 相关事件
sendGestureEvent(e: HippyTransferData.NativeGestureEvent); // 发送手势事件
subscribe(evt: string, callback: Function); // 监听某个事件
getModuleByName(moduleName: string); // 使用模块名获取模块

例子

以 CustomModule 为例,从头介绍如何扩展 Module

import { HippyWebModule } from '@hippy/web-renderer';
// 继承自 HippyWebModule
export class CustomModule extends HippyWebModule {
  // 设置 Module的 name 属性
  name = 'CustomModule';
  // 实现API `getBrowserInfo` 和 `setBrowserTitle` ,分别提供了获取当前浏览器的信息和设置浏览器 title 的功能。
  // 在提供自定义模块的 api 时,api的参数为 `function name(arg1,arg2...argn,callBack)`,前面的n个参数对应业务侧调用时的传递参数,最后一个 `callback` 是当 JS 业务侧需要有返回值形式的调用时,提供返回结果的回调。
  getBrowserInfo(callBack) {
   let data = {};
   ...
   callBack.resolve(data);
  }
  
  setBrowserTitle(title, callBack) {
   if (title) {
     window.document.title = title;
   };
   ...
   callBack.resolve(true);
   // callBack.reject(null);执行失败时
  }
}