Modal
用于用户交互和显示信息的对话框遮罩。
import { Modal } from 'asterui'基础模态框
带打开/关闭功能的简单模态框。
import { Modal, Button } from 'asterui'
import { useState } from 'react'
function App() {
const [open, setOpen] = useState(false);
return (
<Button color="primary" onClick={() => setOpen(true)}>
Open Modal
</Button>
<Modal
open={open}
onClose={() => setOpen(false)}
title="Basic Modal"
>
<p>This is the modal content.</p>
<p>You can put any content here.</p>
</Modal>
)
}
export default App 默认页脚
使用 onOk 和 onCancel 属性的内置确定/取消按钮模态框。
import { Modal, Button } from 'asterui'
import { useState } from 'react'
function App() {
const [open, setOpen] = useState(false);
return (
<Button color="primary" onClick={() => setOpen(true)}>
Open Modal
</Button>
<Modal
open={open}
onOk={() => {
setOpen(false);
Modal.success({ title: 'Submitted', content: 'Form submitted successfully!' });
}}
onCancel={() => setOpen(false)}
title="Submit Form"
okText="Submit"
cancelText="Cancel"
>
<p>Click OK to submit the form or Cancel to close.</p>
</Modal>
)
}
export default App 自定义页脚
带自定义页脚按钮的模态框。
import { Modal, Button, Space } from 'asterui'
import { useState } from 'react'
function App() {
const [open, setOpen] = useState(false);
const handleOk = () => {
setOpen(false);
Modal.success({ title: 'Success', content: 'Action completed successfully!' });
};
return (
<Button color="primary" onClick={() => setOpen(true)}>
Open Modal
</Button>
<Modal
open={open}
onClose={() => setOpen(false)}
title="Confirmation"
footer={
<Space direction="horizontal" size="sm">
<Button onClick={() => setOpen(false)}>Cancel</Button>
<Button color="primary" onClick={handleOk}>
OK
</Button>
</Space>
}
>
<p>Are you sure you want to proceed with this action?</p>
</Modal>
)
}
export default App 静态方法
使用 Modal.info、Modal.success、Modal.warning 和 Modal.error 的快速对话框。
import { Modal, Button, Space } from 'asterui'
function App() {
return (
<Space direction="horizontal" size="sm" wrap>
<Button onClick={() => Modal.info({ title: 'Info', content: 'This is an informational message.' })}>
Info
</Button>
<Button onClick={() => Modal.success({ title: 'Success', content: 'Operation completed successfully!' })}>
Success
</Button>
<Button onClick={() => Modal.warning({ title: 'Warning', content: 'Please proceed with caution.' })}>
Warning
</Button>
<Button onClick={() => Modal.error({ title: 'Error', content: 'Something went wrong.' })}>
Error
</Button>
</Space>
)
}
export default App 确认对话框
使用 Modal.confirm 的带确定和取消按钮的确认对话框。
import { Modal, Button } from 'asterui'
function App() {
return (
<Button
onClick={() =>
Modal.confirm({
title: 'Delete Item',
content: 'Are you sure you want to delete this item? This action cannot be undone.',
okText: 'Delete',
cancelText: 'Cancel',
onOk: () => Modal.success({ title: 'Deleted', content: 'Item has been deleted.' }),
})
}
>
Delete Item
</Button>
)
}
export default App 居中模态框
垂直居中的模态框。
import { Modal, Button } from 'asterui'
import { useState } from 'react'
function App() {
const [open, setOpen] = useState(false);
return (
<Button color="primary" onClick={() => setOpen(true)}>
Centered Modal
</Button>
<Modal
open={open}
onClose={() => setOpen(false)}
title="Centered Modal"
centered
>
<p>This modal is vertically centered on the screen.</p>
</Modal>
)
}
export default App 模态框尺寸
不同的模态框宽度。
import { Modal, Button, Space } from 'asterui'
import { useState } from 'react'
function App() {
const [open, setOpen] = useState(false);
const [width, setWidth] = useState<number | string>(520);
const showModal = (w: number | string) => {
setWidth(w);
setOpen(true);
};
return (
<Space direction="horizontal" size="sm" wrap>
<Button onClick={() => showModal(400)}>
Small (400px)
</Button>
<Button onClick={() => showModal(520)}>
Default (520px)
</Button>
<Button onClick={() => showModal(800)}>
Large (800px)
</Button>
</Space>
<Modal
open={open}
onClose={() => setOpen(false)}
title={`Modal Width: ${width}px`}
width={width}
>
<p>This modal has a width of {width}px.</p>
</Modal>
)
}
export default App 响应式位置
模态框位置可以使用响应式位置对象根据屏幕尺寸改变。
import { Modal, Button } from 'asterui'
import { useState } from 'react'
function App() {
const [open, setOpen] = useState(false);
return (
<Button color="primary" onClick={() => setOpen(true)}>
Responsive Modal
</Button>
<Modal
open={open}
onClose={() => setOpen(false)}
title="Responsive Modal"
position={{ base: 'bottom', sm: 'middle' }}
>
<p>This modal appears at the bottom on mobile and centered on larger screens.</p>
<p className="text-sm text-base-content/70 mt-2">Resize your browser to see the effect.</p>
</Modal>
)
}
export default App | 属性 | 描述 | 类型 | 默认值 |
|---|---|---|---|
open | 受控的打开状态 | boolean | false |
title | 模态框标题 | React.ReactNode | - |
children | 模态框内容 | React.ReactNode | - |
footer | 自定义页脚内容(设置为 null 隐藏) | React.ReactNode | - |
onOk | 确定按钮点击处理器(显示默认页脚) | () => void | Promise<void> | - |
onCancel | 取消按钮点击处理器 | () => void | - |
onClose | 关闭处理器(onCancel 的别名) | () => void | - |
okText | 确定按钮文本 | string | 'OK' |
cancelText | 取消按钮文本 | string | 'Cancel' |
width | 模态框宽度 | number | string | - |
centered | 垂直居中模态框 | boolean | false |
position | 模态框位置(支持响应式对象) | 'top' | 'middle' | 'bottom' | { base?, sm?, md?, lg?, xl?, '2xl'? } | - |
align | 模态框对齐 | 'start' | 'end' | - |
maskClosable | 点击背景关闭 | boolean | true |
closable | 显示关闭背景 | boolean | true |
className | 额外的 CSS 类名 | string | - |
Modal.info/success/warning/error/confirm
Section titled “Modal.info/success/warning/error/confirm”| 属性 | 描述 | 类型 | 默认值 |
|---|---|---|---|
title | 模态框标题 | React.ReactNode | - |
content | 模态框内容 | React.ReactNode | - |
onOk | 确定按钮点击处理器 | () => void | Promise<void> | - |
onCancel | 取消按钮点击处理器(仅限 confirm) | () => void | - |
okText | 确定按钮文本 | string | 'OK' |
cancelText | 取消按钮文本(仅限 confirm) | string | 'Cancel' |
type | 用于样式的模态框类型 | 'info' | 'success' | 'warning' | 'error' | - |
Modal.info(config)- 信息对话框Modal.success(config)- 成功对话框Modal.warning(config)- 警告对话框Modal.error(config)- 错误对话框Modal.confirm(config)- 带确定/取消的确认对话框
- 使用原生
<dialog>元素以获得正确的模态框行为 - 打开时焦点被困在模态框内
- 按 Escape 键关闭模态框
- 关闭时焦点恢复到触发器元素
- 为屏幕阅读器使用
aria-labelledby和aria-describedby