Skip to content

FormDialog

弹窗表单,主要用在简单的事件打开表单场景

注意

该组件经过重构,完全摒弃了通过id传递上下文的方式,使用时请注意函数入参的改动。现在通过Vue中JSX的插槽写法实现类似的功能。

提示

使用函数式组件时可以通过解构的方式快速拿到form,具体请参考template案例。

Markup Schema 案例

JSON Schema 案例

Template 案例

Template 插槽案例

API

FormDialog 函数入参

参数说明类型
titleformDialogProps标题或Dialog组件的propsstring FormDialogProps
formDialogSlots表单弹窗组件的内容,支持组件,VNode和插槽的写法Component VNode[] ()=>VNode[] FormDialogSlots
dynamicMiddlewareNames动态中间件名称列表,使用时会转成Camel Case命名风格。string[]除了cancel confirm open

注意

formDialogProps是有保留值的。传入modelValueonUpdate:modelValue不会生效,已被FormDialog组件内部使用。

完整函数类型声明(参数的具体类型参见类型声明):

ts
interface FormDialog {
  (
    title: IFormDrawerProps | string,
    content?: Component | FormDrawerSlotContent,
    dynamicMiddlewareNames?: string[]
  ): IFormDialog
}

title

函数的第一个参数,传入字符串时会作为标题显示。可以传入IFormDialogProps来进行自定义。请优先使用forOpenforConfirmforCancel等中间件来控制弹框的生命周期。

参数说明类型默认值
cancelText取消按钮文字string取消
cancelButtonProps取消按钮的propsButtonProps-
okText确定按钮文字string确定
okButtonProps确定按钮的propsButtonProps-
loadingText加载中文字stringloading

其余参数请参考参考 https://cn.element-plus.org/zh-CN/component/dialog.html

content

函数的第二个参数,除了可以传入组件和VNode之外还可以接受Vue中JSX的插槽写法自定义headerfooter

插槽名说明类型
default表单弹窗组件的内容,支持组件,VNode和插槽的写法-
header头部插槽,可以通过作用域插槽调用resolve或reject来关闭,resovle可以接受dynamicMiddlewareNames中传入的字符串FormDialogSlotProps
footer底部插槽,可以通过作用域插槽调用resolve或reject来关闭,resovle可以接受dynamicMiddlewareNames中传入的字符串FormDialogSlotProps

dynamicMiddlewareNames

函数的第三个参数,是一个字符串数组,用于触发自定义footer或header中的按钮事件。

比如需要在弹框中额外添加保存草稿的功能,那么就可以在dynamicMiddlewareNames中传入'saveDraft',然后在footer中的按钮上绑定事件resolve('saveDraft')。 最后在可以像forConfirm一样添加forSaveDraft的相关逻辑。具体使用可以参考Demo中的例子。

提示

传入dynamicMiddlewareNames中的字符串会被转成Camel Case命名风格,比如'save-draft'会被转成'saveDraft'

IFormDialog 函数返回

函数的返回值,是一个是一个Promise对象,因此可以进行await操作来优化逻辑书写,需要调用open方法来打开弹框。可以进行链式调用来处理不同逻辑下的事件处理。现在支持通过dynamicMiddlewareNames来传入自定义的事件来处理业务逻辑。

方法名说明类型
open打开弹框(IFormProps)=>Promise<IFormProps.values>
forOpen打开弹框事件(IMiddleware<IFormProps>)=>IFormDialog
forConfirm确认事件(IMiddleware<IFormProps>)=>IFormDialog
forCancel取消事件(IMiddleware<IFormProps>)=>IFormDialog
for${Dynamic}自定义事件(IMiddleware<IFormProps>)=>IFormDialog

提示

自定义事件中的Dynamic的值为dynamicMiddlewareNames中传入的字符串,通过作用域插槽中的resolve方法来触发对应的事件。 传入dynamicMiddlewareNames中的字符串在调用方法时会被转成Pascal Case命名风格,比如传入['save-draft']应该调用'forSaveDraft'

提示

现在所有通过非resolve调用关闭的弹框都会作为错误抛出,因此在async/await写法中如果await了FormDialog则此之后的逻辑都只在表单成功提交后才会执行。

类型声明

IFormDialogProps
ts
export type IFormDialogProps = Partial<DialogProps> & {
  cancelText?: string
  cancelButtonProps?: ButtonProps
  okText?: string
  okButtonProps?: ButtonProps
  loadingText?: string
}
FormDialogSlots
ts
export interface FormDialogSlotProps {
  resolve: (type?: string) => void
  reject: () => void
  form: Form
}

export interface FormDialogSlots {
  header?: (props: FormDialogSlotProps) => VNode
  default?: () => VNode
  footer?: (props: FormDialogSlotProps) => VNode
}
IFormDialog
ts
export interface IFormDialog {
  forOpen: (middleware: IMiddleware<IFormProps>) => IFormDialog
  forConfirm: (middleware: IMiddleware<IFormProps>) => IFormDialog
  forCancel: (middleware: IMiddleware<IFormProps>) => IFormDialog
  [key: `for${string}`]: (middleware: IMiddleware<IFormProps>) => IFormDialog
  open: (props?: IFormProps) => Promise<any>
  close: () => void
}