Skip to content

useFormDialog 表单对话框

useDialog 之上注入 ElFormBuilder:内容区默认渲染构建器,底部「提交」先执行 el-form validate(),再可选 submitHandler,最后 resolve 并携带当前 model 的 JSON 快照;「取消」触发 cancelHandler 后以 cancel 原因 reject

useDialog 相同,须在应用根布局挂载 portal-vue 目标(文档站已在布局中放置 <portal-target name="ell-dialog" multiple />)。

基础用法

参数

useFormDialog(options, keepInstance?, targetName?)

参数说明默认
optionsUseFormDialogOptions
keepInstance是否保留 ElDialog 实例(同 useDialogfalse
targetNameportal 目标名'ell-dialog'

返回值

useDialogdialogUid、各 *PortalNameopenDialog 等基础上扩展:

属性说明
formUid内部为 ElFormBuilder 生成的 uid
open / openFormDialog打开表单弹窗,入参 EllFormDialogOpenArgs?
close手动 resolve;不传参时 data.model 为当前快照
dismissreject({ reason: 'cancel' })

类型说明

主包导出:

ts
import type {
  EllFormDialogFormConfig,
  EllFormDialogOpenArgs,
  EllFormDialogPayload,
  UseFormDialogOptions,
} from 'element-plus-lab'
  • EllFormDialogPayloadmodel(响应式)、formRefel-form 实例,打开初期可能为 undefined)、uid(与内部 ElFormBuilder 相同,用于拼接 ${uid}-${field}-body-append 等 portal 名)。
  • UseFormDialogOptions:除 formConfig 外,可选 title / width / dialogConfig / submitText / cancelText / actions,以及 renderHeader / render / renderFormSlot / renderFooter / beforeCloserender* 语义同 useDialog)。

renderFormSlot:在默认 ElFormBuilder 的默认插槽里写入 VNode(与 model / uid 同一份)。典型用法是 Portal 打到分组 / 自定义块的 ${uid}-${field}-body-append 等靶位,无需 render 整段替换主体。与 render 同时存在时以 render 为准。

ts
import { Portal } from 'portal-vue'

const { open } = useFormDialog({
  formConfig: {
    schema: [
      {
        type: 'group',
        field: 'space',
        children: [
          { field: 'name', label: '名称', controlType: 'input' },
        ],
      },
    ],
    initialValues: { name: '' },
  },
  renderFormSlot: ({ uid, model }) => (
    <Portal to={`${uid}-space-body-append`}>
      {/* 与 schema 字段同一份 model,可读写 */}
      <span>{String(model.name ?? '')}</span>
    </Portal>
  ),
})

详见 packages/components/form-dialog/src/types.ts

贡献者

The avatar of contributor named as jenemy jenemy
The avatar of contributor named as Cursor Cursor

页面历史

Released under the Apache License 2.0.