hy-app 0.4.13 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/components/hy-action-sheet/hy-action-sheet.vue +155 -238
  2. package/components/hy-action-sheet/props.ts +68 -15
  3. package/components/hy-action-sheet/typing.d.ts +115 -115
  4. package/components/hy-address-picker/hy-address-picker.vue +185 -289
  5. package/components/hy-address-picker/props.ts +97 -21
  6. package/components/hy-address-picker/typing.d.ts +90 -89
  7. package/components/hy-avatar/hy-avatar.vue +121 -204
  8. package/components/hy-avatar/props.ts +76 -18
  9. package/components/hy-avatar/typing.d.ts +63 -62
  10. package/components/hy-back-top/hy-back-top.vue +65 -120
  11. package/components/hy-back-top/props.ts +57 -16
  12. package/components/hy-back-top/typing.d.ts +43 -42
  13. package/components/hy-badge/hy-badge.vue +66 -138
  14. package/components/hy-badge/props.ts +73 -17
  15. package/components/hy-badge/typing.d.ts +59 -58
  16. package/components/hy-button/hy-button.vue +226 -375
  17. package/components/hy-button/props.ts +129 -158
  18. package/components/hy-calendar/header.vue +48 -64
  19. package/components/hy-calendar/hy-calendar.vue +274 -438
  20. package/components/hy-calendar/month.vue +508 -516
  21. package/components/hy-calendar/props.ts +157 -35
  22. package/components/hy-calendar/typing.d.ts +129 -128
  23. package/components/hy-card/hy-card.vue +118 -240
  24. package/components/hy-card/index.scss +1 -2
  25. package/components/hy-card/props.ts +122 -27
  26. package/components/hy-card/typing.d.ts +119 -118
  27. package/components/hy-cell/hy-cell.vue +176 -258
  28. package/components/hy-cell/props.ts +71 -17
  29. package/components/hy-cell/typing.d.ts +87 -86
  30. package/components/hy-check-button/hy-check-button.vue +69 -139
  31. package/components/hy-check-button/props.ts +72 -18
  32. package/components/hy-check-button/typing.d.ts +74 -73
  33. package/components/hy-checkbox/hy-checkbox.vue +170 -263
  34. package/components/hy-checkbox/props.ts +94 -24
  35. package/components/hy-checkbox/typing.d.ts +72 -72
  36. package/components/hy-checkbox-group/hy-checkbox-group.vue +25 -100
  37. package/components/hy-checkbox-group/props.ts +80 -0
  38. package/components/hy-checkbox-group/typing.d.ts +65 -65
  39. package/components/hy-checkbox-item/hy-checkbox-item.vue +140 -177
  40. package/components/hy-checkbox-item/props.ts +24 -0
  41. package/components/hy-checkbox-item/typing.d.ts +4 -3
  42. package/components/hy-code-input/hy-code-input.vue +179 -262
  43. package/components/hy-code-input/props.ts +84 -18
  44. package/components/hy-code-input/typing.d.ts +71 -71
  45. package/components/hy-config-provider/hy-config-provider.vue +28 -50
  46. package/components/hy-config-provider/props.ts +26 -11
  47. package/components/hy-config-provider/typing.d.ts +20 -20
  48. package/components/hy-count-down/hy-count-down.vue +103 -131
  49. package/components/hy-count-down/props.ts +30 -8
  50. package/components/hy-count-down/typing.d.ts +25 -25
  51. package/components/hy-count-to/hy-count-to.vue +148 -213
  52. package/components/hy-count-to/props.ts +60 -15
  53. package/components/hy-count-to/typing.d.ts +46 -46
  54. package/components/hy-coupon/README.md +133 -0
  55. package/components/hy-coupon/hy-coupon.vue +180 -0
  56. package/components/hy-coupon/index.scss +553 -0
  57. package/components/hy-coupon/props.ts +129 -0
  58. package/components/hy-coupon/typing.d.ts +146 -0
  59. package/components/hy-datetime-picker/hy-datetime-picker.vue +415 -580
  60. package/components/hy-datetime-picker/props.ts +142 -32
  61. package/components/hy-datetime-picker/typing.d.ts +132 -132
  62. package/components/hy-divider/hy-divider.vue +90 -169
  63. package/components/hy-divider/props.ts +78 -19
  64. package/components/hy-divider/typing.d.ts +60 -60
  65. package/components/hy-dropdown/hy-dropdown.vue +37 -71
  66. package/components/hy-dropdown/props.ts +38 -15
  67. package/components/hy-dropdown/typing.d.ts +44 -44
  68. package/components/hy-dropdown-item/hy-dropdown-item.vue +141 -173
  69. package/components/hy-dropdown-item/props.ts +19 -8
  70. package/components/hy-empty/hy-empty.vue +75 -129
  71. package/components/hy-empty/props.ts +57 -15
  72. package/components/hy-empty/typing.d.ts +84 -84
  73. package/components/hy-flex/hy-flex.vue +33 -88
  74. package/components/hy-flex/props.ts +58 -0
  75. package/components/hy-flex/typing.d.ts +14 -16
  76. package/components/hy-float-button/hy-float-button.vue +289 -406
  77. package/components/hy-float-button/props.ts +109 -25
  78. package/components/hy-folding-panel/hy-folding-panel.vue +86 -374
  79. package/components/hy-folding-panel/props.ts +40 -15
  80. package/components/hy-folding-panel/typing.d.ts +52 -63
  81. package/components/hy-folding-panel-item/hy-folding-panel-item.vue +186 -228
  82. package/components/hy-folding-panel-item/index.scss +87 -0
  83. package/components/hy-folding-panel-item/props.ts +81 -0
  84. package/components/hy-folding-panel-item/typing.d.ts +23 -0
  85. package/components/hy-form/hy-form.vue +172 -212
  86. package/components/hy-form/props.ts +37 -0
  87. package/components/hy-form/typing.d.ts +68 -61
  88. package/components/hy-form-group/typing.d.ts +74 -74
  89. package/components/hy-form-item/hy-form-item.vue +100 -129
  90. package/components/hy-form-item/props.ts +25 -0
  91. package/components/hy-form-item/typing.d.ts +40 -37
  92. package/components/hy-grid/hy-grid.vue +76 -132
  93. package/components/hy-grid/props.ts +58 -16
  94. package/components/hy-grid/typing.d.ts +66 -66
  95. package/components/hy-icon/hy-icon.vue +84 -161
  96. package/components/hy-icon/props.ts +76 -22
  97. package/components/hy-icon/typing.d.ts +83 -82
  98. package/components/hy-image/hy-image.vue +142 -272
  99. package/components/hy-image/props.ts +105 -23
  100. package/components/hy-image/typing.d.ts +84 -87
  101. package/components/hy-input/hy-input.vue +230 -421
  102. package/components/hy-input/props.ts +183 -35
  103. package/components/hy-input/typing.d.ts +169 -169
  104. package/components/hy-line/hy-line.vue +34 -72
  105. package/components/hy-line/props.ts +41 -10
  106. package/components/hy-line/typing.d.ts +29 -29
  107. package/components/hy-line-progress/hy-line-progress.vue +66 -101
  108. package/components/hy-line-progress/props.ts +31 -10
  109. package/components/hy-line-progress/typing.d.ts +29 -29
  110. package/components/hy-list/hy-list.vue +151 -220
  111. package/components/hy-list/props.ts +67 -16
  112. package/components/hy-list/typing.d.ts +52 -52
  113. package/components/hy-loading/hy-loading.vue +63 -119
  114. package/components/hy-loading/props.ts +63 -15
  115. package/components/hy-loading/typing.d.ts +49 -49
  116. package/components/hy-menu/hy-menu.vue +124 -166
  117. package/components/hy-menu/props.ts +42 -10
  118. package/components/hy-menu/typing.d.ts +60 -60
  119. package/components/hy-modal/hy-modal.vue +127 -218
  120. package/components/hy-modal/props.ts +89 -24
  121. package/components/hy-navbar/hy-navbar.vue +104 -177
  122. package/components/hy-navbar/props.ts +76 -22
  123. package/components/hy-navbar/typing.d.ts +81 -81
  124. package/components/hy-notice-bar/hy-notice-bar.vue +67 -144
  125. package/components/hy-notice-bar/props.ts +80 -19
  126. package/components/hy-notice-bar/typing.d.ts +62 -62
  127. package/components/hy-notify/hy-notify.vue +128 -177
  128. package/components/hy-notify/props.ts +49 -12
  129. package/components/hy-notify/typing.d.ts +45 -41
  130. package/components/hy-number-step/hy-number-step.vue +281 -394
  131. package/components/hy-number-step/props.ts +110 -27
  132. package/components/hy-number-step/typing.d.ts +120 -120
  133. package/components/hy-overlay/hy-overlay.vue +39 -66
  134. package/components/hy-overlay/props.ts +31 -8
  135. package/components/hy-pagination/hy-pagination.vue +100 -155
  136. package/components/hy-pagination/props.ts +53 -13
  137. package/components/hy-picker/hy-picker.vue +309 -430
  138. package/components/hy-picker/index.scss +8 -12
  139. package/components/hy-picker/props.ts +110 -26
  140. package/components/hy-popover/hy-popover.vue +190 -252
  141. package/components/hy-popover/props.ts +48 -10
  142. package/components/hy-popup/hy-popup.vue +162 -248
  143. package/components/hy-popup/props.ts +82 -18
  144. package/components/hy-price/hy-price.vue +45 -104
  145. package/components/hy-price/props.ts +52 -12
  146. package/components/hy-price/typing.d.ts +41 -36
  147. package/components/hy-qrcode/hy-qrcode.vue +115 -185
  148. package/components/hy-qrcode/props.ts +68 -18
  149. package/components/hy-qrcode/typing.d.ts +67 -66
  150. package/components/hy-radio/hy-radio.vue +161 -259
  151. package/components/hy-radio/props.ts +95 -25
  152. package/components/hy-radio/typing.d.ts +85 -84
  153. package/components/hy-rate/hy-rate.vue +185 -270
  154. package/components/hy-rate/props.ts +76 -18
  155. package/components/hy-rate/typing.d.ts +61 -60
  156. package/components/hy-read-more/hy-read-more.vue +93 -136
  157. package/components/hy-read-more/props.ts +43 -13
  158. package/components/hy-scroll-list/hy-scroll-list.vue +81 -102
  159. package/components/hy-scroll-list/props.ts +22 -11
  160. package/components/hy-search/hy-search.vue +155 -284
  161. package/components/hy-search/props.ts +130 -25
  162. package/components/hy-signature/hy-signature.vue +491 -635
  163. package/components/hy-signature/props.ts +115 -26
  164. package/components/hy-signature/typing.d.ts +138 -138
  165. package/components/hy-slider/hy-slider.vue +388 -477
  166. package/components/hy-slider/props.ts +75 -19
  167. package/components/hy-steps/hy-steps.vue +212 -279
  168. package/components/hy-steps/props.ts +47 -13
  169. package/components/hy-submit-bar/hy-submit-bar.vue +137 -222
  170. package/components/hy-submit-bar/props.ts +89 -20
  171. package/components/hy-submit-bar/typing.d.ts +86 -85
  172. package/components/hy-subsection/hy-subsection.vue +132 -185
  173. package/components/hy-subsection/props.ts +50 -17
  174. package/components/hy-subsection/typing.d.ts +52 -52
  175. package/components/hy-swipe-action/hy-swipe-action.vue +228 -283
  176. package/components/hy-swipe-action/props.ts +43 -18
  177. package/components/hy-swipe-action/typing.d.ts +46 -46
  178. package/components/hy-swiper/hy-swiper.vue +159 -286
  179. package/components/hy-swiper/props.ts +126 -28
  180. package/components/hy-swiper/typing.d.ts +115 -115
  181. package/components/hy-switch/hy-switch.vue +112 -176
  182. package/components/hy-switch/props.ts +60 -15
  183. package/components/hy-switch/typing.d.ts +63 -63
  184. package/components/hy-tabBar/hy-tabBar.vue +64 -60
  185. package/components/hy-tabs/hy-tabs.vue +277 -380
  186. package/components/hy-tabs/props.ts +75 -18
  187. package/components/hy-tag/hy-tag.vue +111 -204
  188. package/components/hy-tag/props.ts +81 -19
  189. package/components/hy-text/hy-text.vue +200 -322
  190. package/components/hy-text/props.ts +107 -28
  191. package/components/hy-textarea/hy-textarea.vue +147 -256
  192. package/components/hy-textarea/props.ts +112 -25
  193. package/components/hy-textarea/typing.d.ts +42 -42
  194. package/components/hy-toast/hy-toast.vue +135 -143
  195. package/components/hy-tooltip/hy-tooltip.vue +220 -306
  196. package/components/hy-tooltip/props.ts +79 -15
  197. package/components/hy-transition/hy-transition.vue +111 -138
  198. package/components/hy-transition/props.ts +30 -8
  199. package/components/hy-upload/hy-upload.vue +320 -469
  200. package/components/hy-upload/props.ts +130 -27
  201. package/components/hy-warn/hy-warn.vue +80 -129
  202. package/components/hy-warn/props.ts +47 -12
  203. package/components/hy-waterfall/hy-waterfall.vue +139 -163
  204. package/components/hy-waterfall/props.ts +19 -7
  205. package/components/hy-watermark/hy-watermark.vue +762 -870
  206. package/components/hy-watermark/props.ts +103 -22
  207. package/global.d.ts +2 -0
  208. package/libs/css/theme.scss +3 -3
  209. package/package.json +2 -2
  210. package/web-types.json +1 -1
  211. package/components/hy-folding-panel/index.scss +0 -9
