<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);
}