Modal 对话框组件 #

基本用法 #

jsx
import {
  Modal,
  ModalOverlay,
  ModalContent,
  ModalHeader,
  ModalFooter,
  ModalBody,
  ModalCloseButton,
  Button,
  useDisclosure,
} from '@chakra-ui/react'

function Example() {
  const { isOpen, onOpen, onClose } = useDisclosure()

  return (
    <>
      <Button onClick={onOpen}>打开对话框</Button>

      <Modal isOpen={isOpen} onClose={onClose}>
        <ModalOverlay />
        <ModalContent>
          <ModalHeader>对话框标题</ModalHeader>
          <ModalCloseButton />
          <ModalBody>
            对话框内容
          </ModalBody>
          <ModalFooter>
            <Button colorScheme="blue" mr={3} onClick={onClose}>
              关闭
            </Button>
            <Button variant="ghost">其他操作</Button>
          </ModalFooter>
        </ModalContent>
      </Modal>
    </>
  )
}
jsx
<Modal size="xs">超小</Modal>
<Modal size="sm">小</Modal>
<Modal size="md">中等(默认)</Modal>
<Modal size="lg">大</Modal>
<Modal size="xl">超大</Modal>
<Modal size="full">全屏</Modal>

居中 Modal #

jsx
<Modal isCentered>
  {/* 内容 */}
</Modal>

滚动行为 #

jsx
<Modal scrollBehavior="inside">
  {/* 内容超出时可滚动 */}
</Modal>

实用示例 #

确认对话框 #

jsx
function ConfirmModal({ isOpen, onClose, onConfirm, title, message }) {
  return (
    <Modal isOpen={isOpen} onClose={onClose} isCentered>
      <ModalOverlay />
      <ModalContent>
        <ModalHeader>{title}</ModalHeader>
        <ModalCloseButton />
        <ModalBody>{message}</ModalBody>
        <ModalFooter>
          <Button variant="ghost" mr={3} onClick={onClose}>
            取消
          </Button>
          <Button colorScheme="red" onClick={onConfirm}>
            确认
          </Button>
        </ModalFooter>
      </ModalContent>
    </Modal>
  )
}

表单对话框 #

jsx
function FormModal({ isOpen, onClose }) {
  const [formData, setFormData] = useState({ name: '', email: '' })

  const handleSubmit = () => {
    console.log(formData)
    onClose()
  }

  return (
    <Modal isOpen={isOpen} onClose={onClose}>
      <ModalOverlay />
      <ModalContent>
        <ModalHeader>添加用户</ModalHeader>
        <ModalCloseButton />
        <ModalBody>
          <VStack spacing={4}>
            <FormControl>
              <FormLabel>姓名</FormLabel>
              <Input
                value={formData.name}
                onChange={(e) => setFormData({ ...formData, name: e.target.value })}
              />
            </FormControl>
            <FormControl>
              <FormLabel>邮箱</FormLabel>
              <Input
                value={formData.email}
                onChange={(e) => setFormData({ ...formData, email: e.target.value })}
              />
            </FormControl>
          </VStack>
        </ModalBody>
        <ModalFooter>
          <Button variant="ghost" mr={3} onClick={onClose}>
            取消
          </Button>
          <Button colorScheme="blue" onClick={handleSubmit}>
            保存
          </Button>
        </ModalFooter>
      </ModalContent>
    </Modal>
  )
}
属性 说明
isOpen 是否打开 boolean
onClose 关闭回调 function
size 尺寸 xs, sm, md, lg, xl, full
isCentered 居中 boolean
scrollBehavior 滚动行为 inside, outside

下一步 #

现在你已经掌握了 Modal 组件,接下来学习 Drawer 抽屉,了解如何使用侧边抽屉组件!

最后更新:2026-03-28