@@ -1,10 +1,32 @@
1
- import type IProps from "./typing";
1
+ import type { CSSProperties, PropType } from 'vue'
2
2
 
3
- const defaultProps: IProps = {
4
- time: 0,
5
- format: "HH:mm:ss",
6
- autoStart: true,
7
- millisecond: false,
8
- };
3
+ const countDownProps = {
4
+ /** 倒计时时长,单位ms */
5
+ time: {
6
+ type: Number,
7
+ default: 0
8
+ },
9
+ /** 时间格式,DD-日,HH-时,mm-分,ss-秒,SSS-毫秒 */
10
+ format: {
11
+ type: String,
12
+ default: 'HH:mm:ss'
13
+ },
14
+ /** 是否自动开始倒计时 */
15
+ autoStart: {
16
+ type: Boolean,
17
+ default: true
18
+ },
19
+ /** 是否展示毫秒倒计时 */
20
+ millisecond: {
21
+ type: Boolean,
22
+ default: false
23
+ },
24
+ /** 定义需要用到的外部样式 */
25
+ customStyle: {
26
+ type: Object as PropType<CSSProperties>
27
+ },
28
+ /** 自定义外部类名 */
29
+ customClass: String
30
+ }
9
31
 
10
- export default defaultProps;
32
+ export default countDownProps
@@ -1,33 +1,33 @@
1
1
  import type { CSSProperties } from 'vue'
