@10yun/cv-mobile-ui 0.4.2 → 0.4.3

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 (166) hide show
  1. package/package.json +1 -1
  2. package/ui-uni/amap-wx/js/util.js +166 -158
  3. package/ui-uni/page-foot/page-foot.vue +38 -0
  4. package/ui-uni/page-head/page-head.vue +16 -0
  5. package/ui-uni/product.vue +52 -52
  6. package/ui-uni/u-charts/u-charts.js +743 -1092
  7. package/ui-uni/u-link/u-link.vue +59 -0
  8. package/ui-uni/uni-badge/uni-badge.vue +250 -0
  9. package/ui-uni/uni-calendar/calendar.js +546 -0
  10. package/ui-uni/uni-calendar/uni-calendar-item.vue +171 -0
  11. package/ui-uni/uni-calendar/uni-calendar.vue +504 -0
  12. package/{ui-cv/cv-calendar → ui-uni/uni-calendar}/util.js +0 -0
  13. package/ui-uni/uni-card/uni-card.vue +420 -0
  14. package/ui-uni/uni-col/uni-col.vue +2968 -0
  15. package/ui-uni/uni-collapse/uni-collapse.vue +146 -0
  16. package/ui-uni/uni-collapse-item/uni-collapse-item.vue +378 -0
  17. package/ui-uni/uni-combox/uni-combox.vue +237 -0
  18. package/ui-uni/uni-countdown/uni-countdown.vue +234 -0
  19. package/ui-uni/uni-data-checkbox/uni-data-checkbox.vue +792 -0
  20. package/{ui-cv/cv-data-indexed-list → ui-uni/uni-data-indexed-list}/clientdb.js +0 -0
  21. package/ui-uni/uni-data-indexed-list/uni-data-indexed-list-item.vue +142 -0
  22. package/ui-uni/uni-data-indexed-list/uni-data-indexed-list.vue +364 -0
  23. package/{ui-cv/cv-data-picker → ui-uni/uni-data-picker}/keypress.js +0 -0
  24. package/ui-uni/uni-data-picker/uni-data-picker.vue +468 -0
  25. package/{ui-cv/cv-data-pickerview/cv-data-picker.js → ui-uni/uni-data-pickerview/uni-data-picker.js} +0 -0
  26. package/ui-uni/uni-data-pickerview/uni-data-pickerview.vue +298 -0
  27. package/{ui-cv/cv-dateformat → ui-uni/uni-dateformat}/date-format.js +0 -0
  28. package/ui-uni/uni-dateformat/uni-dateformat.vue +88 -0
  29. package/{ui-cv/cv-datetime-picker → ui-uni/uni-datetime-picker}/calendar-item.vue +0 -0
  30. package/{ui-cv/cv-datetime-picker → ui-uni/uni-datetime-picker}/calendar.js +0 -0
  31. package/ui-uni/uni-datetime-picker/calendar.vue +747 -0
  32. package/{ui-cv/cv-datetime-picker → ui-uni/uni-datetime-picker}/keypress.js +0 -0
  33. package/ui-uni/uni-datetime-picker/time-picker.vue +899 -0
  34. package/ui-uni/uni-datetime-picker/uni-datetime-picker.vue +874 -0
  35. package/{ui-cv/cv-datetime-picker → ui-uni/uni-datetime-picker}/util.js +0 -0
  36. package/ui-uni/uni-drawer/keypress.js +45 -0
  37. package/ui-uni/uni-drawer/uni-drawer.vue +178 -0
  38. package/{ui-cv/cv-easyinput → ui-uni/uni-easyinput}/common.js +0 -0
  39. package/ui-uni/uni-easyinput/uni-easyinput.vue +438 -0
  40. package/ui-uni/uni-fab/uni-fab.vue +443 -0
  41. package/{ui-cv/cv-fab/cv-fab.vue.bak → ui-uni/uni-fab/uni-fab.vue.bak} +2 -2
  42. package/ui-uni/uni-fav/uni-fav.vue +136 -0
  43. package/{ui-cv/cv-file-picker → ui-uni/uni-file-picker}/choose-and-upload-file.js +0 -0
  44. package/ui-uni/uni-file-picker/uni-file-picker.vue +614 -0
  45. package/{ui-cv/cv-file-picker → ui-uni/uni-file-picker}/upload-file.vue +0 -0
  46. package/{ui-cv/cv-file-picker → ui-uni/uni-file-picker}/upload-image.vue +0 -0
  47. package/{ui-cv/cv-file-picker → ui-uni/uni-file-picker}/utils.js +0 -0
  48. package/ui-uni/uni-forms/uni-forms.vue +467 -0
  49. package/ui-uni/uni-forms/validate.js +486 -0
  50. package/ui-uni/uni-forms-item/uni-forms-item.vue +500 -0
  51. package/{ui-cv/cv-goods-nav/cv-goods-nav.vue → ui-uni/uni-goods-nav/uni-goods-nav.vue} +1 -1
  52. package/ui-uni/uni-grid/uni-grid.vue +141 -0
  53. package/ui-uni/uni-grid-item/uni-grid-item.vue +123 -0
  54. package/ui-uni/uni-group/uni-group.vue +123 -0
  55. package/ui-uni/uni-icons/icons.js +132 -0
  56. package/ui-uni/uni-icons/uni-icons.vue +72 -0
  57. package/{ui-cv/cv-icon2 → ui-uni/uni-icons}/uni.ttf +0 -0
  58. package/ui-uni/uni-indexed-list/uni-indexed-list-item.vue +142 -0
  59. package/ui-uni/uni-indexed-list/uni-indexed-list.vue +357 -0
  60. package/ui-uni/uni-link/uni-link.vue +117 -0
  61. package/ui-uni/uni-list/uni-list.vue +107 -0
  62. package/ui-uni/uni-list/uni-refresh.vue +65 -0
  63. package/{ui-cv/cv-list → ui-uni/uni-list}/uni-refresh.wxs +0 -0
  64. package/ui-uni/uni-list-ad/uni-list-ad.vue +106 -0
  65. package/{ui-cv/cv-list-chat/cv-list-chat.scss → ui-uni/uni-list-chat/uni-list-chat.scss} +0 -0
  66. package/{ui-cv/cv-list-chat/cv-list-chat.vue → ui-uni/uni-list-chat/uni-list-chat.vue} +0 -0
  67. package/ui-uni/uni-list-item/uni-list-item.vue +428 -0
  68. package/ui-uni/uni-load-more/uni-load-more.vue +366 -0
  69. package/ui-uni/uni-nav-bar/uni-nav-bar.vue +244 -0
  70. package/{ui-cv/cv-nav-bar/cv-status-bar.vue → ui-uni/uni-nav-bar/uni-status-bar.vue} +0 -0
  71. package/ui-uni/uni-notice-bar/uni-notice-bar.vue +394 -0
  72. package/ui-uni/uni-number-box/uni-number-box.vue +224 -0
  73. package/ui-uni/uni-pagination/uni-pagination.vue +376 -0
  74. package/{ui-cv/cv-popup → ui-uni/uni-popup}/keypress.js +0 -0
  75. package/{ui-cv/cv-popup → ui-uni/uni-popup}/popup.js +0 -0
  76. package/ui-uni/uni-popup/uni-popup.vue +412 -0
  77. package/{ui-cv/cv-popup-dialog → ui-uni/uni-popup-dialog}/keypress.js +0 -0
  78. package/{ui-cv/cv-popup-dialog/cv-popup-dialog.vue → ui-uni/uni-popup-dialog/uni-popup-dialog.vue} +0 -0
  79. package/ui-uni/uni-popup-message/uni-popup-message.vue +143 -0
  80. package/{ui-cv/cv-popup-share/cv-popup-share.vue → ui-uni/uni-popup-share/uni-popup-share.vue} +0 -0
  81. package/ui-uni/uni-rate/uni-rate.vue +357 -0
  82. package/ui-uni/uni-row/uni-row.vue +155 -0
  83. package/ui-uni/uni-search-bar/uni-search-bar.vue +262 -0
  84. package/{ui-cv/cv-section/cv-section.vue → ui-uni/uni-section/uni-section.vue} +0 -0
  85. package/{ui-cv/cv-segmented-control/cv-segmented-control.vue → ui-uni/uni-segmented-control/uni-segmented-control.vue} +0 -0
  86. package/{ui-cv/cv-status-bar/cv-status-bar.vue → ui-uni/uni-status-bar/uni-status-bar.vue} +0 -0
  87. package/ui-uni/uni-steps/uni-steps.vue +250 -0
  88. package/{ui-cv/cv-swipe-action/cv-swipe-action.vue → ui-uni/uni-swipe-action/uni-swipe-action.vue} +0 -0
  89. package/{ui-cv/cv-swipe-action-item → ui-uni/uni-swipe-action-item}/bindingx.js +0 -0
  90. package/{ui-cv/cv-swipe-action-item → ui-uni/uni-swipe-action-item}/index.wxs +0 -0
  91. package/{ui-cv/cv-swipe-action-item → ui-uni/uni-swipe-action-item}/isPC.js +0 -0
  92. package/{ui-cv/cv-swipe-action-item → ui-uni/uni-swipe-action-item}/mpalipay.js +0 -0
  93. package/{ui-cv/cv-swipe-action-item → ui-uni/uni-swipe-action-item}/mpother.js +0 -0
  94. package/{ui-cv/cv-swipe-action-item → ui-uni/uni-swipe-action-item}/mpwxs.js +0 -0
  95. package/{ui-cv/cv-swipe-action-item/cv-swipe-action-item.vue → ui-uni/uni-swipe-action-item/uni-swipe-action-item.vue} +0 -0
  96. package/ui-uni/uni-swiper-dot/uni-swiper-dot.vue +205 -0
  97. package/ui-uni/uni-table/uni-table.vue +455 -0
  98. package/ui-uni/uni-tag/uni-tag.vue +283 -0
  99. package/ui-uni/uni-tbody/uni-tbody.vue +30 -0
  100. package/ui-uni/uni-td/uni-td.vue +88 -0
  101. package/{ui-cv/cv-test/cv-test.vue → ui-uni/uni-test/uni-test.vue} +0 -0
  102. package/{ui-cv/cv-th → ui-uni/uni-th}/filter-dropdown.vue +0 -0
  103. package/ui-uni/uni-th/uni-th.vue +259 -0
  104. package/ui-uni/uni-thead/uni-thead.vue +114 -0
  105. package/ui-uni/uni-title/uni-title.vue +171 -0
  106. package/{ui-cv/cv-tr → ui-uni/uni-tr}/table-checkbox.vue +0 -0
  107. package/ui-uni/uni-tr/uni-tr.vue +156 -0
  108. package/{ui-cv/cv-transition → ui-uni/uni-transition}/createAnimation.js +0 -0
  109. package/ui-uni/uni-transition/uni-transition.vue +287 -0
  110. package/ui-cv/cv-badge/cv-badge.vue +0 -249
  111. package/ui-cv/cv-calendar/calendar.js +0 -963
  112. package/ui-cv/cv-calendar/cv-calendar-item.vue +0 -198
  113. package/ui-cv/cv-calendar/cv-calendar.vue +0 -508
  114. package/ui-cv/cv-card/cv-card.vue +0 -427
  115. package/ui-cv/cv-col/cv-col.vue +0 -2965
  116. package/ui-cv/cv-collapse/cv-collapse.vue +0 -146
  117. package/ui-cv/cv-collapse-item/cv-collapse-item.vue +0 -395
  118. package/ui-cv/cv-combox/cv-combox.vue +0 -250
  119. package/ui-cv/cv-countdown/cv-countdown.vue +0 -245
  120. package/ui-cv/cv-data-checkbox/cv-data-checkbox.vue +0 -841
  121. package/ui-cv/cv-data-indexed-list/cv-data-indexed-list-item.vue +0 -154
  122. package/ui-cv/cv-data-indexed-list/cv-data-indexed-list.vue +0 -376
  123. package/ui-cv/cv-data-picker/cv-data-picker.vue +0 -486
  124. package/ui-cv/cv-data-pickerview/cv-data-pickerview.vue +0 -304
  125. package/ui-cv/cv-dateformat/cv-dateformat.vue +0 -86
  126. package/ui-cv/cv-datetime-picker/calendar.vue +0 -761
  127. package/ui-cv/cv-datetime-picker/cv-datetime-picker.vue +0 -958
  128. package/ui-cv/cv-datetime-picker/time-picker.vue +0 -907
  129. package/ui-cv/cv-drawer/cv-drawer.vue +0 -185
  130. package/ui-cv/cv-drawer/keypress.js +0 -45
  131. package/ui-cv/cv-easyinput/cv-easyinput.vue +0 -514
  132. package/ui-cv/cv-fab/cv-fab.vue +0 -465
  133. package/ui-cv/cv-fav/cv-fav.vue +0 -150
  134. package/ui-cv/cv-file-picker/cv-file-picker.vue +0 -619
  135. package/ui-cv/cv-form-base/cv-form-base.vue +0 -470
  136. package/ui-cv/cv-form-base/validate.js +0 -477
  137. package/ui-cv/cv-grid-group/cv-grid-group.vue +0 -148
  138. package/ui-cv/cv-grid-item/cv-grid-item.vue +0 -132
  139. package/ui-cv/cv-icon2/cv-icon2.vue +0 -78
  140. package/ui-cv/cv-icon2/icons.js +0 -132
  141. package/ui-cv/cv-indexed-list/cv-indexed-list-item.vue +0 -154
  142. package/ui-cv/cv-indexed-list/cv-indexed-list.vue +0 -371
  143. package/ui-cv/cv-link2/cv-link2.vue +0 -130
  144. package/ui-cv/cv-list/cv-list.vue +0 -107
  145. package/ui-cv/cv-list/cv-refresh.vue +0 -65
  146. package/ui-cv/cv-list-ad/cv-list-ad.vue +0 -113
  147. package/ui-cv/cv-list-item/cv-list-item.vue +0 -449
  148. package/ui-cv/cv-nav-bar/cv-nav-bar.vue +0 -256
  149. package/ui-cv/cv-notice-bar/cv-notice-bar.vue +0 -453
  150. package/ui-cv/cv-number-box/cv-number-box.vue +0 -223
  151. package/ui-cv/cv-pagination/cv-pagination.vue +0 -397
  152. package/ui-cv/cv-popup/cv-popup.vue +0 -429
  153. package/ui-cv/cv-popup-message/cv-popup-message.vue +0 -143
  154. package/ui-cv/cv-row/cv-row.vue +0 -157
  155. package/ui-cv/cv-search-bar/cv-search-bar.vue +0 -280
  156. package/ui-cv/cv-steps/cv-steps.vue +0 -293
  157. package/ui-cv/cv-swiper-dot/cv-swiper-dot.vue +0 -255
  158. package/ui-cv/cv-table/cv-table.vue +0 -460
  159. package/ui-cv/cv-tag/cv-tag.vue +0 -276
  160. package/ui-cv/cv-tbody/cv-tbody.vue +0 -28
  161. package/ui-cv/cv-td/cv-td.vue +0 -93
  162. package/ui-cv/cv-th/cv-th.vue +0 -270
  163. package/ui-cv/cv-thead/cv-thead.vue +0 -114
  164. package/ui-cv/cv-title/cv-title.vue +0 -168
  165. package/ui-cv/cv-tr/cv-tr.vue +0 -166
  166. package/ui-cv/cv-transition/cv-transition.vue +0 -279
