美文网首页
Vue多元素过渡

Vue多元素过渡

作者: 手指乐 | 来源:发表于2019-10-13 10:49 被阅读0次
    • transition包含v-if v-else显示和隐藏元素的时候,两个元素同时发生过渡
    <style>
    .fade-enter,.fade-leave-to{opacity:0;}
    .fade-enter-active,.fade-leave-active{transition:opacity .5s;}
    </style>
    
    <div id="demo">
      <button @click="clear">清空数据</button>  
      <button @click="reset">重置</button>   
      <transition name="fade">
        <ul v-if="items.length > 0">
          <li v-for="item in items">{{item}}</li>
        </ul>
        <p v-else>Sorry, no items found.</p>
      </transition>
    </div>
    
    <script>
    new Vue({
      el: '#demo',
      data: {
        items: ['html','css','js']
      },
      methods:{
        clear(){
          this.items.splice(0);
        },
        reset(){
          history.go();
        }
      }
    })
    </script>
    

    清空列表的时候,列表逐渐消失,同时文字逐渐出现,文字先放在列表后面,列表0.5s后完全消失,文字瞬间上移到列表之前的位置

    • 如果transition里面包裹的是相同标签名的元素切换时,Vue 为了效率只会替换相同标签内部的内容
    <div id="demo">
      <button @click="show = !show">toggle</button>   
      <transition name="fade">
        <p v-if="show">我是小火柴</p>
        <p v-else>我不是小火柴</p>
      </transition>
    </div>
    
    
    <style>
    .fade-enter,.fade-leave-to{opacity:0;}
    .fade-enter-active,.fade-leave-active{transition:opacity .5s;}
    </style>
    

    这样切换不会有任何过渡,可以通过绑定一个key来区分相同的标签解决这个问题

    <div id="demo">
      <button @click="show = !show">toggle</button>   
      <transition name="fade">
        <p v-if="show" key="trueMatch">我是小火柴</p>
        <p v-else key="falseMatch">我不是小火柴</p>
      </transition>
    </div>
    
    • 可以给通过给同一个元素设置不同的key来代替 v-if 和 v-else
    <transition>
      <button v-if="isEditing" key="save">Save</button>
      <button v-else key="edit">Edit</button>
    </transition>
    
    <transition>
      <button v-bind:key="isEditing">
        {{ isEditing ? 'Save' : 'Edit' }}
      </button>
    </transition>
    

    过渡的时候,它们两个效果一样

    • 默认情况下,多元素过渡是多个元素同时过渡,可以通过设置过渡模式来达到分开过渡
    1. in-out: 新元素先进行过渡,完成之后当前元素过渡离开。
    2. out-in: 当前元素先进行过渡,完成之后新元素过渡进入。
    <div id="demo">   
      <transition name="fade"  mode="out-in">
        <button :key="isOn" @click="isOn = !isOn">{{ isOn ? 'On' : 'Off' }}</button>
      </transition>
    </div>
    
    • 可以设置绝对布局,使过渡的两个元素互相重叠,这样可以在同一个位置过渡,避免出现隐藏的元素过渡完成后,显示的元素瞬间移动到隐藏元素位置的情况(上面的例子有mode="out-in",前一个button消失后,后一个才出来,也不会出现隐藏的元素过渡完成后,显示的元素瞬间移动到隐藏元素位置的情况)
    <style>
    #demo{position:relative;}
    #demo button{position:absolute;left:40px;}
    .fade-enter,.fade-leave-to{opacity:0;}
    .fade-enter-active,.fade-leave-active{transition: 1s;}
    </style>
    
    <div id="demo">   
      <transition name="fade"  >
        <button :key="isOn" @click="isOn = !isOn">{{ isOn ? 'On' : 'Off' }}</button>
      </transition>
    </div>
    
    • 多个组件切换过渡,不需要使用key
    <div id="demo">   
      <transition name="fade"  >
        <button :key="isOn" @click="isOn = !isOn">{{ isOn ? 'On' : 'Off' }}</button>
      </transition>
    </div>
    
    <div id="example">
      <button @click="change">切换页面</button>
      <transition name="fade" mode="out-in">
        <component :is="currentView"></component>
      </transition>
    </div>
    
    <script>
    new Vue({
      el: '#example',
      data:{
        index:0,
        arr:[
          {template:`<div>ComponentA</div>`},
          {template:`<div>ComponentB</div>`},
          {template:`<div>ComponentC</div>`}
        ],
      },
      computed:{
        currentView(){
            return this.arr[this.index];
        }
      },
      methods:{
        change(){
          this.index = (++this.index)%3;
        }
      }
    })
    </script>
    

    相关文章

      网友评论

          本文标题:Vue多元素过渡

          本文链接:https://www.haomeiwen.com/subject/edfcmctx.html