2
2
 
3
3
  export default interface HyCountDownProps {
4
- /**
5
- * @description 倒计时时长,单位ms (默认 0 )
6
- * */
7
- time: number
8
- /**
9
- * @description 时间格式,DD-日,HH-时,mm-分,ss-秒,SSS-毫秒 (默认 'HH:mm:ss' )
10
- * */
11
- format?: string
12
- /**
13
- * @description 是否自动开始倒计时 (默认 true )
14
- * */
15
- autoStart?: boolean
16
- /**
17
- * @description 是否展示毫秒倒计时 (默认 false )
18
- * */
19
- millisecond?: boolean
4
+ /**
5
+ * @description 倒计时时长,单位ms (默认 0 )
6
+ * */
7
+ time: number
8
+ /**
9
+ * @description 时间格式,DD-日,HH-时,mm-分,ss-秒,SSS-毫秒 (默认 'HH:mm:ss' )
10
+ * */
11
+ format?: string
12
+ /**
13
+ * @description 是否自动开始倒计时 (默认 true )
14
+ * */
15
+ autoStart?: boolean
16
+ /**
17
+ * @description 是否展示毫秒倒计时 (默认 false )
18
+ * */
19
+ millisecond?: boolean
20
20
  }
21
21
  type TimeDataVo = {
22
- days: number
23
- hours: number
24
- minutes: number
25
- seconds: number
26
- milliseconds: number
22
+ days: number
23
+ hours: number
24
+ minutes: number
25
+ seconds: number
26
+ milliseconds: number
27
27
  }