@@ -0,0 +1,237 @@
1
+ <template>
2
+ <view class="uni-combox">
3
+ <view v-if="label" class="uni-combox__label" :style="labelStyle">
4
+ <text>{{label}}</text>
5
+ </view>
6
+ <view class="uni-combox__input-box">
7
+ <input class="uni-combox__input" type="text" :placeholder="placeholder" v-model="inputVal" @input="onInput" @focus="onFocus" @blur="onBlur" />
8
+ <uni-icons class="uni-combox__input-arrow" type="arrowdown" size="14" @click="toggleSelector"></uni-icons>
9
+ <view class="uni-combox__selector" v-if="showSelector">
10
+ <scroll-view scroll-y="true" class="uni-combox__selector-scroll">
11
+ <view class="uni-combox__selector-empty" v-if="filterCandidatesLength === 0">
12
+ <text>{{emptyTips}}</text>
13
+ </view>
14
+ <view class="uni-combox__selector-item" v-for="(item,index) in filterCandidates" :key="index" @click="onSelectorClick(index)">
15
+ <text>{{item}}</text>
16
+ </view>
17
+ </scroll-view>
18
+ </view>
19
+ </view>
20
+ </view>
21
+ </template>
22
+
23
+ <script>
24
+ /**
25
+ * Combox 组合输入框
26
+ * @description 组合输入框一般用于既可以输入也可以选择的场景
27
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=1261
28
+ * @property {String} label 左侧文字
29
+ * @property {String} labelWidth 左侧内容宽度
30
+ * @property {String} placeholder 输入框占位符
31
+ * @property {Array} candidates 候选项列表
32
+ * @property {String} emptyTips 筛选结果为空时显示的文字
33
+ * @property {String} value 组合框的值
34
+ */
35
+ export default {
36
+ name: 'uniCombox',
37
+ emits: ['input', 'update:modelValue'],
38
+ props: {
39
+ label: {
40
+ type: String,
41
+ default: ''
42
+ },
43
+ labelWidth: {
44
+ type: String,
45
+ default: 'auto'
46
+ },
47
+ placeholder: {
48
+ type: String,
49
+ default: ''
50
+ },
51
+ candidates: {
52
+ type: Array,
53
+ default () {
54
+ return []
55
+ }
56
+ },
57
+ emptyTips: {
58
+ type: String,
59
+ default: '无匹配项'
60
+ },
61
+ // #ifndef VUE3
62
+ value: {
63
+ type: [String, Number],
64
+ default: ''
65
+ },
66
+ // #endif
67
+ // #ifdef VUE3
68
+ modelValue: {
69
+ type: [String, Number],
70
+ default: ''
71
+ },
72
+ // #endif
73
+ },
74
+ data() {
75
+ return {
76
+ showSelector: false,
77
+ inputVal: ''
78
+ }
79
+ },
80
+ computed: {
81
+ labelStyle() {
82
+ if (this.labelWidth === 'auto') {
83
+ return {}
84
+ }
85
+ return {
86
+ width: this.labelWidth
87
+ }
88
+ },
89
+ filterCandidates() {
90
+ return this.candidates.filter((item) => {
91
+ return item.toString().indexOf(this.inputVal) > -1
92
+ })
93
+ },
94
+ filterCandidatesLength() {
95
+ return this.filterCandidates.length
96
+ }
97
+ },
98
+ watch: {
99
+ // #ifndef VUE3
100
+ value: {
101
+ handler(newVal) {
102
+ this.inputVal = newVal
103
+ },
104
+ immediate: true
105
+ },
106
+ // #endif
107
+ // #ifdef VUE3
108
+ modelValue: {
109
+ handler(newVal) {
110
+ this.inputVal = newVal
111
+ },
112
+ immediate: true
113
+ },
114
+ // #endif
115
+ },
116
+ methods: {
117
+ toggleSelector() {
118
+ this.showSelector = !this.showSelector
119
+ },
120
+ onFocus() {
121
+ this.showSelector = true
122
+ },
123
+ onBlur() {
124
+ setTimeout(() => {
125
+ this.showSelector = false
126
+ }, 153)
127
+ },
128
+ onSelectorClick(index) {
129
+ this.inputVal = this.filterCandidates[index]
130
+ this.showSelector = false
131
+ this.$emit('input', this.inputVal)
132
+ this.$emit('update:modelValue', this.inputVal)
133
+ },
134
+ onInput() {
135
+ setTimeout(() => {
136
+ this.$emit('input', this.inputVal)
137
+ this.$emit('update:modelValue', this.inputVal)
138
+ })
139
+ }
140
+ }
141
+ }
142
+ </script>
143
+
144
+ <style scoped>
145
+ .uni-combox {
146
+ /* #ifndef APP-NVUE */
147
+ display: flex;
148
+ /* #endif */
149
+ height: 40px;
150
+ flex-direction: row;
151
+ align-items: center;
152
+ }
153
+
154
+ .uni-combox__label {
155
+ font-size: 16px;
156
+ line-height: 22px;
157
+ padding-right: 10px;
158
+ color: #999999;
159
+ }
160
+
161
+ .uni-combox__input-box {
162
+ position: relative;
163
+ /* #ifndef APP-NVUE */
164
+ display: flex;
165
+ /* #endif */
166
+ flex: 1;
167
+ flex-direction: row;
168
+ align-items: center;
169
+ }
170
+
171
+ .uni-combox__input {
172
+ flex: 1;
173
+ font-size: 16px;
174
+ height: 22px;
175
+ line-height: 22px;
176
+ }
177
+
178
+ .uni-combox__input-arrow {
179
+ padding: 10px;
180
+ }
181
+
182
+ .uni-combox__selector {
183
+ /* #ifndef APP-NVUE */
184
+ box-sizing: border-box;
185
+ /* #endif */
186
+ position: absolute;
187
+ top: 42px;
188
+ left: 0;
189
+ width: 100%;
190
+ background-color: #FFFFFF;
191
+ border-radius: 6px;
192
+ box-shadow: #DDDDDD 4px 4px 8px, #DDDDDD -4px -4px 8px;
193
+ z-index: 2;
194
+ }
195
+
196
+ .uni-combox__selector-scroll {
197
+ /* #ifndef APP-NVUE */
198
+ max-height: 200px;
199
+ box-sizing: border-box;
200
+ /* #endif */
201
+ }
202
+
203
+ .uni-combox__selector::before {
204
+ /* #ifndef APP-NVUE */
205
+ content: "";
206
+ /* #endif */
207
+ position: absolute;
208
+ width: 0;
209
+ height: 0;
210
+ border-bottom: solid 6px #FFFFFF;
211
+ border-right: solid 6px transparent;
212
+ border-left: solid 6px transparent;
213
+ left: 50%;
214
+ top: -6px;
215
+ margin-left: -6px;
216
+ }
217
+
218
+ .uni-combox__selector-empty,
219
+ .uni-combox__selector-item {
220
+ /* #ifndef APP-NVUE */
221
+ display: flex;
222
+ cursor: pointer;
223
+ /* #endif */
224
+ line-height: 36px;
225
+ font-size: 14px;
226
+ text-align: center;
227
+ border-bottom: solid 1px #DDDDDD;
228
+ margin: 0px 10px;
229
+ }
230
+
231
+ .uni-combox__selector-empty:last-child,
232
+ .uni-combox__selector-item:last-child {
233
+ /* #ifndef APP-NVUE */
234
+ border-bottom: none;
235
+ /* #endif */
236
+ }
237
+ </style>
@@ -0,0 +1,234 @@
1
+ <template>
2
+ <view class="uni-countdown">
3
+ <text v-if="showDay" :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ d }}</text>
4
+ <text v-if="showDay" :style="{ color: splitorColor }" class="uni-countdown__splitor">天</text>
5
+ <text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ h }}</text>
6
+ <text :style="{ color: splitorColor }" class="uni-countdown__splitor">{{ showColon ? ':' : '时' }}</text>
7
+ <text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ i }}</text>
8
+ <text :style="{ color: splitorColor }" class="uni-countdown__splitor">{{ showColon ? ':' : '分' }}</text>
9
+ <text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ s }}</text>
10
+ <text v-if="!showColon" :style="{ color: splitorColor }" class="uni-countdown__splitor">秒</text>
11
+ </view>
12
+ </template>
13
+ <script>
14
+ /**
15
+ * Countdown 倒计时
16
+ * @description 倒计时组件
17
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=25
18
+ * @property {String} backgroundColor 背景色
19
+ * @property {String} color 文字颜色
20
+ * @property {Number} day 天数
21
+ * @property {Number} hour 小时
22
+ * @property {Number} minute 分钟
23
+ * @property {Number} second 秒
24
+ * @property {Number} timestamp 时间戳
25
+ * @property {Boolean} showDay = [true|false] 是否显示天数
26
+ * @property {Boolean} showColon = [true|false] 是否以冒号为分隔符
27
+ * @property {String} splitorColor 分割符号颜色
28
+ * @event {Function} timeup 倒计时时间到触发事件
29
+ * @example <uni-countdown :day="1" :hour="1" :minute="12" :second="40"></uni-countdown>
30
+ */
31
+ export default {
32
+ name: 'UniCountdown',
33
+ emits: ['timeup'],
34
+ props: {
35
+ showDay: {
36
+ type: Boolean,
37
+ default: true
38
+ },
39
+ showColon: {
40
+ type: Boolean,
41
+ default: true
42
+ },
43
+ start: {
44
+ type: Boolean,
45
+ default: true
46
+ },
47
+ backgroundColor: {
48
+ type: String,
49
+ default: '#FFFFFF'
50
+ },
51
+ borderColor: {
52
+ type: String,
53
+ default: '#000000'
54
+ },
55
+ color: {
56
+ type: String,
57
+ default: '#000000'
58
+ },
59
+ splitorColor: {
60
+ type: String,
61
+ default: '#000000'
62
+ },
63
+ day: {
64
+ type: Number,
65
+ default: 0
66
+ },
67
+ hour: {
68
+ type: Number,
69
+ default: 0
70
+ },
71
+ minute: {
72
+ type: Number,
73
+ default: 0
74
+ },
75
+ second: {
76
+ type: Number,
77
+ default: 0
78
+ },
79
+ timestamp: {
80
+ type: Number,
81
+ default: 0
82
+ }
83
+ },
84
+ data() {
85
+ return {
86
+ timer: null,
87
+ syncFlag: false,
88
+ d: '00',
89
+ h: '00',
90
+ i: '00',
91
+ s: '00',
92
+ leftTime: 0,
93
+ seconds: 0
94
+ }
95
+ },
96
+ watch: {
97
+ day(val) {
98
+ this.changeFlag()
99
+ },
100
+ hour(val) {
101
+ this.changeFlag()
102
+ },
103
+ minute(val) {
104
+ this.changeFlag()
105
+ },
106
+ second(val) {
107
+ this.changeFlag()
108
+ },
109
+ start: {
110
+ immediate: true,
111
+ handler(newVal, oldVal) {
112
+ if (newVal) {
113
+ this.startData();
114
+ } else {
115
+ if (!oldVal) return
116
+ clearInterval(this.timer)
117
+ }
118
+ }
119
+
120
+ }
121
+ },
122
+ created: function(e) {
123
+ this.seconds = this.toSeconds(this.timestamp, this.day, this.hour, this.minute, this.second)
124
+ this.countDown()
125
+ },
126
+ // #ifndef VUE3
127
+ destroyed() {
128
+ clearInterval(this.timer)
129
+ },
130
+ // #endif
131
+ // #ifdef VUE3
132
+ unmounted() {
133
+ clearInterval(this.timer)
134
+ },
135
+ // #endif
136
+ methods: {
137
+ toSeconds(timestamp, day, hours, minutes, seconds) {
138
+ if (timestamp) {
139
+ return timestamp - parseInt(new Date().getTime() / 1000, 10)
140
+ }
141
+ return day * 60 * 60 * 24 + hours * 60 * 60 + minutes * 60 + seconds
142
+ },
143
+ timeUp() {
144
+ clearInterval(this.timer)
145
+ this.$emit('timeup')
146
+ },
147
+ countDown() {
148
+ let seconds = this.seconds
149
+ let [day, hour, minute, second] = [0, 0, 0, 0]
150
+ if (seconds > 0) {
151
+ day = Math.floor(seconds / (60 * 60 * 24))
152
+ hour = Math.floor(seconds / (60 * 60)) - (day * 24)
153
+ minute = Math.floor(seconds / 60) - (day * 24 * 60) - (hour * 60)
154
+ second = Math.floor(seconds) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60)
155
+ } else {
156
+ this.timeUp()
157
+ }
158
+ if (day < 10) {
159
+ day = '0' + day
160
+ }
161
+ if (hour < 10) {
162
+ hour = '0' + hour
163
+ }
164
+ if (minute < 10) {
165
+ minute = '0' + minute
166
+ }
167
+ if (second < 10) {
168
+ second = '0' + second
169
+ }
170
+ this.d = day
171
+ this.h = hour
172
+ this.i = minute
173
+ this.s = second
174
+ },
175
+ startData() {
176
+ this.seconds = this.toSeconds(this.timestamp, this.day, this.hour, this.minute, this.second)
177
+ if (this.seconds <= 0) {
178
+ return
179
+ }
180
+ clearInterval(this.timer)
181
+ this.countDown()
182
+ this.timer = setInterval(() => {
183
+ this.seconds--
184
+ if (this.seconds < 0) {
185
+ this.timeUp()
186
+ return
187
+ }
188
+ this.countDown()
189
+ }, 1000)
190
+ },
191
+ changeFlag() {
192
+ if (!this.syncFlag) {
193
+ this.seconds = this.toSeconds(this.timestamp, this.day, this.hour, this.minute, this.second)
194
+ this.startData();
195
+ this.syncFlag = true;
196
+ }
197
+ }
198
+ }
199
+ }
200
+ </script>
201
+ <style scoped>
202
+ .uni-countdown {
203
+ /* #ifndef APP-NVUE */
204
+ display: flex;
205
+ /* #endif */
206
+ flex-direction: row;
207
+ justify-content: flex-start;
208
+ padding: 2rpx 0;
209
+ }
210
+
211
+ .uni-countdown__splitor {
212
+ /* #ifndef APP-NVUE */
213
+ display: flex;
214
+ /* #endif */
215
+ justify-content: center;
216
+ line-height: 48rpx;
217
+ padding: 5rpx;
218
+ font-size: 12px;
219
+ }
220
+
221
+ .uni-countdown__number {
222
+ /* #ifndef APP-NVUE */
223
+ display: flex;
224
+ /* #endif */
225
+ justify-content: center;
226
+ align-items: center;
227
+ width: 52rpx;
228
+ height: 48rpx;
229
+ line-height: 48rpx;
230
+ margin: 5rpx;
231
+ text-align: center;
232
+ font-size: 12px;
233
+ }
234
+ </style>