在Vue的世界里,状态切换总是伴随着动画的展现,但有时候,这些动画与组件的显示/隐藏逻辑并不完全同步,导致视觉上的突兀或布局错乱。今天,我要给大家介绍一个神奇的Vue插件——useDelayedRender
,它就像一位优雅的指挥家,让动画与状态切换能够和谐共舞。
useDelayedRender
是一个Vue的Composition API Hook,它的主要作用是处理带有过渡状态的异步渲染逻辑。简单来说,它可以让你的组件在状态切换时,先显示一个中间状态,然后再进行真正的渲染,从而避免动画被突然打断。
indicator
(是否显示)的变化,并在nextTick
后决定是否更新intermediateIndicator
(中间过渡状态)。beforeShow
、afterShow
、beforeHide
和afterHide
四个生命周期钩子,让你可以在状态切换的不同阶段执行自定义逻辑。shouldSetIntermediate
函数,你可以灵活地控制是否需要设置中间状态,从而优化渲染性能。在模态框组件中,我们希望显示时先触发beforeShow
动画,然后再渲染组件;隐藏时先触发beforeHide
动画,再从DOM中移除。使用useDelayedRender
,我们可以轻松实现这一效果:
<template>
<button @click="toggleModal">切换模态框</button>
<div v-if="showIntermediate" class="modal" :class="{ show: showModal }">
<p>模态框内容</p>
</div>
</template>
<script setup lang="ts">
import { ref } from "vue";
import { useDelayedRender } from "./useDelayedRender";
const showModal = ref(false);
const showIntermediate = ref(false);
const toggleModal = () => (showModal.value = !showModal.value);
useDelayedRender({
indicator: showModal,
intermediateIndicator: showIntermediate,
beforeShow: () => console.log("即将显示"),
afterShow: () => console.log("已经显示"),
beforeHide: () => console.log("即将隐藏"),
afterHide: () => console.log("已经隐藏"),
});
</script>
<style>
.modal {
opacity: 0;
transform: translateY(-20px);
transition: opacity 0.3s ease, transform 0.3s ease;
}
.modal.show {
opacity: 1;
transform: translateY(0);
}
</style>
折叠面板组件(如手风琴菜单)也需要延迟渲染,否则展开动画可能无法生效。使用useDelayedRender
,我们可以让折叠面板的展开和收起动画更加流畅:
<template>
<button @click="toggle">切换折叠</button>
<div v-if="showIntermediate" class="content" :class="{ expand: isExpanded }">
<p>展开的内容</p>
</div>
</template>
<script setup lang="ts">
import { ref } from "vue";
import { useDelayedRender } from "./useDelayedRender";
const isExpanded = ref(false);
const showIntermediate = ref(false);
const toggle = () => (isExpanded.value = !isExpanded.value);
useDelayedRender({
indicator: isExpanded,
intermediateIndicator: showIntermediate,
shouldSetIntermediate: (step) => step === "show", // 只在展开时渲染
});
</script>
<style>
.content {
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease;
}
.content.expand {
max-height: 100px;
}
</style>
useDelayedRender
的核心作用在于控制组件的显示/隐藏逻辑,避免v-if直接切换导致动画丢失。它支持生命周期钩子,可用于动画、异步请求等操作,优化渲染性能,避免不必要的DOM操作。如果你正在开发Vue项目,特别是涉及动态渲染和动画的场景,这个插件绝对值得一试!
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
Copyright 2005-2024 yuanmayuan.com 【源码园】 版权所有 备案信息
声明: 本站非腾讯QQ官方网站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告