28
28
  export interface ICountDownEmits {
29
- /** 过程中,倒计时变化时触发 */
30
- (e: 'change', time: TimeDataVo): void
31
- /** 倒计时结束触发 */
32
- (e: 'finish'): void
29
+ /** 过程中,倒计时变化时触发 */
30
+ (e: 'change', time: TimeDataVo): void
31
+ /** 倒计时结束触发 */
32
+ (e: 'finish'): void
33
33
  }
@@ -1,283 +1,218 @@
1
1
  <template>
2
- <text
3
- :class="['hy-count-to', customClass]"
4
- :style="[
5
- {
6
- fontSize: addUnit(fontSize),
7
- fontWeight: bold ? 'bold' : 'normal',
8
- color: color,
9
- },
10
- customStyle,
11
- ]"
12
- >
13
- {{ displayValue }}
14
- </text>
2
+ <text
3
+ :class="['hy-count-to', customClass]"
4
+ :style="[
5
+ {
6
+ fontSize: addUnit(fontSize),
7
+ fontWeight: bold ? 'bold' : 'normal',
8
+ color: color
9
+ },
10
+ customStyle
11
+ ]"
12
+ >
13
+ {{ displayValue }}
14
+ </text>
15
15
  </template>
16
16
 
17
17
  <script lang="ts">
