• 简体中文
  • Modal 弹窗

    在弹窗中展示内容或完成操作。

    编辑内容

    交互预览编辑内容
    basic.tsx
    import { Button, Form, FormField, Input, Modal, Select } from '@sudden3/leaf-ui';
    import { useRef, useState } from 'react';
    export function ModalBasic() {
      const [open, setOpen] = useState(false);
      const formRef = useRef<HTMLFormElement>(null);
      return (
        <>
          <Button onClick={() => setOpen(true)}>编辑项目</Button>
          <Modal
            open={open}
            title="项目设置"
            confirmText="保存"
            onClose={() => setOpen(false)}
            onConfirm={() => formRef.current?.requestSubmit()}
          >
            <Form
              ref={formRef}
              layout="vertical"
              onSubmit={(event) => {
                event.preventDefault();
                setOpen(false);
              }}
            >
              <FormField label="项目名称" required>
                <Input name="name" defaultValue="Leaf UI" />
              </FormField>
              <FormField label="负责人">
                <Select
                  name="owner"
                  options={[
                    { value: 'design', label: '设计团队' },
                    { value: 'engineering', label: '工程团队' },
                  ]}
                />
              </FormField>
            </Form>
          </Modal>
        </>
      );
    }
    

    自定义底部

    交互预览自定义底部
    footer.tsx
    import { Button, Modal } from '@sudden3/leaf-ui';
    import { useState } from 'react';
    export function ModalFooter() {
      const [open, setOpen] = useState(false);
      const [extra, setExtra] = useState(false);
      return (
        <>
          <Button variant="outline" onClick={() => setOpen(true)}>
            自定义底部
          </Button>
          <Modal
            open={open}
            title="扩展操作"
            onClose={() => setOpen(false)}
            footer={({ cancelButton, confirmButton }) => (
              <>
                <Button
                  variant="ghost"
                  style={{ marginRight: 'auto' }}
                  onClick={() => setExtra(!extra)}
                >
                  查看详情
                </Button>
                {cancelButton}
                {confirmButton}
              </>
            )}
          >
            <p>通过底部函数增加操作,保留默认取消与确定按钮。</p>
            {extra && <p>这里展示额外的信息。</p>}
          </Modal>
        </>
      );
    }
    
    属性类型默认值说明
    openboolean必填是否显示弹窗
    title / childrenReactNode—标题 / 内容
    footerReactNode | ((actions: ModalFooterActions) => ReactNode)取消 + 确定自定义底部;null 隐藏;函数接收默认按钮
    confirmText / cancelTextReactNode语言默认值按钮文字
    confirmLoadingbooleanfalse确认加载状态
    confirmButtonProps / cancelButtonPropsButtonProps—定制默认按钮属性
    onConfirm() => void | Promise<void>—由应用控制 open;Promise 拒绝时显示错误
    onCancel() => void—取消或关闭请求,未指定时使用 onClose
    widthnumber | string480弹窗宽度,数字为像素
    closable / maskClosable / keyboardbooleantrue关闭按钮 / 点击遮罩关闭 / Escape 关闭
    onClose() => void—请求关闭,由应用更新 open
    afterClose() => void—关闭动画完成后触发

    ModalFooterActions

    属性类型说明
    cancelButtonReactNode默认取消按钮
    confirmButtonReactNode默认确认按钮,保留加载状态

    类型

    定义组件属性或组装变量时可导入相关类型。

    import type { ModalProps, ModalFooterActions } from '@sudden3/leaf-ui';

    使用说明

    弹窗打开后聚焦内部控件,Tab 在弹窗中移动;Escape 关闭后恢复触发前的焦点。maskClosable、keyboard 可分别关闭遮罩、键盘退出。没有 title 时请提供 aria-label。

    footer 可放确认、取消等操作;也可以在内容中使用 Form。弹窗中的选择器浮层沿用区域主题。

    默认底部按取消、确定顺序靠右排列。传入 onConfirm 时,完成操作后自行更新 open;未传入时确定调用 onClose。Promise 执行期间显示加载状态并避免重复操作。提交表单可在 onConfirm 中调用 form.requestSubmit(),或通过 confirmButtonProps 设置 type="submit" 与 form ID,保留表单校验。footer 函数可扩展默认按钮,footer= 隐藏底部。