<TransitionGroup tag="ul" move-class="your-class"> <li v-for="(item, ind) in lists" :key="item.id"> // ... </li> </TransitionGroup>
. 同 <Transition>
. 如果未定义,则渲染为片段 fragment
. 建议使用,可以节省一个 DOM 节点,如声明为 tag = "ul"
. 用于自定义过渡期间被应用的 CSS,用于覆盖默认的 .v-move 类,从而实现自定义的移动过渡效果
. 在模板中使用 kebab-case,例如 move-class = "xxx"
<div class="fade-transition">
  <TransitionGroup tag="ul" name="fade-list">
    <slot></slot>
  </TransitionGroup>
</div>
    . 加载积分榜数据;数据清洗后,选择积分大于10的数据项
const lists = ref([])
onMounted(() => {
  fetch('https://glpla.github.io/utils/data/rank/20240203.json')
    .then(res => res.json())
    .then(data => {
      lists.value = data.cont.filter(item => item.ucredit > 10)
    })
})
      . 指定渲染标签 tag 为 ul
. 以内联变量 style 的形式,根据迭代变量 ind 分配不同的延时时间
. 可以在结构中处理延时时间,也可以在样式中处理延时时间;这里在结构中处理
多个元素使用延迟触发,用户体验更强烈;文档使用自定义属性 data- 实现;建议使用内联变量更方便
<TransitionGroup tag="ul">
  <li class="item" v-for="(item, ind) in lists" :key="item.id" :style="`--delay:${ind * 0.1}s`">
    <span>{{ item.usn }}</span>
    <span>{{ item.uname }}</span>
    <span>{{ item.ucredit }}</span>
  </li>
</TransitionGroup>
      . 从右上角移入;使用延时
. 其它样式略
. 为上级元素指定移除隐藏,可以消除元素位移导致触发滚动条
.v-enter-active,
.v-leave-active {
  transition: all 0.5s var(--delay) ease-in-out;
}
.v-enter-from,
.v-leave-to {
  opacity: 0;
  transform: translateY(-30px) translateX(30px);
}
      . 增加一个元素,分配添加数据项的方法(头插/尾插/任意位置插入),查看数据的过渡效果;方法自行实现
<div @click="addItem">add</div>
. 使用 v-move 改善过渡效果;完善样式如下
.v-move,
.v-enter-active,
.v-leave-active {
  transition: all 0.5s var(--delay) ease-in-out;
}
.v-enter-from,
.v-leave-to {
  opacity: 0;
  transform: translateY(-30px) translateX(30px);
}
      . 增加一个元素,分配删除数据项的方法(头部删除/尾部删除/任意位置删除),查看数据的过渡效果;方法自行实现
<div @click="delItem">deleete</div>
. 过渡时,脱离文档流;增加一个样式如下
.v-leave-active {
  position: absolute;
}
    
<div class = "msg">
    <h3>待办事项</h3>
    <div class="ipt-box">
        <input type="text" required v-model="todo" @keydown.enter="insertItem">
        <button @click="insertItem">增加</button>
    </div>
    <template v-if="arr.length">
        <div class="item">
            <p>序号</p>
            <p>待办事项</p>
            <p>操作</p>
        </div>
        <TransitionGroup name="list" tag="ul">
            <li class="item" v-for="(item, ind) in arr" :key="item.id" :style="`--delay: ${ind}`">
                <p>{{ ind }}</p>
                <p>{{ item }}</p>
                <button class="del-btn" @click="deleteItem(ind)">删除</button>
            </li>
        </TransitionGroup>
    </template>
    <template v-else>暂无记录</template>
</div>
      
.v-move,
.v-enter-active,
.v-leave-active {
    transition: 0.4s ease-in-out calc(var(--delay)*0.1s);
}
.v-leave-active {
    position: absolute;
}
.v-enter-from,
.v-leave-to {
    opacity: 0;
    transform: translateX(30px);
}