vue3 TransitionGroup内置组件的使用

本文介绍了Vue中的<TransitionGroup>组件如何与v-for配合实现列表元素的插入、移除和顺序变化动画,以及如何结合渐进延迟动画技术(如GSAP)实现更精细的动画效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<TransitionGroup> 是一个内置组件,用于对 v-for 列表中的元素或组件的插入、移除和顺序改变添加动画效果。

和 <Transition> 的区别

<TransitionGroup> 支持和 <Transition> 基本相同的 props、CSS 过渡 class 和 JavaScript 钩子监听器,但有以下几点区别:

  • 默认情况下,它不会渲染一个容器元素。但你可以通过传入 tag prop 来指定一个元素作为容器元素来渲染。

  • 过渡模式在这里不可用,因为我们不再是在互斥的元素之间进行切换。

  • 列表中的每个元素都必须有一个独一无二的 key attribute。

  • CSS 过渡 class 会被应用在列表内的元素上,而不是容器元素上。

<!--
通过内建的 <TransitionGroup> 实现“FLIP”列表过渡效果。
https://aerotwist.com/blog/flip-your-animations/
-->

<script setup>
import { shuffle as _shuffle } from 'lodash-es'
import { ref } from 'vue'

const getInitialItems = () => [1, 2, 3, 4, 5]
const items = ref(getInitialItems())
let id = items.value.length + 1

function insert() {
  const i = Math.round(Math.random() * items.value.length)
  items.value.splice(i, 0, id++)
}

function reset() {
  items.value = getInitialItems()
  id = items.value.length + 1
}

function shuffle() {
  items.value = _shuffle(items.value)
}

function remove(item) {
  const i = items.value.indexOf(item)
  if (i > -1) {
    items.value.splice(i, 1)
  }
}
</script>

<template>
  <button @click="insert">insert at random index</button>
  <button @click="reset">reset</button>
  <button @click="shuffle">shuffle</button>

  <TransitionGroup tag="ul" name="fade" class="container">
    <div v-for="item in items" class="item" :key="item">
      {{ item }}
      <button @click="remove(item)">x</button>
    </div>
  </TransitionGroup>
</template>

<style>
.container {
  position: relative;
  padding: 0;
}

.item {
  width: 100%;
  height: 30px;
  background-color: #f3f3f3;
  border: 1px solid #666;
  box-sizing: border-box;
}

/* 1. 声明过渡效果 */
.fade-move,
.fade-enter-active,
.fade-leave-active {
  transition: all 0.5s cubic-bezier(0.55, 0, 0.1, 1);
}

/* 2. 声明进入和离开的状态 */
.fade-enter-from,
.fade-leave-to {
  opacity: 0;
  transform: scaleY(0.01) translate(30px, 0);
}

/* 3. 确保离开的项目被移除出了布局流
      以便正确地计算移动时的动画效果。 */
.fade-leave-active {
  position: absolute;
}
</style>

渐进延迟列表动画

通过在 JavaScript 钩子中读取元素的 data attribute,我们可以实现带渐进延迟的列表动画。首先,我们把每一个元素的索引渲染为该元素上的一个 data attribute:

接着,在 JavaScript 钩子中,我们基于当前元素的 data attribute 对该元素的进场动画添加一个延迟。

<script setup>
import { ref, computed } from 'vue'
import gsap from 'gsap'

const list = [
  { msg: 'Bruce Lee' },
  { msg: 'Jackie Chan' },
  { msg: 'Chuck Norris' },
  { msg: 'Jet Li' },
  { msg: 'Kung Fury' }
]

const query = ref('')

const computedList = computed(() => {
  return list.filter((item) => item.msg.toLowerCase().includes(query.value))
})

function onBeforeEnter(el) {
  el.style.opacity = 0
  el.style.height = 0
}

function onEnter(el, done) {
  gsap.to(el, {
    opacity: 1,
    height: '1.6em',
    delay: el.dataset.index * 0.15,
    onComplete: done
  })
}

function onLeave(el, done) {
  gsap.to(el, {
    opacity: 0,
    height: 0,
    delay: el.dataset.index * 0.15,
    onComplete: done
  })
}
</script>

<template>
  <input v-model="query" />
  <TransitionGroup
    tag="ul"
    :css="false"
    @before-enter="onBeforeEnter"
    @enter="onEnter"
    @leave="onLeave"
  >
    <li
      v-for="(item, index) in computedList"
      :key="item.msg"
      :data-index="index"
    >
      {{ item.msg }}
    </li>
  </TransitionGroup>
