Constructor 
constructor 是 @overlastic/core 的核心方法,代表特殊的 overlays 构造器,内部接收挂载弹出层所需的所有信息,并实现 overlays 层的挂载。
你可能不需要使用 Constructor,我们提供了不同框架的 Overlays Constructor 实现,查看 packages 寻找你所使用的框架!
Custom Constructor 
通过 createConstructor 创建自定义的构造器,接收 mount 函数,内部传参包含 component、props、options,其中 options 是挂载的配置。
ts
export interface CustomComponent {
  (props: any): Element
}
export interface CustomOptions {
  // 你的自定义配置
  className?: string
}
const constructor = createConstructor<CustomComponent, CustomOptions>(
  (component, props, options) => {
    // options 包含传入的自定义配置
    const { container, id, index, deferred, className } = options
    function vanish() {
      container.remove()
    }
    const inst = component({
      ...props,
      // 将承诺者传递给组件
      deferred,
      // 将销毁的方法传递给组件
      vanish
    })
    // 使用自定义配置
    if (className)
      inst.classList.add(className)
    // 挂载元素
    container.append(inst)
  }
)Use Constructor 
createConstructor 返回 define、render 方法,define 用于定义命令式回调,而 render 则直接渲染
ts
function Component(props) {
  const element = document.createElement('div')
  element.classList.add('dialog-mask')
  element.innerHTML = `
    <div class="dialog-card">
      <div class="dialog-title">${props.title || 'Dialog'}</div>
      <div class="dialog-content">${props.content}</div>
      <div class="dialog-footer">
        <button class="confirm"> confirm </button>
        <button class="close"> close </button>
      </div>
    </div>
  `
  // 添加导致弹出层结束的事件
  element.querySelector('button.confirm').onclick = function () {
    props.deferred.confirm('ok')
  }
  // 添加导致弹出层弹出的事件
  element.querySelector('button.close').onclick = function () {
    props.deferred.cancel('close')
  }
  // 当外部或组件触发了 deferred,进行销毁组件
  props.deferred.finally(() => props.vanish())
  return element
}
// 定义命令式回调
const callback = constructor.define(Component, { className: 'custom-class' })通过使用 constructor.define 所定义的命令式回调挂载自定义的组件,并获得返回值。
ts
const result = await callback({
  title: '再见',
  content: '机遇不一定有,但来了一定要把握'
})
// result: ok或者通过使用 constructor.render 直接渲染组件。
ts
const result = await constructor.render(Component, {
  title: '再见',
  content: '机遇不一定有,但来了一定要把握'
})
// result: ok