• 把过渡放到组件里

    把过渡放到组件里

    管理太多的状态过渡会很快的增加 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 内建的过渡系统。总之,对于完成各种过渡动效几乎没有阻碍。