</template>

<think>好的,用户想了解Vue3中transition组件使用教程和示例。我需要先回忆一下相关的知识,并参考提供的引用内容。 首先,transition组件Vue内置组件,用于在元素插入、更新或移除时应用过渡效果。根据引用[1],基本用法是通过包裹需要过渡的元素,并配合CSS类名来实现动画。比如v-enter-active和v-leave-active这些类。 接下来,用户可能需要知道如何设置不同的过渡效果,比如进入和离开的动画。引用[3]提到动画模式,比如mode="out-in",控制进入和离开的顺序。这应该是一个重点,需要举例说明。 然后,transition组件支持的条件渲染指令,比如v-if、v-show,还有transition-group用于列表。引用[4]提到使用key来强制元素更新,触发过渡效果。这部分可能需要一个数字滚动的例子,比如通过改变key让数字变化时有过渡。 另外,引用[2]提到Element Plus的过渡封装策略,可能涉及到name属性和性能优化。不过用户可能更关注基本使用,所以这部分可以简要提及。 用户可能还需要知道如何结合CSS动画和过渡,比如使用@keyframes定义动画,或者直接使用CSS过渡属性。示例中的CSS部分需要详细说明每个类的作用,比如v-enter-from和v-enter-to的区别。 还要注意,transition组件Vue3中的使用是否与Vue2有差异。根据引用[3],Vue3的transition组件支持mode属性,用法类似,但需要确认是否有新特性。比如在示例中使用的是Vue3的写法,函数式组件可能有所不同。 另外,引用[4]提到的transition-group应用,比如列表的排序、添加和删除,可能需要一个列表的示例,比如待办事项列表的过渡效果。 可能需要分步骤讲解,从基本用法到进阶功能,如动画模式、自定义类名、与第三方动画库集成等。每个步骤都配上代码示例和解释,确保用户能够跟着操作。 最后,生成相关问题,比如性能优化、与第三方库结合、过渡模式的区别等,帮助用户进一步学习。</think>### Vue3 Transition组件使用教程与示例 #### 一、基础用法 Transition组件通过包裹需要过渡的元素,配合CSS实现动画效果。支持`v-if`/`v-show`/动态组件切换: ```html <button @click="show = !show">切换</button> <Transition> <div v-if="show" class="box">Hello Vue3 Transition</div> </Transition> <style> /* 进入/离开过渡 */ .v-enter-active, .v-leave-active { transition: opacity 0.5s ease; } .v-enter-from, .v-leave-to { opacity: 0; } </style> ``` 此时元素会以淡入淡出效果显示隐藏[^1]。 #### 二、进阶功能 1. **自定义过渡类名** 通过`name`属性扩展CSS类名: ```html <Transition name="fade"> <!-- 内容 --> </Transition> <style> .fade-enter-active { /* 自定义动画时长 */ transition: all 0.8s cubic-bezier(0.68, -0.55, 0.27, 1.55); } </style> ``` 2. **动画模式控制** `mode="out-in"`确保当前元素完全离开后新元素再进入: ```html <Transition mode="out-in"> <component :is="currentComponent"></component> </Transition> ``` 这种模式适用于页面切换场景[^3]。 3. **数字滚动动画** 结合`key`强制触发过渡(引用[4]的实践): ```html <Transition name="slide-up"> <div :key="count">{{ count }}</div> </Transition> <script setup> const count = ref(0) </script> <style> .slide-up-enter-active { transition: all 0.3s; position: absolute; } .slide-up-enter-from { opacity: 0; transform: translateY(20px); } </style> ``` #### 三、transition-group应用 实现列表项的进入/离开动画: ```html <transition-group name="list" tag="ul"> <li v-for="item in items" :key="item.id"> {{ item.text }} </li> </transition-group> <style> .list-enter-active, .list-leave-active { transition: all 0.5s ease; } .list-enter-from, .list-leave-to { opacity: 0; transform: translateX(30px); } </style> ``` #### 四、性能优化建议 1. 优先使用`transform`和`opacity`属性(浏览器合成层优化) 2. 对于复杂动画添加`css: false`手动控制JavaScript动画 3. 避免同时操作大量元素的过渡(引用[2]的Element Plus优化实践)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值