18
18
  export default {
19
- name: "hy-count-to",
20
- options: {
21
- addGlobalClass: true,
22
- virtualHost: true,
23
- styleIsolation: "shared",
24
- },
25
- };
19
+ name: 'hy-count-to',
20
+ options: {
21
+ addGlobalClass: true,
22
+ virtualHost: true,
23
+ styleIsolation: 'shared'
24
+ }
25
+ }
26
26
  </script>
27
27
 
28
28
  <script setup lang="ts">
29
- import type { ICountToEmits } from "./typing";
30
- import { computed, onMounted, ref, watch } from "vue";
31
- import type { CSSProperties, PropType } from "vue";
32
- import { addUnit, isNumber } from "../../libs";
29
+ import type { ICountToEmits } from './typing'
30
+ import { computed, onMounted, ref, watch } from 'vue'
31
+ import { addUnit, isNumber } from '../../libs'
32
+ import countToProps from './props'
33
33
 
34
34
  /**
35
35
  * 一般用于需要滚动数字到某一个值的场景,目标要求是一个递增的值。
36
36
  * @displayName hy-count-to
37
37
  */
38
- defineOptions({});
38
+ defineOptions({})
39
39
 
40
- // const props = withDefaults(defineProps<IProps>(), defaultProps);
41
- const props = defineProps({
42
- /** 开始的数值,默认从0增长到某一个数 */
43
- startVal: {
44
- type: Number,
45
- default: 0,
46
- },
47
- /** 要滚动的目标数值,必须 */
48
- endVal: {
49
- type: Number,
50
- default: 0,
51
- required: true,
52
- },
53
- /** 滚动到目标数值的动画持续时间,单位为毫秒(ms) */
54
- duration: {
55
- type: Number,
56
- default: 2000,
57
- },
58
- /** 设置数值后是否自动开始滚动 */
59
- autoplay: {
60
- type: Boolean,
61
- default: true,
62
- },
63
- /** 要显示的小数位数 */
64
- decimals: {
65
- type: Number,
66
- default: 0,
67
- },
68
- /** 滚动结束时,是否缓动结尾 */
69
- useEasing: {
70
- type: Boolean,
71
- default: true,
72
- },
73
- /** 十进制分割 */
74
- decimal: {
75
- type: String,
76
- default: ".",
77
- },
78
- /** 字体颜色 */
79
- color: String,
80
- /** 字体大小,单位px */
81
- fontSize: {
82
- type: [Number, String],
83
- default: 22,
84
- },
85
- /** 字体是否加粗 */
86
- bold: {
87
- type: Boolean,
88
- default: false,
89
- },
90
- /** 千位分隔符 */
91
- separator: String,
92
- /** 定义需要用到的外部样式 */
93
- customStyle: {
94
- type: Object as PropType<CSSProperties>,
95
- },
96
- /** 自定义外部类名 */
97
- customClass: String,
98
- });
99
- const emit = defineEmits<ICountToEmits>();
40
+ const props = defineProps(countToProps)
41
+ const emit = defineEmits<ICountToEmits>()
100
42
 
