动态过渡

在 Vue 中即使是过渡也是数据驱动的!动态过渡最基本的例子是通过 name 特性来绑定动态值。

  1. <transition v-bind:name="transitionName">
  2. <!-- ... -->
  3. </transition>

当你想用 Vue 的过渡系统来定义的 CSS 过渡/动画 在不同过渡间切换会非常有用。

所有过渡特性都可以动态绑定,但我们不仅仅只有特性可以利用,还可以通过事件钩子获取上下文中的所有数据,因为事件钩子都是方法。这意味着,根据组件的状态不同,你的 JavaScript 过渡会有不同的表现。

  1. <script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js"></script>
  2. <div id="dynamic-fade-demo" class="demo">
  3. Fade In: <input type="range" v-model="fadeInDuration" min="0" v-bind:max="maxFadeDuration">
  4. Fade Out: <input type="range" v-model="fadeOutDuration" min="0" v-bind:max="maxFadeDuration">
  5. <transition
  6. v-bind:css="false"
  7. v-on:before-enter="beforeEnter"
  8. v-on:enter="enter"
  9. v-on:leave="leave"
  10. >
  11. <p v-if="show">hello</p>
  12. </transition>
  13. <button
  14. v-if="stop"
  15. v-on:click="stop = false; show = false"
  16. >Start animating</button>
  17. <button
  18. v-else
  19. v-on:click="stop = true"
  20. >Stop it!</button>
  21. </div>
  1. new Vue({
  2. el: '#dynamic-fade-demo',
  3. data: {
  4. show: true,
  5. fadeInDuration: 1000,
  6. fadeOutDuration: 1000,
  7. maxFadeDuration: 1500,
  8. stop: true
  9. },
  10. mounted: function () {
  11. this.show = false
  12. },
  13. methods: {
  14. beforeEnter: function (el) {
  15. el.style.opacity = 0
  16. },
  17. enter: function (el, done) {
  18. var vm = this
  19. Velocity(el,
  20. { opacity: 1 },
  21. {
  22. duration: this.fadeInDuration,
  23. complete: function () {
  24. done()
  25. if (!vm.stop) vm.show = false
  26. }
  27. }
  28. )
  29. },
  30. leave: function (el, done) {
  31. var vm = this
  32. Velocity(el,
  33. { opacity: 0 },
  34. {
  35. duration: this.fadeOutDuration,
  36. complete: function () {
  37. done()
  38. vm.show = true
  39. }
  40. }
  41. )
  42. }
  43. }
  44. })

动态过渡 - 图1

最后,创建动态过渡的最终方案是组件通过接受 props 来动态修改之前的过渡。一句老话,唯一的限制是你的想象力。