天天看點

Vue學習筆記--狀态間過渡

當從 DOM 中插入、更新或移除項目時,Vue 提供多種應用過渡效果的方式。包括以下工具:

  • 在 CSS 過渡和動畫中自動處理 class
  • 可以配合使用第三方 CSS 動畫庫,如 Animate.css
  • 在過渡鈎子函數中使用 JavaScript 直接操作 DOM
  • 可以配合使用第三方 JavaScript 動畫庫,如 Velocity.js

vue提供了一個transition外層包裹容器元件,可以給條件渲染(v-for)、條件展示(v-show)、動态元件群組件根節點添加進入(enter)和離開(leave)過渡。

單元素/元件過渡

     1.通過css樣式實作過渡動畫,在css樣式中可以通過transform和animation屬性來定義動畫效果。

<template>
  <div>
    <button @click="show=!show">點選</button>
    <transition name="fade">
      <p v-if="show">Hello</p>
    </transition>
  </div>
</template>
           

     在css樣式中通過class類名與transition的name值關聯,設定過渡效果

.fade-enter-active, .fade-leave-active {
    transition: opacity .5s;
  }
  .fade-enter, .fade-leave-to {
    opacity: 0;
  }
           

注:有6種class名來處理過渡的過程

   1、v-enter:進入式過渡的開始狀态,作用于開始的一幀

   2、v-enter-active:進入式過渡的激活狀态,作用于整個過程

   3、v-enter-to:進入式過渡的結束狀态,作用于結束的一幀(僅适應于2.1.8+)

   4、v-leave:離開式過渡的開始狀态,作用于開始的一幀

   5、v-leave-active:離開式過渡的激活狀态,作用于整個過程

   6、v-leave-to:離開式過渡的結束狀态,作用于結束的一幀(僅适應于2.1.8+)

2、自定義過渡的class類名:使用第三方css動畫庫

<link href="https://cdn.jsdelivr.net/npm/[email protected]" target="_blank" rel="external nofollow"  rel="stylesheet" type="text/css">

<div id="example-3">
  <button @click="show = !show">
    Toggle render
  </button>
  <transition
    name="custom-classes-transition"
    enter-active-class="animated tada"
    leave-active-class="animated bounceOutRight"//tada和boundceOutRight是css動畫庫裡的類名
  >
    <p v-if="show">hello</p>
  </transition>
</div>
           

3、顯示過渡的持續時間

<transition :duration="1000">...</transition>
//還可以為進入式和離開式持續時間指定不同的值
<transition :duration="{ enter: 500, leave: 800 }">...</transition>
           

4、javaScript鈎子函數:使用第三方javaScript動畫庫:Velocity.js

在僅使用javaScript的過渡顯式添加v-bind:css="false",以便Vue可以跳過css偵測。

<script src="https://lib.baomitu.com/velocity/1.2.3/velocity.min.js"></script>
<div id="example-4">
  <button @click="show = !show">
    Toggle
  </button>
  <transition
    v-on:before-enter="beforeEnter"
    v-on:enter="enter"
    v-on:leave="leave"
    v-bind:css="false"
  >
    <p v-if="show">
      Demo
    </p>
  </transition>
</div>
           

在使用enter和leave鈎子函數中,必須有done回調函數,否則,這兩個鈎子函數會被同步調用,過渡會立即完成;

new Vue({
  el: '#example-4',
  data: {
    show: false
  },
  methods: {
    beforeEnter: function (el) {
      el.style.opacity = 0
    },
    enter: function (el, done) {
      Velocity(el, { opacity: 1, fontSize: '1.4em' }, { duration: 300 })
      Velocity(el, { fontSize: '1em' }, { complete: done })
    },
    leave: function (el, done) {
      Velocity(el, { translateX: '15px', rotateZ: '50deg' }, { duration: 600 })
      Velocity(el, { rotateZ: '100deg' }, { loop: 2 })
      Velocity(el, {
        rotateZ: '45deg',
        translateY: '30px',
        translateX: '30px',
        opacity: 0
      }, { complete: done })
    }
  }
})
           

狀态間過渡具體使用場景

  1、在初始渲染時過渡:在transition标簽内添加appear屬性

          預設情況下會使用特定過渡,如果想要添加自定義的樣式可以通過appear-class來綁定類名初始渲染進入時刻效果,appear-active-class綁定整個過程的效果,appear-to-class綁定結束狀态效果。也可以自定義指定javaScript鈎子事件,v-on:before-appear,v-on:appear、v-on:after-apprar和v-on:appear-cancelled。

2、多元素之間的切換效果

      通過v-if和v-else來對初始狀态進行切換,當在具有相同标簽名之間切換時,需要給标簽添加一個唯一的key屬性,便于區分。

不同元素間的切換:

<transition>
  <table v-if="items.length > 0">
    <!-- ... -->
  </table>
  <p v-else>Sorry, no items found.</p>
</transition>
           

相同标簽名之間的切換需要添加key屬性:

<transition>
  <button v-if="isEditing" key="save">
    Save
  </button>
  <button v-else key="edit">
    Edit
  </button>
</transition>
           

注:兩個按鈕會同步渲染 - 當一個過渡進入時,另一個過渡離開。這是 

<transition>

 的預設行為 - 進入和離開同時發生。不過如果是絕對定位或者将元素位移時就像是滑動效果。若同時生效不能滿足需求,transition還提供了過渡模式mode屬性,屬性值為out-in或者in-out。

3、多元件之間的過渡

不需要使用key屬性,使用動态元件component,通過v-show綁定值,控制顯示内容。

<transition name="component-fade" mode="out-in">
  <component v-bind:is="view"></component>
</transition>
           
new Vue({
  el: '#transition-components-demo',
  data: {
    view: 'v-a'
  },
  components: {
    'v-a': {
      template: '<div>Component A</div>'
    },
    'v-b': {
      template: '<div>Component B</div>'
    }
  }
})
           
.component-fade-enter-active, .component-fade-leave-active {
  transition: opacity .3s ease;
}
.component-fade-enter, .component-fade-leave-to
/* .component-fade-leave-active 在低于 2.1.8 版本中 */ {
  opacity: 0;
}
           

繼續閱讀