SingleNumber.js 3.8 KB

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