用法
在 Popover 的默认插槽中使用 Button 或任何其他组件。
然后,使用 #content
插槽添加 Popover 打开时显示的内容。
<template>
<UPopover>
<UButton label="Open" color="neutral" variant="subtle" />
<template #content>
<Placeholder class="size-48 m-4 inline-flex" />
</template>
</UPopover>
</template>
模式
使用 mode
prop 更改 Popover 的模式。默认为 click
。
<template>
<UPopover mode="hover">
<UButton label="Open" color="neutral" variant="subtle" />
<template #content>
<Placeholder class="size-48 m-4 inline-flex" />
</template>
</UPopover>
</template>
延迟
使用 hover
模式时,可以使用 open-delay
和 close-delay
props 控制 Popover 打开或关闭前的延迟。
<template>
<UPopover mode="hover" :open-delay="500" :close-delay="300">
<UButton label="Open" color="neutral" variant="subtle" />
<template #content>
<Placeholder class="size-48 m-4 inline-flex" />
</template>
</UPopover>
</template>
内容
使用 content
prop 控制 Popover 内容的渲染方式,例如其 align
或 side
。
<template>
<UPopover
:content="{
align: 'center',
side: 'bottom',
sideOffset: 8
}"
>
<UButton label="Open" color="neutral" variant="subtle" />
<template #content>
<Placeholder class="size-48 m-4 inline-flex" />
</template>
</UPopover>
</template>
箭头
使用 arrow
prop 在 Popover 上显示箭头。
<template>
<UPopover arrow>
<UButton label="Open" color="neutral" variant="subtle" />
<template #content>
<Placeholder class="size-48 m-4 inline-flex" />
</template>
</UPopover>
</template>
示例
控制打开状态
可以使用 default-open
prop 或 v-model:open
指令控制打开状态。
<script setup lang="ts">
const open = ref(false)
defineShortcuts({
o: () => open.value = !open.value
})
</script>
<template>
<UPopover v-model:open="open">
<UButton label="Open" color="neutral" variant="subtle" />
<template #content>
<Placeholder class="size-48 m-4 inline-flex" />
</template>
</UPopover>
</template>
defineShortcuts
,您可以按 O 键来切换 Popover。阻止关闭
将 dismissible
prop 设置为 false
以阻止在点击 Popover 外部或按下 Escape 键时关闭它。当用户尝试关闭它时,将触发一个 close:prevent
事件。
<script setup lang="ts">
const open = ref(false)
</script>
<template>
<UPopover v-model:open="open" :dismissible="false" :ui="{ content: 'p-4' }">
<UButton label="Open" color="neutral" variant="subtle" />
<template #content>
<div class="flex items-center gap-4 mb-4">
<h2 class="text-highlighted font-semibold">
Popover non-dismissible
</h2>
<UButton color="neutral" variant="ghost" icon="i-lucide-x" @click="open = false" />
</div>
<Placeholder class="size-full min-h-48" />
</template>
</UPopover>
</template>
配合命令面板使用
可以在 Popover 的内容中放入 CommandPalette 组件。
<script setup lang="ts">
const items = ref([
{
label: 'bug',
value: 'bug',
chip: {
color: 'error' as const
}
},
{
label: 'feature',
value: 'feature',
chip: {
color: 'success' as const
}
},
{
label: 'enhancement',
value: 'enhancement',
chip: {
color: 'info' as const
}
}
])
const label = ref([])
</script>
<template>
<UPopover :content="{ side: 'right', align: 'start' }">
<UButton
icon="i-lucide-tag"
label="Select labels"
color="neutral"
variant="subtle"
/>
<template #content>
<UCommandPalette
v-model="label"
multiple
placeholder="Search labels..."
:groups="[{ id: 'labels', items }]"
:ui="{ input: '[&>input]:h-8 [&>input]:text-sm' }"
/>
</template>
</UPopover>
</template>
API
属性
属性 | 默认值 | 类型 |
---|---|---|
mode |
|
Popover 的显示模式。 |
content |
|
Popover 的内容。
|
arrow |
|
在弹出框旁边显示一个箭头。 |
portal |
|
在 portal 中渲染弹出框。 |
dismissible |
|
当 |
defaultOpen |
弹出框初次渲染时的打开状态。当你不需要控制其打开状态时使用。 | |
open |
弹出框的受控打开状态。 | |
modal |
|
弹出框的模态特性。设置为 true 时,与外部元素的交互将被禁用,屏幕阅读器将只能看到弹出框内容。 |
openDelay |
|
鼠标从进入触发器到悬浮卡打开的持续时间。 |
closeDelay |
|
鼠标从离开触发器或内容到悬浮卡关闭的持续时间。 |
ui |
|
插槽
插槽 | 类型 |
---|---|
default |
|
content |
|
事件
事件 | 类型 |
---|---|
close:prevent |
|
update:open |
|
主题
export default defineAppConfig({
ui: {
popover: {
slots: {
content: 'bg-default shadow-lg rounded-md ring ring-default data-[state=open]:animate-[scale-in_100ms_ease-out] data-[state=closed]:animate-[scale-out_100ms_ease-in] origin-(--reka-popover-content-transform-origin) focus:outline-none pointer-events-auto',
arrow: 'fill-default'
}
}
}
})
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
ui: {
popover: {
slots: {
content: 'bg-default shadow-lg rounded-md ring ring-default data-[state=open]:animate-[scale-in_100ms_ease-out] data-[state=closed]:animate-[scale-out_100ms_ease-in] origin-(--reka-popover-content-transform-origin) focus:outline-none pointer-events-auto',
arrow: 'fill-default'
}
}
}
})
]
})
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import uiPro from '@nuxt/ui-pro/vite'
export default defineConfig({
plugins: [
vue(),
uiPro({
ui: {
popover: {
slots: {
content: 'bg-default shadow-lg rounded-md ring ring-default data-[state=open]:animate-[scale-in_100ms_ease-out] data-[state=closed]:animate-[scale-out_100ms_ease-in] origin-(--reka-popover-content-transform-origin) focus:outline-none pointer-events-auto',
arrow: 'fill-default'
}
}
}
})
]
})