把过渡放到组件里

管理太多的状态过渡会很快的增加 Vue 实例或者组件的复杂性,幸好很多的动画可以提取到专用的子组件。我们来将之前的示例改写一下:

  1. <script src="https://cdn.jsdelivr.net/npm/tween.js@16.3.4"></script>
  2. <div id="example-8">
  3. <input v-model.number="firstNumber" type="number" step="20"> +
  4. <input v-model.number="secondNumber" type="number" step="20"> =
  5. {{ result }}
  6. <p>
  7. <animated-integer v-bind:value="firstNumber"></animated-integer> +
  8. <animated-integer v-bind:value="secondNumber"></animated-integer> =
  9. <animated-integer v-bind:value="result"></animated-integer>
  10. </p>
  11. </div>
  1. // 这种复杂的补间动画逻辑可以被复用
  2. // 任何整数都可以执行动画
  3. // 组件化使我们的界面十分清晰
  4. // 可以支持更多更复杂的动态过渡
  5. // 策略。
  6. Vue.component('animated-integer', {
  7. template: '<span>{{ tweeningValue }}</span>',
  8. props: {
  9. value: {
  10. type: Number,
  11. required: true
  12. }
  13. },
  14. data: function () {
  15. return {
  16. tweeningValue: 0
  17. }
  18. },
  19. watch: {
  20. value: function (newValue, oldValue) {
  21. this.tween(oldValue, newValue)
  22. }
  23. },
  24. mounted: function () {
  25. this.tween(0, this.value)
  26. },
  27. methods: {
  28. tween: function (startValue, endValue) {
  29. var vm = this
  30. function animate () {
  31. if (TWEEN.update()) {
  32. requestAnimationFrame(animate)
  33. }
  34. }
  35. new TWEEN.Tween({ tweeningValue: startValue })
  36. .to({ tweeningValue: endValue }, 500)
  37. .onUpdate(function () {
  38. vm.tweeningValue = this.tweeningValue.toFixed(0)
  39. })
  40. .start()
  41. animate()
  42. }
  43. }
  44. })
  45. // 所有的复杂度都已经从 Vue 的主实例中移除!
  46. new Vue({
  47. el: '#example-8',
  48. data: {
  49. firstNumber: 20,
  50. secondNumber: 40
  51. },
  52. computed: {
  53. result: function () {
  54. return this.firstNumber + this.secondNumber
  55. }
  56. }
  57. })

把过渡放到组件里 - 图1

我们能在组件中结合使用这一节讲到各种过渡策略和 Vue 内建的过渡系统。总之,对于完成各种过渡动效几乎没有阻碍。