transition.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { isObj } from '../common/utils';
  2. const getClassNames = (name) => ({
  3. enter: `van-${name}-enter van-${name}-enter-active enter-class enter-active-class`,
  4. 'enter-to': `van-${name}-enter-to van-${name}-enter-active enter-to-class enter-active-class`,
  5. leave: `van-${name}-leave van-${name}-leave-active leave-class leave-active-class`,
  6. 'leave-to': `van-${name}-leave-to van-${name}-leave-active leave-to-class leave-active-class`
  7. });
  8. const nextTick = () => new Promise(resolve => setTimeout(resolve, 1000 / 30));
  9. export const transition = function (showDefaultValue) {
  10. return Behavior({
  11. properties: {
  12. customStyle: String,
  13. show: {
  14. type: Boolean,
  15. value: showDefaultValue,
  16. observer: 'observeShow'
  17. },
  18. duration: {
  19. type: [Number, Object],
  20. value: 300,
  21. observer: 'observeDuration'
  22. },
  23. name: {
  24. type: String,
  25. value: 'fade',
  26. observer: 'updateClasses'
  27. }
  28. },
  29. data: {
  30. type: '',
  31. inited: false,
  32. display: false,
  33. classNames: getClassNames('fade')
  34. },
  35. attached() {
  36. if (this.data.show) {
  37. this.show();
  38. }
  39. },
  40. methods: {
  41. observeShow(value) {
  42. if (value) {
  43. this.show();
  44. }
  45. else {
  46. this.leave();
  47. }
  48. },
  49. updateClasses(name) {
  50. this.set({
  51. classNames: getClassNames(name)
  52. });
  53. },
  54. show() {
  55. const { classNames, duration } = this.data;
  56. const currentDuration = isObj(duration) ? duration.leave : duration;
  57. Promise.resolve()
  58. .then(nextTick)
  59. .then(() => this.set({
  60. inited: true,
  61. display: true,
  62. classes: classNames.enter,
  63. currentDuration
  64. }))
  65. .then(nextTick)
  66. .then(() => this.set({
  67. classes: classNames['enter-to']
  68. }));
  69. },
  70. leave() {
  71. const { classNames, duration } = this.data;
  72. const currentDuration = isObj(duration) ? duration.leave : duration;
  73. if (+currentDuration === 0) {
  74. this.onTransitionEnd();
  75. return;
  76. }
  77. Promise.resolve()
  78. .then(nextTick)
  79. .then(() => this.set({
  80. classes: classNames.leave,
  81. currentDuration
  82. }))
  83. .then(nextTick)
  84. .then(() => this.set({
  85. classes: classNames['leave-to']
  86. }));
  87. },
  88. onTransitionEnd() {
  89. if (!this.data.show) {
  90. this.set({ display: false });
  91. this.$emit('transitionEnd');
  92. }
  93. }
  94. }
  95. });
  96. };