transition.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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 requestAnimationFrame = (cb) => setTimeout(cb, 1000 / 60);
  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. this.set({
  57. inited: true,
  58. display: true,
  59. classes: classNames.enter,
  60. currentDuration: isObj(duration) ? duration.enter : duration
  61. }).then(() => {
  62. requestAnimationFrame(() => {
  63. this.set({
  64. classes: classNames['enter-to']
  65. });
  66. });
  67. });
  68. },
  69. leave() {
  70. const { classNames, duration } = this.data;
  71. this.set({
  72. classes: classNames.leave,
  73. currentDuration: isObj(duration) ? duration.leave : duration
  74. }).then(() => {
  75. requestAnimationFrame(() => {
  76. this.set({
  77. classes: classNames['leave-to']
  78. });
  79. });
  80. });
  81. },
  82. onTransitionEnd() {
  83. if (!this.data.show) {
  84. this.set({ display: false });
  85. }
  86. }
  87. }
  88. });
  89. };