101
43
  const formatNumber = (num: number): string => {
102
- let numStr;
103
- // 将num转为Number类型,因为其值可能为字符串数值,调用toFixed会报错
104
- num = Number(num);
105
- numStr = num.toFixed(Number(props.decimals));
106
- numStr += "";
107
- const x = numStr.split(".");
108
- let x1 = x[0];
109
- const x2 = x.length > 1 ? props.decimal + x[1] : "";
110
- const rgx = /(\d+)(\d{3})/;
111
- if (props.separator && !isNumber(props.separator)) {
112
- while (rgx.test(x1)) {
113
- x1 = x1.replace(rgx, "$1" + props.separator + "$2");
44
+ let numStr
45
+ // 将num转为Number类型,因为其值可能为字符串数值,调用toFixed会报错
46
+ num = Number(num)
47
+ numStr = num.toFixed(Number(props.decimals))
48
+ numStr += ''
49
+ const x = numStr.split('.')
50
+ let x1 = x[0]
51
+ const x2 = x.length > 1 ? props.decimal + x[1] : ''
52
+ const rgx = /(\d+)(\d{3})/
53
+ if (props.separator && !isNumber(props.separator)) {
54
+ while (rgx.test(x1)) {
55
+ x1 = x1.replace(rgx, '$1' + props.separator + '$2')
56
+ }
114
57
  }
115
- }
116
- return x1 + x2;
117
- };
118
-
119
- const localStartVal = ref(props.startVal);
120
- let displayValue = ref(formatNumber(props.startVal));
121
- const printVal = ref<number | null>(null);
122
- const paused = ref(false); // 是否暂停
123
- const localDuration = ref(Number(props.duration));
124
- const startTime = ref<number | null>(null); // 开始的时间
125
- const timestamp = ref<number | null>(null); // 时间戳
126
- const remaining = ref<number | null>(null); // 停留的时间
127
- const rAF = ref<number>(); // 停留的时间
128
- const lastTime = ref(0); // 上一次的时间
58
+ return x1 + x2
59
+ }
60
+
61
+ const localStartVal = ref(props.startVal)
62
+ let displayValue = ref(formatNumber(props.startVal))
63
+ const printVal = ref<number | null>(null)
64
+ const paused = ref(false) // 是否暂停
65
+ const localDuration = ref(Number(props.duration))
66
+ const startTime = ref<number | null>(null) // 开始的时间
67
+ const timestamp = ref<number | null>(null) // 时间戳
68
+ const remaining = ref<number | null>(null) // 停留的时间
69
+ const rAF = ref<number>() // 停留的时间
70
+ const lastTime = ref(0) // 上一次的时间
129
71
 
130
72
  const countDown = computed(() => {
131
- return props.startVal > props.endVal;
132
- });
73
+ return props.startVal > props.endVal
74
+ })
133
75
 
134
76
  watch(
135
- () => props.startVal,
136
- () => props.autoplay && start(),
137
- );
77
+ () => props.startVal,
78
+ () => props.autoplay && start()
79
+ )
138
80
 
139
81
  watch(
140
- () => props.endVal,
141
- () => props.autoplay && start(),
142
- );
82
+ () => props.endVal,
83
+ () => props.autoplay && start()
84
+ )
143
85
 
144
86
  onMounted(() => {
145
- props.autoplay && start();
146
- });
87
+ props.autoplay && start()
88
+ })
147
89
 
148
90
  const easingFn = (t: number, b: number, c: number, d: number) => {
149
- return (c * (-Math.pow(2, (-10 * t) / d) + 1) * 1024) / 1023 + b;
150
- };
91
+ return (c * (-Math.pow(2, (-10 * t) / d) + 1) * 1024) / 1023 + b
92
+ }
151
93
 
152
94
  const requestAnimationFrame = (callback: Function): number => {
153
- const currTime = new Date().getTime();
154
- // 为了使setTimteout的尽可能的接近每秒60帧的效果
155
- const timeToCall = Math.max(0, 16 - (currTime - lastTime.value));
156
- const id = setTimeout(() => {
157
- callback(currTime + timeToCall);
158
- }, timeToCall) as unknown as number;
159
- lastTime.value = currTime + timeToCall;
160
- return id;
161
- };
95
+ const currTime = new Date().getTime()
96
+ // 为了使setTimteout的尽可能的接近每秒60帧的效果
97
+ const timeToCall = Math.max(0, 16 - (currTime - lastTime.value))
98
+ const id = setTimeout(() => {
99
+ callback(currTime + timeToCall)
100
+ }, timeToCall) as unknown as number
101
+ lastTime.value = currTime + timeToCall
102
+ return id
103
+ }
162
104
 
