<Transition> <div v-if="flag">true</div> <div v-else>false</div> </Transition>
<template> <button @click="flag = !flag">click to switch</button> <Transition> <div v-if="flag">true</div> <div v-else>false</div> </Transition> </template> <script setup> import { ref } from 'vue'; let flag = ref(false) </script> <style scoped> //没有指定from,则默认是元素渲染完毕的状态,opacity为1 //实现从1到0的过渡 //过渡效果由CSS的transition动画实现 .v-enter-from, .v-leave-to { opacity: 0; } .v-enter-active, .v-leave-active { transition: opacity 3s ease; } </style>
<Transition @before-enter="onBeforeEnter" @enter="onEnter" @after-enter="onAfterEnter" @enter-cancelled="onEnterCancelled" @before-leave="onBeforeLeave" @leave="onLeave" @after-leave="onAfterLeave" @leave-cancelled="onLeaveCancelled" > </Transition>
// 在元素被插入到 DOM 之前被调用 // 用这个来设置元素的 "enter-from" 状态 function onBeforeEnter(el) {} // 在元素被插入到 DOM 之后的下一帧被调用 // 用这个来开始进入动画 function onEnter(el, done) { // 调用回调函数 done 表示过渡结束 // 如果与 CSS 结合使用,则这个回调是可选参数 done() } // 当进入过渡完成时调用。 function onAfterEnter(el) {} // 当进入过渡在完成之前被取消时调用 function onEnterCancelled(el) {} // 在 leave 钩子之前调用 // 大多数时候,你应该只会用到 leave 钩子 function onBeforeLeave(el) {} // 在离开过渡开始时调用 // 用这个来开始离开动画 function onLeave(el, done) { // 调用回调函数 done 表示过渡结束 // 如果与 CSS 结合使用,则这个回调是可选参数 done() } // 在离开过渡完成、 // 且元素已从 DOM 中移除时调用 function onAfterLeave(el) {} // 仅在 v-show 过渡中可用 function onLeaveCancelled(el) {}
<button @click="toBaidu">enter</button> <Transition name="zoom" @after-leave="onAfterLeave"> <div class="item" v-if="isEnter">click to enter baidu</div> </Transition>
let isEnter = ref(true) const toBaidu = () => { isEnter.value = false } const onAfterLeave = () => { console.log('leave end'); window.location.href = 'https://www.baidu.com' }
<template> <div> <Transition name="my-fadein" appear> <slot></slot> </Transition> </div> </template> <style> /* scoped 对插槽内容无效;因为插槽仅仅是一个占位符 */ .my-fadein-enter-from, .my-fadein-leave-to { opacity: 0; } .my-fadein-enter-active, .my-fadein-leave-active { transition: opacity 0.4s; } </style>
<div> <button @click="renderDom">render</button> <Fadein> <p v-if="isShow">hi,there</p> </Fadein> </div>
拓展:使用列表渲染,尝试为每一项增加封装的过渡效果;如果需要依次延时渲染,如何实现???
<Transition name="scale" appear> <slot></slot> </Transition>
<Transition :name="transition-name" appear> <slot></slot> </Transition>