Skip to content

TransitionGroup 过渡动画组

介绍

列表过渡动画容器,配合 Transition / TransitionCollapse 子项实现列表增删时的进入、离开动画,并支持按序错开延时。

基础用法

通过 data 传入完整数据源,使用 v-model 绑定当前渲染列表;子项设置 item-key 与数据唯一标识对应。高度折叠类动画(如 enter-right)推荐使用 vd-transition-collapse

html
<vd-transition-group
  v-model="values"
  :data="data"
  data-key="id"
  name="enter-right"
  :duration="{ enter: 400, leave: 600 }"
  :delay="{ enter: 100, leave: 100 }"
>
  <vd-transition-collapse
    v-for="item in values"
    :key="item.id"
    :item-key="item.id"
  >
    <view class="item">{{ item.name }}</view>
  </vd-transition-collapse>
</vd-transition-group>
ts
const data = ref([
  { id: 1, name: '项目 1' },
  { id: 2, name: '项目 2' },
]);

const values = ref<any[]>([]);

function addItem() {
  data.value.push({
    id: Date.now(),
    name: `项目 ${data.value.length + 1}`,
  });
}

function removeItem(id: number) {
  const index = data.value.findIndex(item => item.id === id);
  if (index !== -1) {
    data.value.splice(index, 1);
  }
}

TIP

v-for 请遍历 v-model 绑定的 values,不要直接遍历 data。增删请修改 data,组件会自动同步 values 并触发子项动画。

约定说明

组内优先使用 TransitionGroup 的统一配置;子项未传时回退到父级:

配置项写在哪里说明
nameTransitionGroup(推荐)子项未传 name 时使用父级;子项显式传入则以子项为准
durationTransitionGroup(推荐)子项未传 duration 时使用父级;子项显式传入则以子项为准
delayTransitionGroup(推荐)子项未传 delay 时按项顺序叠加父级延时;子项显式传入则以子项为准
item-key子项(必填)data-key 对应的唯一标识,用于匹配增删动画

因此子项通常只需设置 item-key,由 Group 统一控制动画:

html
<vd-transition-group
  v-model="values"
  :data="data"
  name="fade"
  :duration="300"
  :delay="{ enter: 80, leave: 50 }"
>
  <vd-transition
    v-for="item in values"
    :key="item.id"
    :item-key="item.id"
  >
    <view class="item">{{ item.name }}</view>
  </vd-transition>
</vd-transition-group>

子项选用 Transition / TransitionCollapse

子项类型需与 Group 的 name 匹配,不要混用:

子项组件适用 Group name说明
Transitionfade / slide-* / zoom-* / flip-*普通透明度、位移、缩放动画
TransitionCollapsecollapse / collapse-fade / enter-left / enter-right高度折叠动画,内置测高层,更稳定
html
<!-- 普通动画:使用 Transition -->
<vd-transition-group v-model="values" :data="data" name="fade">
  <vd-transition
    v-for="item in values"
    :key="item.id"
    :item-key="item.id"
  >
    <view class="item">{{ item.name }}</view>
  </vd-transition>
</vd-transition-group>

<!-- 折叠动画:使用 TransitionCollapse -->
<vd-transition-group v-model="values" :data="data" name="enter-right">
  <vd-transition-collapse
    v-for="item in values"
    :key="item.id"
    :item-key="item.id"
  >
    <view class="item">{{ item.name }}</view>
  </vd-transition-collapse>
</vd-transition-group>

动画名称

在 TransitionGroup 上设置 name,支持内置动画名与进入/离开分别配置。折叠类名称请搭配 TransitionCollapse 子项。

html
<vd-transition-group v-model="values" :data="data" name="fade">
  <!-- Transition 子项 -->
</vd-transition-group>

<vd-transition-group
  v-model="values"
  :data="data"
  :name="{ enter: 'slide-up', leave: 'zoom-out' }"
>
  <!-- Transition 子项 -->
</vd-transition-group>

<vd-transition-group
  v-model="values"
  :data="data"
  :name="{ enter: 'enter-right', leave: 'collapse-fade' }"
>
  <!-- TransitionCollapse 子项 -->
</vd-transition-group>

动画时长与延时

在 TransitionGroup 上设置 durationdelay,支持统一数值或 { enter, leave }delay 会按列表项顺序叠加,形成依次进入/离开效果(该能力仅属于动画组)。

html
<vd-transition-group
  v-model="values"
  :data="data"
  :duration="300"
  :delay="{ enter: 80, leave: 50 }"
>
  <!-- ... -->
</vd-transition-group>

唯一标识 dataKey

通过 data-key 指定数据项唯一标识,默认读取 id 字段。支持键路径与函数:

html
<!-- 嵌套字段 -->
<vd-transition-group
  v-model="values"
  :data="data"
  :data-key="['user', 'id']"
>
  <!-- ... -->
</vd-transition-group>
ts
const data = ref([
  { user: { id: 'a1', name: '张三' } },
  { user: { id: 'b2', name: '李四' } },
]);
html
<!-- 自定义函数 -->
<vd-transition-group
  v-model="values"
  :data="data"
  :data-key="getItemKey"
>
  <!-- ... -->
</vd-transition-group>
ts
import type { TransitionGroupDataKey } from 'vital-design';

const getItemKey: TransitionGroupDataKey = (item) => item.user.id;

API

Props

参数说明类型默认值
v-model当前渲染的数据列表any[][]
data数据源any[][]
data-key数据项唯一标识键名,支持键路径与函数TransitionGroupDataKey'id'
name动画名称;子项未传时使用该值TransitionName'fade'
duration动画时长,单位 ms;子项未传时使用该值TransitionDuration300
delay动画延时,单位 ms;子项未传时按项顺序叠加TransitionDuration0

代替原始 Props

参数说明类型默认值
custom-id根节点 idstring-
custom-class根节点类名ClassValue-
custom-style根节点样式StyleValue-

Events

事件名说明回调参数
click点击时触发MouseEvent
update:model-value渲染列表更新时触发any[]

Slots

名称说明
default动画子项:vd-transitionvd-transition-collapse,需设置 item-key;未传 name / duration / delay 时回退父级 Group

类型定义

组件导出以下类型定义:

ts
import type {
  TransitionGroupDataKey,
  TransitionName,
  TransitionDuration,
} from 'vital-design';

赣ICP备2025061025号-1