163
105
  const cancelAnimationFrame = (id?: number) => {
164
- clearTimeout(id);
165
- };
106
+ clearTimeout(id)
107
+ }
166
108
 
167
109
  /**
168
110
  * @description 开始滚动数字
169
111
  * */
170
112
  const start = () => {
171
- localStartVal.value = props.startVal;
172
- startTime.value = null;
173
- localDuration.value = props.duration;
174
- paused.value = false;
175
- rAF.value = requestAnimationFrame(count);
176
- };
113
+ localStartVal.value = props.startVal
114
+ startTime.value = null
115
+ localDuration.value = props.duration
116
+ paused.value = false
117
+ rAF.value = requestAnimationFrame(count)
118
+ }
177
119
 
178
120
  /**
179
121
  * @description 暂定状态,重新再开始滚动;或者滚动状态下,暂停
180
122
  * */
181
123
  const reStart = () => {
182
- if (paused.value) {
183
- resume();
184
- paused.value = false;
185
- } else {
186
- stop();
187
- paused.value = true;
188
- }
189
- };
124
+ if (paused.value) {
125
+ resume()
126
+ paused.value = false
127
+ } else {
128
+ stop()
129
+ paused.value = true
130
+ }
131
+ }
190
132
 
191
133
  /**
192
134
  * @description 暂停
193
135
  * */
194
136
  const stop = () => {
195
- cancelAnimationFrame(rAF.value);
196
- };
137
+ cancelAnimationFrame(rAF.value)
138
+ }
197
139
 
198
140
  /**
199
141
  * @description 重新开始(暂停的情况下)
200
142
  * */
201
143
  const resume = () => {
202
- if (!remaining.value) return;
203
- startTime.value = 0;
204
- localDuration.value = remaining.value;
205
- if (printVal.value) {
206
- localStartVal.value = printVal.value;
207
- }
208
- requestAnimationFrame(count);
209
- };
144
+ if (!remaining.value) return
145
+ startTime.value = 0
146
+ localDuration.value = remaining.value
147
+ if (printVal.value) {
148
+ localStartVal.value = printVal.value
149
+ }
150
+ requestAnimationFrame(count)
151
+ }
210
152
 
211
153
  /**
212
154
  * @description 重置
213
155
  * */
214
156
  const reset = () => {
215
- startTime.value = null;
216
- cancelAnimationFrame(rAF.value);
217
- displayValue.value = formatNumber(props.startVal);
218
- };
157
+ startTime.value = null
158
+ cancelAnimationFrame(rAF.value)
159
+ displayValue.value = formatNumber(props.startVal)
160
+ }
219
161
  const count = (time_stamp: number) => {
220
- if (!startTime.value) startTime.value = time_stamp;
221
- timestamp.value = time_stamp;
222
- const progress = time_stamp - startTime.value;
223
- remaining.value = localDuration.value - progress;
224
- if (props.useEasing) {
225
- if (countDown.value) {
226
- printVal.value =
227
- localStartVal.value -
228
- easingFn(
229
- progress,
230
- 0,
231
- localStartVal.value - props.endVal,
232
- localDuration.value,
233
- );
162
+ if (!startTime.value) startTime.value = time_stamp
163
+ timestamp.value = time_stamp
164
+ const progress = time_stamp - startTime.value
165
+ remaining.value = localDuration.value - progress
166
+ if (props.useEasing) {
167
+ if (countDown.value) {
168
+ printVal.value =
169
+ localStartVal.value -
170
+ easingFn(progress, 0, localStartVal.value - props.endVal, localDuration.value)
171
+ } else {
172
+ printVal.value = easingFn(
173
+ progress,
174
+ localStartVal.value,
175
+ props.endVal - localStartVal.value,
176
+ localDuration.value
177
+ )
178
+ }
234
179
  } else {
235
- printVal.value = easingFn(
236
- progress,
237
- localStartVal.value,
238
- props.endVal - localStartVal.value,
239
- localDuration.value,
240
- );
180
+ if (countDown.value) {
181
+ printVal.value =
182
+ localStartVal.value -
183
+ (localStartVal.value - props.endVal) * (progress / localDuration.value)
184
+ } else {
185
+ printVal.value =
186
+ localStartVal.value +
187
+ (props.endVal - localStartVal.value) * (progress / localDuration.value)
188
+ }
241
189
  }
242
- } else {
243
190
  if (countDown.value) {
244
- printVal.value =
245
- localStartVal.value -
246
- (localStartVal.value - props.endVal) * (progress / localDuration.value);
191
+ printVal.value = printVal.value < props.endVal ? props.endVal : printVal.value
192
+ } else {
193
+ printVal.value = printVal.value > props.endVal ? props.endVal : printVal.value
194
+ }
195
+ displayValue.value = formatNumber(printVal.value)
196
+ if (progress < localDuration.value) {
197
+ rAF.value = requestAnimationFrame(count)
247
198
  } else {
248
- printVal.value =
249
- localStartVal.value +
250
- (props.endVal - localStartVal.value) * (progress / localDuration.value);
199
+ emit('end')
251
200
  }
252
- }
253
- if (countDown.value) {
254
- printVal.value =
255
- printVal.value < props.endVal ? props.endVal : printVal.value;
256
- } else {
257
- printVal.value =
258
- printVal.value > props.endVal ? props.endVal : printVal.value;
259
- }
260
- displayValue.value = formatNumber(printVal.value);
261
- if (progress < localDuration.value) {
262
- rAF.value = requestAnimationFrame(count);
263
- } else {
264
- emit("end");
265
- }
266
- };
201
+ }
267
202
 
