Presence
管理带有过渡支持的元素的挂载和卸载。
问题
此组件与 Vue Transition 有何不同?A: 最大的区别是它接受 CSS 动画,并控制元素的可见性。
Presence 组件提供了对元素挂载/卸载的增强控制。它确保动画和过渡完成后才从 DOM 中移除元素,使其非常适合动画 UI 组件。
API 参考
| Prop | 默认值 | 类型 | 说明 |
|---|---|---|---|
present* | boolean | 有条件地挂载或卸载子元素。类似于 v-if。 | |
forceMount | boolean | 强制元素始终渲染。对于通过编程方式渲染具有暴露 present 的孙子组件很有用。 |
事件负载
| 事件 | EmitPayload类型 | 说明 |
|---|---|---|
enter | CustomEvent | 进入动画开始时调用的事件处理程序。 |
after-enter | CustomEvent | 进入动画完成时调用的事件处理程序。 |
leave | CustomEvent | 离开动画开始时调用的事件处理程序。 |
after-leave | CustomEvent | 离开动画完成时调用的事件处理程序。 |
阅读我们的 动画指南 以了解更多关于使用 Presence 组件实现动画的信息。
示例
<template>
<Presence :present="isVisible">
<div
:data-open="isVisible ? 'open' : 'close'"
class="data-[state=open]:animate-fadeIn data-[state=closed]:animate-fadeOut"
>
<slot />
</div>
</Presence>
</template>
强制挂载
当您需要确保内容始终被渲染,无论是否存在状态时:
<template>
<Presence v-slot="{ present }" :present="isVisible" :force-mount="true">
<div>
This content will always be rendered
<div v-if="present">
This content is hidden
</div>
</div>
</Presence>
</template>
自定义例子
<script setup lang="ts">
import { ref } from 'vue'
import Presence from './Presence.vue' // 假设 Presence 组件放在同级目录
const isVisible = ref(false)
function toggle() {
isVisible.value = !isVisible.value
}
</script>
<template>
<button
@click="toggle"
class="mb-4 px-4 py-2 bg-blue-500 text-white rounded"
>
{{ isVisible ? '隐藏' : '显示' }} 面板
</button>
<Presence :present="isVisible">
<template #default="{ present }">
<div
:data-state="present ? 'open' : 'closed'"
class="data-[state=open]:animate-fadeIn data-[state=closed]:animate-fadeOut bg-gray-100 p-6 rounded shadow"
>
<p>我是一个带动画的面板</p>
</div>
</template>
</Presence>
</template>
<style scoped>
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes fadeOut {
from { opacity: 1; }
to { opacity: 0; }
}
.animate-fadeIn {
animation: fadeIn 300ms ease forwards;
}
.animate-fadeOut {
animation: fadeOut 300ms ease forwards;
}
</style>