一、Vue中多个元素的过渡

关键点如下:

  1. 为每个元素添加 key 属性,避免Vue的复用导致不出现动画
  2. 为​​<transition>​​​ 添加 mode 属性:
    3. in-out:先出现元素,再隐藏元素
    4. out-in:先隐藏元素,再出现元素
<template>
<div id="root">
<!-- mode="in-out" 切换时,先出现元素,再隐藏元素 -->
<!-- <transition mode="in-out"> -->

<!-- mode="out-in" 切换时,先隐藏元素,再出现元素 -->
<transition mode="out-in">

<!-- 因为 Vue 会复用DOM,所以光加 <transition> 进行切换时并不会
出现动画,为了出现动画,可以给每个DOM元素赋一个 key -->
<div v-if="show" key="world">Hello World</div>
<div v-else key="vue">Hello Vue</div>
</transition>

<button @click="toggle">切换</button>
</div>
</template>
<script>
export default {
data() {
return {
show: true
}
},
methods: {
toggle() {
this.show = !this.show
}
}
}
</script>
<style>
.v-enter, .v-leave-to {
opacity: 0;
}
.v-enter-active, v-leave-active {
transition: opacity 1s;
}
</style>

二、Vue中多个组件的过渡

<template>
<div id="root">
<!-- mode="in-out" 切换时,先出现元素,再隐藏元素 -->
<!-- <transition mode="in-out"> -->

<!-- mode="in-out" 切换时,再隐藏元素,再出现元素 -->
<transition mode="out-in">

<!-- 动态组件 -->
<component :is="type"></component>
</transition>

<button @click="toggle">切换</button>
</div>
</template>
<script>
export default {
data() {
return {
type: 'child'
}
},
methods: {
toggle() {
this.type = this.type === 'child' ? 'child-one' : 'child'
}
}
}
Vue.component('child', {
template: '<div>child</div>'
})
Vue.component('child-one', {
template: '<div>child-one</div>'
})
</script>
<style>
.v-enter, .v-leave-to {
opacity: 0;
}
.v-enter-active, v-leave-active {
transition: opacity 1s;
}
</style>