268
203
  const destroyed = () => {
269
- cancelAnimationFrame(rAF.value);
270
- };
204
+ cancelAnimationFrame(rAF.value)
205
+ }
271
206
 
272
207
  defineExpose({
273
- start,
274
- stop,
275
- reStart,
276
- resume,
277
- reset,
278
- });
208
+ start,
209
+ stop,
210
+ reStart,
211
+ resume,
212
+ reset
213
+ })
279
214
  </script>
280
215
 
281
216
  <style scoped lang="scss">
282
- @import "./index.scss";
217
+ @import './index.scss';
283
218
  </style>
@@ -1,17 +1,62 @@
1
- import type IProps from "./typing";
1
+ import type { CSSProperties, PropType } from 'vue'
2
2
 
3
- const defaultProps: IProps = {
4
- startVal: 0,
5
- endVal: 0,
6
- duration: 2000,
7
- autoplay: true,
8
- decimals: 0,
9
- useEasing: true,
10
- decimal: ".",
11
- color: "",
12
- fontSize: 22,
13
- bold: false,
14
- separator: "",
15
- };
3
+ const countToProps = {
4
+ /** 开始的数值,默认从0增长到某一个数 */
5
+ startVal: {
6
+ type: Number,
7
+ default: 0
8
+ },
9
+ /** 要滚动的目标数值,必须 */
10
+ endVal: {
11
+ type: Number,
12
+ default: 0,
13
+ required: true
14
+ },
15
+ /** 滚动到目标数值的动画持续时间,单位为毫秒(ms) */
16
+ duration: {
17
+ type: Number,
18
+ default: 2000
19
+ },
20
+ /** 设置数值后是否自动开始滚动 */
21
+ autoplay: {
22
+ type: Boolean,
23
+ default: true
24
+ },
25
+ /** 要显示的小数位数 */
26
+ decimals: {
27
+ type: Number,
28
+ default: 0
29
+ },
30
+ /** 滚动结束时,是否缓动结尾 */
31
+ useEasing: {
32
+ type: Boolean,
33
+ default: true
34
+ },
35
+ /** 十进制分割 */
36
+ decimal: {
37
+ type: String,
38
+ default: '.'
39
+ },
40
+ /** 字体颜色 */
41
+ color: String,
42
+ /** 字体大小,单位px */
43
+ fontSize: {
44
+ type: [Number, String],
45
+ default: 22
46
+ },
47
+ /** 字体是否加粗 */
48
+ bold: {
49
+ type: Boolean,
50
+ default: false
51
+ },
52
+ /** 千位分隔符 */
53
+ separator: String,
54
+ /** 定义需要用到的外部样式 */
55
+ customStyle: {
56
+ type: Object as PropType<CSSProperties>
57
+ },
58
+ /** 自定义外部类名 */
59
+ customClass: String
60
+ }
16
61
 
17
- export default defaultProps;
62
+ export default countToProps