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