多元素过渡的注意点—必看

多元素过渡并不是transition中多个元素同时拥有一个过渡效果,transition的过渡效果只能用于单个元素
多元素过渡是多元素切换时的过渡效果
注意:多元素过渡会触发vue的就地更新策略,这样过渡的话只会跟新元素的内容,元素是不会变的故需要key

过渡模式

为啦不让多个元素切换时的过渡效果不显得生硬。vue提供啦过渡模式

  • in-out:新元素先进行过渡,完成之后当前元素过渡离开。
  • out-in:当前元素先进行过渡,完成之后新元素过渡进入。

效果图
没有过渡模式的效果图
多元素过度-无过渡模式.gif
有过渡模式的效果图 此时使用的过渡模式为in-out![多元素过度-过渡模式.gif](https://cdn.nlark.com/yuque/0/2021/gif/1376603/1616206427539-44a16092-f78a-4a8e-a430-a5159a425119.gif#align=left&display=inline&height=332&margin=%5Bobject%20Object%5D&name=%E5%A4%9A%E5%85%83%E7%B4%A0%E8%BF%87%E5%BA%A6-%E8%BF%87%E6%B8%A1%E6%A8%A1%E5%BC%8F.gif&originHeight=332&originWidth=998&size=304481&status=done&style=stroke&width=998)
源码

  1. <template>
  2. <div class="warp">
  3. <button @click="show = !show">click</button>
  4. <!-- 过渡模式 -->
  5. <!-- in-out -->
  6. <!-- out-in -->
  7. <transition mode=" in-out ">
  8. <!-- 防止就地更新,需要使用key -->
  9. <div class="box" v-if="show" key="box1">box1</div>
  10. <div class="box box2" v-else key="box2">box2</div>
  11. </transition>
  12. </div>
  13. </template>
  14. <script>
  15. export default {
  16. data(){
  17. return{
  18. show:true,
  19. }
  20. }
  21. }
  22. </script>
  23. <style scoped>
  24. .box{
  25. width: 100px;
  26. height: 100px;
  27. display: flex;
  28. justify-content: center;
  29. align-items: center;
  30. background: rgba(0, 0, 0, .5);
  31. margin: 10px auto 0;
  32. }
  33. .box2{
  34. background: rgba(255, 0, 0, .5);
  35. }
  36. .v-enter,
  37. .v-leave-to{
  38. transform: translate(-31px);
  39. opacity: 0;
  40. }
  41. .v-enter-active,
  42. .v-leave-active{
  43. transition: all 2s;
  44. }
  45. .v-enter-to,
  46. .v-leave{
  47. opacity: 1;
  48. transform: translate(0);
  49. }
  50. </style>

单元素通过改变key值实现多元素过渡

效果图
多元素过度-通过单元素实现.gif

  1. <template>
  2. <div class="warp">
  3. <button @click="handleClick">click</button>
  4. <!-- 过渡模式 -->
  5. <transition mode="out-in">
  6. <!-- 防止就地更新,需要使用key -->
  7. <!-- <div class="box" v-if="show" key="box1">box1</div>
  8. <div class="box box2" v-else key="box2">box2</div> -->
  9. <!-- 使用一个元素通过key的切换实现元素的切换 -->
  10. <div class="box" :class="{box2:keyName==='box2'}" :key="keyName">{{ keyName }}</div>
  11. </transition>
  12. </div>
  13. </template>
  14. <script>
  15. export default {
  16. data(){
  17. return{
  18. show:true,
  19. keyName:"box1"
  20. }
  21. },
  22. methods:{
  23. handleClick(){
  24. const isWord = this.keyName === 'box1'
  25. this.keyName = isWord ? 'box2' : 'box1'
  26. }
  27. }
  28. }
  29. </script>
  30. <style scoped>
  31. .box{
  32. width: 100px;
  33. height: 100px;
  34. display: flex;
  35. justify-content: center;
  36. align-items: center;
  37. background: rgba(0, 0, 0, .5);
  38. margin: 10px auto 0;
  39. }
  40. .box2{
  41. background: rgba(255, 0, 0, .5);
  42. }
  43. .v-enter,
  44. .v-leave-to{
  45. transform: translate(31px);
  46. opacity: 0;
  47. }
  48. .v-enter-active,
  49. .v-leave-active{
  50. transition: all .3s;
  51. }
  52. .v-enter-to,
  53. .v-leave{
  54. opacity: 1;
  55. transform: translate(0);
  56. }
  57. .v-leave-to{
  58. transform: translate(-31px);
  59. }
  60. </style>

单组件的模式实现多元素过渡

效果图
多元素过度-通过单元素实现.gif

  1. <template>
  2. <div class="warp">
  3. <button @click="handleClick">click</button>
  4. <!-- 过渡模式 -->
  5. <transition mode="out-in">
  6. <!-- 防止就地更新,需要使用key -->
  7. <!-- 使用一个动态组件通过key的切换实现组件啊的切换 -->
  8. <component :is="baseDemo" :class="{box2:baseDemo==='base-demo2'}" :key="baseDemo"></component>
  9. </transition>
  10. </div>
  11. </template>
  12. <script>
  13. import baseDemo1 from './baseDemo-5-1'
  14. import baseDemo2 from './baseDemo-5-2'
  15. export default {
  16. data(){
  17. return{
  18. show:true,
  19. keyName:"box1",
  20. baseDemo:'base-demo1'
  21. }
  22. },
  23. components:{
  24. baseDemo1,
  25. baseDemo2
  26. },
  27. methods:{
  28. handleClick(){
  29. const isWord = this.baseDemo === 'base-demo1'
  30. this.baseDemo = isWord ? 'base-demo2' : 'base-demo1'
  31. }
  32. }
  33. }
  34. </script>
  35. <style scoped>
  36. .box{
  37. width: 100px;
  38. height: 100px;
  39. display: flex;
  40. justify-content: center;
  41. align-items: center;
  42. background: rgba(0, 0, 0, .5);
  43. margin: 10px auto 0;
  44. }
  45. .box2{
  46. background: rgba(255, 0, 0, .5);
  47. }
  48. .v-enter,
  49. .v-leave-to{
  50. transform: translate(31px);
  51. opacity: 0;
  52. }
  53. .v-enter-active,
  54. .v-leave-active{
  55. transition: all .3s;
  56. }
  57. .v-enter-to,
  58. .v-leave{
  59. opacity: 1;
  60. transform: translate(0);
  61. }
  62. .v-leave-to{
  63. transform: translate(-31px);
  64. }
  65. </style>