Skip to content
文档目录

签章页面的渲染与卸载

签章页面的渲染方式

1. 通过 render + addFile 渲染签章页面

快速上手章节中介绍了如何快速将单体签章系统集成到已有的应用中,其 demo 中我们创建 SDK 实例时未传递任何参数,签章页面的渲染由我们手动调用 render 函数进行执行,在页面渲染后我们才执行了 addFile

如果后续不执行 addFile,页面将会渲染出没有 PDF 文件的情况,因此,我们在判断 files.length 为 0 时直接返回,避免出现空白页面的情况。

ts
// vue demo 中的示例
const handleAddFile = (event: any) => {
  const files = event.target.files;
  if (!files || !files.length || !ukeySdk) return;
  /** ukeySdk.container 可用于判断当前是否已经渲染,组件渲染后会将根 dom 元素保存在 sdk 实例中 */
  if (!ukeySdk.container) {
    ukeySdk.render(container.value!)
  }
  /** 向签章系统中添加 pdf 文件 */
  ukeySdk.addFile(files)
}

2. 创建 sdk 实例时传入 file 参数直接渲染签章页面

除了上述的渲染方式,SDK 构造函数的参数配置中还提供了 file 字段,用于页面初始化渲染时直接渲染出指定的 PDF 文件。

我们对之前的 vue 中的 demo 进行一定的改造,初始时无 sdk 实例,当我们上传文件后再进行创建,我们可以直接将 FileList 类型的文件通过构造函数中的 file 字段进行传递,后续直接进行 render 即可直接在页面渲染后加载 PDF 文件。

当然,面对 input 后续的 change,我们只需通过 addFile 将对应文件追加到系统中即可。

ts
  const container = ref<HTMLDivElement|null>(null)
  
  let ukeySdk: QysUKeySdk|null = null;

  const handleAddFile = (event: any) => {
    const files = event.target.files;
    if (!files || !files.length) return;

    if (!ukeySdk) {
      /** 通过配置传递文件 */
      ukeySdk = new QysUKeySdk({
        file: files
      })
    }

    /** ukeySdk.container 可用于判断当前是否已经渲染,组件渲染后会将根 dom 元素保存在 sdk 实例中 */
    if (!ukeySdk.container) {
      ukeySdk.render(container.value!)
    } else {
      /** 如果页面已经渲染,则通过 addFile 将文件追加到系统中 */
      ukeySdk.addFile(files)
    }
  }

⚠️ 注意

通过构造函数参数传递的文件,在渲染结束后会从 sdk.config 中删除,这是因为如果页面通过 sdk.closesdk.unmount 卸载后,如果再次调用 render 进行渲染,config.file 如果未被删除,则仍会在页面中出现。

如果您确实有这样的需求,不希望 file 从 config 中删除,建议您在渲染前将文件列表单独保存,重新调用 sdk.render 渲染前,先通过 sdk.updateConfig({ file: fileList }) 更新配置后再渲染。

3. 如何选择使用那种方式?

  • 如果您追求统一操作,推荐您使用第一种方式,提前创建好 sdk 实例,所有文件添加都通过 sdk.addFile 进行。
  • 如果您的需求非常简单,每次只有单个 PDF 需要渲染并操作,操作结束后页面即可关闭,此时推荐使用第二种方式,创建 sdk 实例时就传入文件,代码会更简洁。

签章页面的渲染与卸载 API

sdk 针对签章页面的渲染与卸载分别提供了两个API。出现这种情况的原因是由于历史包袱,尽可能兼容老版本 api 做出的让步。如果您没有历史包袱,推荐直接使用 render 进行页面渲染,使用 unmount 进行页面卸载。

签章页面渲染 API

其中 getUI 是基于 render 进行实现的

ts
// getUI 实现方案
getUI(style: Partial<CSSStyleDeclaration> = {}) {
  const container = document.createElement('div');
  assign(container.style, style);
  this.render(container);
  return container;
}

getUI 中会直接创建一个 div 元素作为 container,将签章页面渲染在该 dom 元素上,最后进行返回。

使用方式:

ts
const root = document.getElementById('container')
const signAppEl = sdk.getUI({
  width: '100%',
  height: '100%'
})
root.appendChild(signAppEl)

签章页面卸载 API

  • unmount 推荐使用
  • close 为兼容老版本, close 是 unmount 的别名,执行 close 后的实际调用依然是 unmount。

判断当前页面是否已经渲染

当调用 render 后,sdk 会在自身实例上将签章页面所渲染的根 dom 节点绑定在 container 属性上,调用 unmount 卸载完成后会将其置为 null

因此可以通过判断 sdk.container 是否存在来确定当前页面是否已经渲染。

ts
// vue demo 中的示例代码
if (!ukeySdk.container) {
  ukeySdk.render(container.value!)
}