SingleNumber.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _vue = require("vue");
  8. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  9. var _classNames = _interopRequireDefault(require("../_util/classNames"));
  10. function UnitNumber(_ref) {
  11. let {
  12. prefixCls,
  13. value,
  14. current,
  15. offset = 0
  16. } = _ref;
  17. let style;
  18. if (offset) {
  19. style = {
  20. position: 'absolute',
  21. top: `${offset}00%`,
  22. left: 0
  23. };
  24. }
  25. return (0, _vue.createVNode)("p", {
  26. "style": style,
  27. "class": (0, _classNames.default)(`${prefixCls}-only-unit`, {
  28. current
  29. })
  30. }, [value]);
  31. }
  32. function getOffset(start, end, unit) {
  33. let index = start;
  34. let offset = 0;
  35. while ((index + 10) % 10 !== end) {
  36. index += unit;
  37. offset += unit;
  38. }
  39. return offset;
  40. }
  41. var _default = exports.default = (0, _vue.defineComponent)({
  42. compatConfig: {
  43. MODE: 3
  44. },
  45. name: 'SingleNumber',
  46. props: {
  47. prefixCls: String,
  48. value: String,
  49. count: Number
  50. },
  51. setup(props) {
  52. const originValue = (0, _vue.computed)(() => Number(props.value));
  53. const originCount = (0, _vue.computed)(() => Math.abs(props.count));
  54. const state = (0, _vue.reactive)({
  55. prevValue: originValue.value,
  56. prevCount: originCount.value
  57. });
  58. // ============================= Events =============================
  59. const onTransitionEnd = () => {
  60. state.prevValue = originValue.value;
  61. state.prevCount = originCount.value;
  62. };
  63. const timeout = (0, _vue.ref)();
  64. // Fallback if transition event not support
  65. (0, _vue.watch)(originValue, () => {
  66. clearTimeout(timeout.value);
  67. timeout.value = setTimeout(() => {
  68. onTransitionEnd();
  69. }, 1000);
  70. }, {
  71. flush: 'post'
  72. });
  73. (0, _vue.onUnmounted)(() => {
  74. clearTimeout(timeout.value);
  75. });
  76. return () => {
  77. let unitNodes;
  78. let offsetStyle = {};
  79. const value = originValue.value;
  80. if (state.prevValue === value || Number.isNaN(value) || Number.isNaN(state.prevValue)) {
  81. // Nothing to change
  82. unitNodes = [UnitNumber((0, _extends2.default)((0, _extends2.default)({}, props), {
  83. current: true
  84. }))];
  85. offsetStyle = {
  86. transition: 'none'
  87. };
  88. } else {
  89. unitNodes = [];
  90. // Fill basic number units
  91. const end = value + 10;
  92. const unitNumberList = [];
  93. for (let index = value; index <= end; index += 1) {
  94. unitNumberList.push(index);
  95. }
  96. // Fill with number unit nodes
  97. const prevIndex = unitNumberList.findIndex(n => n % 10 === state.prevValue);
  98. unitNodes = unitNumberList.map((n, index) => {
  99. const singleUnit = n % 10;
  100. return UnitNumber((0, _extends2.default)((0, _extends2.default)({}, props), {
  101. value: singleUnit,
  102. offset: index - prevIndex,
  103. current: index === prevIndex
  104. }));
  105. });
  106. // Calculate container offset value
  107. const unit = state.prevCount < originCount.value ? 1 : -1;
  108. offsetStyle = {
  109. transform: `translateY(${-getOffset(state.prevValue, value, unit)}00%)`
  110. };
  111. }
  112. return (0, _vue.createVNode)("span", {
  113. "class": `${props.prefixCls}-only`,
  114. "style": offsetStyle,
  115. "onTransitionend": () => onTransitionEnd()
  116. }, [unitNodes]);
  117. };
  118. }
  119. });