Vue <TransitionGroup> 组件
实例
使用内置的 <TransitionGroup> 组件创建一个 <ol> 标签,其中包含动画 <li> 标签。
<TransitionGroup tag="ol"><li v-for="x in products" :key="x">{{ x }}</li></TransitionGroup>
定义与用法
内置的 <TransitionGroup> 组件用于使用 v-for 创建的元素,以便在添加或删除这些元素时为其提供单独的动画。
在 <TransitionGroup> 组件内使用 v-for 创建的标签必须使用 key 属性进行唯一定义。
只有当我们使用标签 prop 将 <TransitionGroup> 组件定义为特定标签时,它才会被呈现为 HTML 标签。
当在 <TransitionGroup> 组件内使用 v-for 基于数组创建标签时,当元素添加到数组或从数组中删除时,这些标签将自动设置动画。
Props
内置 <TransitionGroup> 组件可以与内置 <Transition> 组件使用相同的 prop:
| Prop | 描述 | 试一试 |
|---|---|---|
| none | 默认。 | 试一试 |
| tag | <TransitionGroup> 呈现为指定的标签。如果未设置标签 prop,则 <TransitionGroup> 将不会呈现为标签。 | 试一试 |
| moveClass | 为 move 类创建一个自定义的名称。默认名称是 v-move | 试一试 |
更多实例
实例 1
骰子可以添加或移除,添加的骰子使用 <TransitionGroup> 设置动画:
<template><h3>The <TransitionGroup> Component</h3><p>New products are given animations using the <TransitionGroup> component.</p><button @click="addDie">Roll</button><button @click="removeDie">Remove random</button><br><TransitionGroup><div v-for="x in dice" :key="x" class="diceDiv" :style="{ backgroundColor: 'hsl('+x*40+',85%,85%)' }">{{ x }}</div></TransitionGroup></template><script>export default {data() {return {dice: [],inpName: ''}},methods: {addDie() {const newDie = Math.ceil(Math.random()*6);this.dice.push(newDie);},removeDie() {if(this.dice.length>0){this.dice.splice(Math.floor(Math.random()*this.dice.length), 1);}}},mounted() {this.addDie();this.addDie();this.addDie();}}</script><style>.v-enter-from {opacity: 0;translate: 200px 0;rotate: 360deg;}.v-enter-to {opacity: 1;translate: 0 0;rotate: 0deg;}.v-enter-active,.v-leave-active {transition: all 0.7s;}.v-leave-from { opacity: 1; }.v-leave-to { opacity: 0; }.diceDiv {margin: 10px;width: 30px;height: 30px;line-height: 30px;vertical-align: middle;text-align: center;border: solid black 1px;border-radius: 5px;display: inline-block;}</style>
实例 2
骰子可以添加或移除,添加和移除的骰子都使用 <TransitionGroup> 设置动画:
<template><h3>The <TransitionGroup> Component</h3><p>When an item is removed inside the <TransitionGroup> component, other items are animated as they fall into their new positions.</p><button @click="addDie">Roll</button><button @click="removeDie">Remove random</button><br><TransitionGroup><div v-for="x in dice" :key="x" class="diceDiv" :style="{ backgroundColor: 'hsl('+x*40+',85%,85%)' }">{{ x }}</div></TransitionGroup></template><script>export default {data() {return {dice: [],inpName: ''}},methods: {addDie() {const newDie = Math.ceil(Math.random()*6);this.dice.push(newDie);},removeDie() {if(this.dice.length>0){this.dice.splice(Math.floor(Math.random()*this.dice.length), 1);}}},mounted() {this.addDie();this.addDie();this.addDie();}}</script><style>.v-enter-from {opacity: 0;translate: 200px 0;rotate: 360deg;}.v-enter-to {opacity: 1;translate: 0 0;rotate: 0deg;}.v-enter-active,.v-leave-active,.v-move {transition: all 0.7s;}.v-leave-active { position: absolute; }.v-leave-from { opacity: 1; }.v-leave-to { opacity: 0; }.diceDiv {margin: 10px;width: 30px;height: 30px;line-height: 30px;vertical-align: middle;text-align: center;border: solid black 1px;border-radius: 5px;display: inline-block;}</style>
实例 3
骰子可以添加、移除、洗牌或排序,所有动画都使用 <TransitionGroup>:
<template><h3>The <TransitionGroup> Component</h3><p>Items inside the <TransitionGroup> component are animated when they are created or removed.</p><button @click="addDie">Roll</button><button @click="addDie10">Roll 10 dice</button><button @click="dice.sort(compareFunc)">Sort</button><button @click="dice.sort(shuffleFunc)">Shuffle</button><br><TransitionGroup><divv-for="x in dice":key="x.keyNmbr"class="diceDiv":style="{ backgroundColor: 'hsl('+x.dieNmbr*60+',85%,85%)' }"@click="removeDie(x.keyNmbr)">{{ x.dieNmbr }}</div></TransitionGroup></template><script>export default {data() {return {dice: [],keyNumber: 0}},methods: {addDie() {const newDie = {dieNmbr: Math.ceil(Math.random()*6),keyNmbr: this.keyNumber};this.dice.splice(Math.floor(Math.random()*this.dice.length),0,newDie);this.keyNumber++;},addDie10() {for(let i=0; i<10; i++) {this.addDie();}},compareFunc(a,b){return a.dieNmbr - b.dieNmbr;},shuffleFunc(a,b){return Math.random()-0.5;},removeDie(key) {const pos = this.dice.map(e => e.keyNmbr).indexOf(key);this.dice.splice(pos, 1);}},mounted() {this.addDie10();}}</script><style>.v-enter-from {opacity: 0;scale: 0;rotate: 360deg;}.v-enter-to {opacity: 1;scale: 1;rotate: 0deg;}.v-enter-active,.v-leave-active,.v-move {transition: all 0.7s;}.v-leave-active { position: absolute; }.v-leave-from { opacity: 1; }.v-leave-to { opacity: 0; }.diceDiv {margin: 10px;width: 30px;height: 30px;line-height: 30px;vertical-align: middle;text-align: center;border: solid black 1px;border-radius: 5px;display: inline-block;}.diceDiv:hover {cursor: pointer;box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);}#app {position: relative;}</style>
实例 4
使用 moveClass 重命名 move 类:
<template><h3>The <TransitionGroup> Component</h3><p>When an item is removed inside the <TransitionGroup> component, other items are animated as they fall into their new positions.</p><button @click="addDie">Roll</button><button @click="removeDie">Remove random</button><br><TransitionGroup moveClass="good-slide"><divv-for="x in dice":key="x"class="diceDiv":style="{ backgroundColor: 'hsl('+x*40+',85%,85%)' }">{{ x }}</div></TransitionGroup></template><script>export default {data() {return {dice: [],inpName: ''}},methods: {addDie() {const newDie = Math.ceil(Math.random()*6);this.dice.push(newDie);},removeDie() {if(this.dice.length>0){this.dice.splice(Math.floor(Math.random()*this.dice.length), 1);}}},mounted() {this.addDie();this.addDie();this.addDie();}}</script><style>.v-enter-from {opacity: 0;translate: 200px 0;rotate: 360deg;}.v-enter-to {opacity: 1;translate: 0 0;rotate: 0deg;}.v-enter-active,.v-leave-active,.good-slide {transition: all 0.7s;}.v-leave-active { position: absolute; }.v-leave-from { opacity: 1; }.v-leave-to { opacity: 0; }.diceDiv {margin: 10px;width: 30px;height: 30px;line-height: 30px;vertical-align: middle;text-align: center;border: solid black 1px;border-radius: 5px;display: inline-block;}</style>