叠加管理器
用于编程控制叠加组件
用法
函数createOverlay
创建一个可以编程控制的新叠加组件。
import { createOverlay } from "@chakra-ui/react"
const dialog = createOverlay<DialogProps>((props) => {
const { title, description, content, ...rest } = props
return (
<Dialog.Root {...rest}>
<Portal>
<Dialog.Backdrop />
<Dialog.Positioner>
<Dialog.Content>
{title && (
<Dialog.Header>
<Dialog.Title>{title}</Dialog.Title>
</Dialog.Header>
)}
<Dialog.Body spaceY="4">
{description && (
<Dialog.Description>{description}</Dialog.Description>
)}
{content}
</Dialog.Body>
</Dialog.Content>
</Dialog.Positioner>
</Portal>
</Dialog.Root>
)
})
然后渲染 Viewport
组件以查看叠加层。
<dialog.Viewport />
示例
对话框
这是一个可以编程控制的对话框组件示例。
"use client"
import { Button, Dialog, Portal, createOverlay } from "@chakra-ui/react"
interface DialogProps {
title: string
description?: string
content?: React.ReactNode
}
const dialog = createOverlay<DialogProps>((props) => {
const { title, description, content, ...rest } = props
return (
<Dialog.Root {...rest}>
<Portal>
<Dialog.Backdrop />
<Dialog.Positioner>
<Dialog.Content>
{title && (
<Dialog.Header>
<Dialog.Title>{title}</Dialog.Title>
</Dialog.Header>
)}
<Dialog.Body spaceY="4">
{description && (
<Dialog.Description>{description}</Dialog.Description>
)}
{content}
</Dialog.Body>
</Dialog.Content>
</Dialog.Positioner>
</Portal>
</Dialog.Root>
)
})
const Demo = () => {
return (
<>
<Button
onClick={() => {
dialog.open("a", {
title: "Dialog Title",
description: "Dialog Description",
})
}}
>
Open Modal
</Button>
<dialog.Viewport />
</>
)
}
抽屉
这是一个可以编程控制的抽屉组件示例。
"use client"
import { Button, Drawer, Portal, createOverlay } from "@chakra-ui/react"
interface DialogProps {
title: string
description?: string
content?: React.ReactNode
placement?: Drawer.RootProps["placement"]
}
const drawer = createOverlay<DialogProps>((props) => {
const { title, description, content, ...rest } = props
return (
<Drawer.Root {...rest}>
<Portal>
<Drawer.Backdrop />
<Drawer.Positioner>
<Drawer.Content>
{title && (
<Drawer.Header>
<Drawer.Title>{title}</Drawer.Title>
</Drawer.Header>
)}
<Drawer.Body spaceY="4">
{description && (
<Drawer.Description>{description}</Drawer.Description>
)}
{content}
</Drawer.Body>
</Drawer.Content>
</Drawer.Positioner>
</Portal>
</Drawer.Root>
)
})
const Demo = () => {
return (
<>
<Button
onClick={() => {
drawer.open("a", {
title: "Drawer Title",
description: "Drawer Description",
placement: "end",
})
}}
>
Open Drawer
</Button>
<drawer.Viewport />
</>
)
}
更新
使用 .update
方法更新叠加层的属性。
"use client"
import { Box, Button, Dialog, Portal } from "@chakra-ui/react"
import { createOverlay } from "@chakra-ui/react"
interface DialogProps {
title: string
description?: string
content?: React.ReactNode
}
const dialog = createOverlay<DialogProps>((props) => {
const { title, description, content, ...rest } = props
return (
<Dialog.Root {...rest}>
<Portal>
<Dialog.Backdrop />
<Dialog.Positioner>
<Dialog.Content>
{title && (
<Dialog.Header>
<Dialog.Title>{title}</Dialog.Title>
</Dialog.Header>
)}
<Dialog.Body spaceY="4">
{description && (
<Dialog.Description>{description}</Dialog.Description>
)}
{content}
</Dialog.Body>
</Dialog.Content>
</Dialog.Positioner>
</Portal>
</Dialog.Root>
)
})
const Demo = () => {
return (
<>
<Button
onClick={async () => {
dialog.open("a", {
title: "Initial Modal Title",
content: (
<Box textStyle="sm">This text will update in 2 seconds.</Box>
),
})
setTimeout(() => {
dialog.update("a", {
title: "Updated Modal Title",
content: (
<Box textStyle="sm" color="fg.muted">
This is the updated content of the modal.
</Box>
),
})
}, 2000)
}}
>
Open Modal
</Button>
<dialog.Viewport />
</>
)
}
返回值
等待 .open()
方法的结果将返回传递给 .close()
方法的值。
信息
额外提示: 你还可以使用 .waitForExit()
方法来等待退出动画完成,然后再打开一个新的叠加层。"use client"
import { Button, Dialog, Portal } from "@chakra-ui/react"
import { createOverlay } from "@chakra-ui/react"
interface DialogProps {
title: string
description: string
content?: React.ReactNode
}
const dialog = createOverlay<DialogProps>((props) => {
const { title, description, content, ...rest } = props
return (
<Dialog.Root {...rest}>
<Portal>
<Dialog.Backdrop />
<Dialog.Positioner>
<Dialog.Content>
{title && (
<Dialog.Header>
<Dialog.Title>{title}</Dialog.Title>
</Dialog.Header>
)}
<Dialog.Body spaceY="4">
{description && (
<Dialog.Description>{description}</Dialog.Description>
)}
{content}
</Dialog.Body>
</Dialog.Content>
</Dialog.Positioner>
</Portal>
</Dialog.Root>
)
})
const Demo = () => {
return (
<>
<Button
onClick={async () => {
const returnValue = await dialog.open("a", {
title: "Dialog Title",
description: "Dialog Description",
content: (
<Button
onClick={() => {
const returnValue = { message: "Welcome" }
dialog.close("a", returnValue)
}}
>
Close
</Button>
),
})
await dialog.waitForExit("a")
dialog.open("b", {
title: returnValue.message,
description: "Next Dialog Description",
})
}}
>
Open Modal
</Button>
<dialog.Viewport />
</>
)
}
API
属性
通过 createOverlay
函数注入到叠加组件中的属性
open
: 叠加层当前是否打开onOpenChange
: 当叠加层的打开状态改变时触发的回调onExitComplete
: 当叠加层的退出动画完成时触发的回调
方法
视口
渲染所有活动叠加层的根组件。
open(id, props)
使用给定的 ID 和属性打开一个新的叠加层。返回一个解析为任何值的 Promise。
close(id, value)
使用给定的 ID 关闭叠加层,并返回一个在关闭时解析的 Promise。
update(id, props)
使用给定的 ID 更新叠加层的属性。
remove(id)
使用给定的 ID 移除叠加层。
removeAll()
移除所有叠加层。
get(id)
获取使用给定 ID 的叠加层的属性。
getSnapshot()
获取叠加层的当前快照。
waitForExit(id)
等待使用给定 ID 的叠加层的退出动画完成。