uview-pro 0.2.4 → 0.3.1

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 (249) hide show
  1. package/changelog.md +584 -545
  2. package/components/common/props.ts +22 -22
  3. package/components/u-action-sheet/types.ts +37 -35
  4. package/components/u-action-sheet/u-action-sheet.vue +178 -167
  5. package/components/u-alert-tips/types.ts +41 -39
  6. package/components/u-alert-tips/u-alert-tips.vue +238 -223
  7. package/components/u-avatar/types.ts +36 -34
  8. package/components/u-avatar/u-avatar.vue +217 -207
  9. package/components/u-avatar-cropper/types.ts +23 -23
  10. package/components/u-avatar-cropper/u-avatar-cropper.vue +297 -286
  11. package/components/u-avatar-cropper/weCropper.d.ts +62 -62
  12. package/components/u-avatar-cropper/weCropper.js +1281 -1281
  13. package/components/u-avatar-cropper/weCropper.ts +1276 -1276
  14. package/components/u-back-top/types.ts +36 -39
  15. package/components/u-back-top/u-back-top.vue +140 -128
  16. package/components/u-badge/types.ts +38 -36
  17. package/components/u-badge/u-badge.vue +183 -165
  18. package/components/u-button/types.ts +66 -66
  19. package/components/u-button/u-button.vue +579 -566
  20. package/components/u-calendar/types.ts +75 -75
  21. package/components/u-calendar/u-calendar.vue +793 -793
  22. package/components/u-car-keyboard/types.ts +14 -12
  23. package/components/u-car-keyboard/u-car-keyboard.vue +262 -253
  24. package/components/u-card/types.ts +61 -59
  25. package/components/u-card/u-card.vue +209 -194
  26. package/components/u-cell-group/types.ts +19 -17
  27. package/components/u-cell-group/u-cell-group.vue +60 -50
  28. package/components/u-cell-item/types.ts +56 -54
  29. package/components/u-cell-item/u-cell-item.vue +226 -213
  30. package/components/u-checkbox/types.ts +33 -31
  31. package/components/u-checkbox/u-checkbox.vue +282 -283
  32. package/components/u-checkbox-group/types.ts +34 -32
  33. package/components/u-checkbox-group/u-checkbox-group.vue +130 -130
  34. package/components/u-circle-progress/types.ts +54 -52
  35. package/components/u-circle-progress/u-circle-progress.vue +206 -191
  36. package/components/u-city-select/types.ts +22 -20
  37. package/components/u-city-select/u-city-select.vue +276 -264
  38. package/components/u-col/types.ts +32 -30
  39. package/components/u-col/u-col.vue +142 -123
  40. package/components/u-collapse/types.ts +33 -33
  41. package/components/u-collapse/u-collapse.vue +190 -186
  42. package/components/u-collapse-item/types.ts +27 -27
  43. package/components/u-collapse-item/u-collapse-item.vue +290 -285
  44. package/components/u-column-notice/types.ts +50 -48
  45. package/components/u-column-notice/u-column-notice.vue +222 -210
  46. package/components/u-count-down/types.ts +44 -42
  47. package/components/u-count-down/u-count-down.vue +286 -274
  48. package/components/u-count-to/types.ts +34 -32
  49. package/components/u-count-to/u-count-to.vue +266 -248
  50. package/components/u-divider/types.ts +33 -31
  51. package/components/u-divider/u-divider.vue +145 -129
  52. package/components/u-dropdown/types.ts +34 -32
  53. package/components/u-dropdown/u-dropdown.vue +330 -302
  54. package/components/u-dropdown-item/types.ts +29 -27
  55. package/components/u-dropdown-item/u-dropdown-item.vue +120 -128
  56. package/components/u-empty/types.ts +38 -36
  57. package/components/u-empty/u-empty.vue +103 -88
  58. package/components/u-field/types.ts +71 -69
  59. package/components/u-field/u-field.vue +388 -373
  60. package/components/u-form/types.ts +29 -27
  61. package/components/u-form/u-form.vue +130 -136
  62. package/components/u-form-item/types.ts +72 -70
  63. package/components/u-form-item/u-form-item.vue +447 -447
  64. package/components/u-full-screen/types.ts +16 -14
  65. package/components/u-full-screen/u-full-screen.vue +103 -89
  66. package/components/u-gap/types.ts +20 -18
  67. package/components/u-gap/u-gap.vue +50 -40
  68. package/components/u-grid/types.ts +21 -19
  69. package/components/u-grid/u-grid.vue +91 -93
  70. package/components/u-grid-item/types.ts +16 -16
  71. package/components/u-grid-item/u-grid-item.vue +130 -134
  72. package/components/u-icon/types.ts +61 -62
  73. package/components/u-icon/u-icon.vue +296 -294
  74. package/components/u-image/types.ts +51 -51
  75. package/components/u-image/u-image.vue +239 -230
  76. package/components/u-index-anchor/types.ts +16 -16
  77. package/components/u-index-anchor/u-index-anchor.vue +94 -86
  78. package/components/u-index-list/types.ts +43 -43
  79. package/components/u-index-list/u-index-list.vue +352 -355
  80. package/components/u-input/types.ts +137 -140
  81. package/components/u-input/u-input.vue +288 -279
  82. package/components/u-keyboard/types.ts +40 -40
  83. package/components/u-keyboard/u-keyboard.vue +178 -169
  84. package/components/u-lazy-load/types.ts +37 -37
  85. package/components/u-lazy-load/u-lazy-load.vue +246 -235
  86. package/components/u-line/types.ts +44 -44
  87. package/components/u-line/u-line.vue +68 -59
  88. package/components/u-line-progress/types.ts +58 -58
  89. package/components/u-line-progress/u-line-progress.vue +126 -117
  90. package/components/u-link/types.ts +43 -43
  91. package/components/u-link/u-link.vue +84 -75
  92. package/components/u-loading/types.ts +35 -35
  93. package/components/u-loading/u-loading.vue +105 -96
  94. package/components/u-loading-popup/types.ts +26 -26
  95. package/components/u-loading-popup/u-loading-popup.vue +253 -239
  96. package/components/u-loadmore/types.ts +79 -79
  97. package/components/u-loadmore/u-loadmore.vue +156 -145
  98. package/components/u-mask/types.ts +40 -43
  99. package/components/u-mask/u-mask.vue +113 -106
  100. package/components/u-message-input/types.ts +74 -74
  101. package/components/u-message-input/u-message-input.vue +281 -270
  102. package/components/u-modal/types.ts +118 -118
  103. package/components/u-modal/u-modal.vue +220 -211
  104. package/components/u-navbar/types.ts +103 -103
  105. package/components/u-navbar/u-navbar.vue +251 -240
  106. package/components/u-no-network/image.ts +2 -2
  107. package/components/u-no-network/types.ts +28 -28
  108. package/components/u-no-network/u-no-network.vue +303 -292
  109. package/components/u-notice-bar/types.ts +111 -111
  110. package/components/u-notice-bar/u-notice-bar.vue +189 -179
  111. package/components/u-number-box/types.ts +42 -42
  112. package/components/u-number-box/u-number-box.vue +321 -312
  113. package/components/u-number-keyboard/types.ts +26 -26
  114. package/components/u-number-keyboard/u-number-keyboard.vue +188 -179
  115. package/components/u-picker/types.ts +123 -123
  116. package/components/u-picker/u-picker.vue +685 -676
  117. package/components/u-popup/types.ts +59 -59
  118. package/components/u-popup/u-popup.vue +385 -375
  119. package/components/u-radio/types.ts +27 -25
  120. package/components/u-radio/u-radio.vue +279 -272
  121. package/components/u-radio-group/types.ts +31 -29
  122. package/components/u-radio-group/u-radio-group.vue +96 -108
  123. package/components/u-rate/types.ts +42 -40
  124. package/components/u-rate/u-rate.vue +249 -234
  125. package/components/u-read-more/types.ts +37 -35
  126. package/components/u-read-more/u-read-more.vue +172 -156
  127. package/components/u-root-portal/u-root-portal.vue +56 -54
  128. package/components/u-row/types.ts +22 -20
  129. package/components/u-row/u-row.vue +105 -87
  130. package/components/u-row-notice/types.ts +41 -39
  131. package/components/u-row-notice/u-row-notice.vue +256 -244
  132. package/components/u-safe-bottom/u-safe-bottom.vue +57 -46
  133. package/components/u-search/types.ts +55 -53
  134. package/components/u-search/u-search.vue +279 -268
  135. package/components/u-section/types.ts +34 -32
  136. package/components/u-section/u-section.vue +150 -131
  137. package/components/u-select/types.ts +45 -43
  138. package/components/u-select/u-select.vue +388 -378
  139. package/components/u-skeleton/types.ts +22 -20
  140. package/components/u-skeleton/u-skeleton.vue +231 -220
  141. package/components/u-slider/types.ts +34 -32
  142. package/components/u-slider/u-slider.vue +255 -247
  143. package/components/u-status-bar/u-status-bar.vue +74 -65
  144. package/components/u-steps/types.ts +30 -28
  145. package/components/u-steps/u-steps.vue +181 -169
  146. package/components/u-sticky/types.ts +24 -22
  147. package/components/u-sticky/u-sticky.vue +178 -162
  148. package/components/u-subsection/types.ts +38 -36
  149. package/components/u-subsection/u-subsection.vue +339 -328
  150. package/components/u-swipe-action/types.ts +52 -50
  151. package/components/u-swipe-action/u-swipe-action.vue +276 -260
  152. package/components/u-swiper/types.ts +49 -47
  153. package/components/u-swiper/u-swiper.vue +308 -291
  154. package/components/u-switch/types.ts +30 -28
  155. package/components/u-switch/u-switch.vue +150 -141
  156. package/components/u-tabbar/types.ts +38 -36
  157. package/components/u-tabbar/u-tabbar.vue +315 -298
  158. package/components/u-table/types.ts +27 -25
  159. package/components/u-table/u-table.vue +67 -55
  160. package/components/u-tabs/types.ts +53 -51
  161. package/components/u-tabs/u-tabs.vue +302 -291
  162. package/components/u-tabs-swiper/types.ts +55 -53
  163. package/components/u-tabs-swiper/u-tabs-swiper.vue +409 -397
  164. package/components/u-tag/types.ts +39 -37
  165. package/components/u-tag/u-tag.vue +268 -252
  166. package/components/u-td/types.ts +14 -12
  167. package/components/u-td/u-td.vue +98 -87
  168. package/components/u-text/types.ts +72 -72
  169. package/components/u-text/u-text.vue +343 -341
  170. package/components/u-th/types.ts +14 -12
  171. package/components/u-th/u-th.vue +92 -81
  172. package/components/u-time-line/u-time-line.vue +53 -39
  173. package/components/u-time-line-item/types.ts +16 -14
  174. package/components/u-time-line-item/u-time-line-item.vue +90 -78
  175. package/components/u-toast/types.ts +38 -36
  176. package/components/u-toast/u-toast.vue +240 -233
  177. package/components/u-top-tips/types.ts +16 -14
  178. package/components/u-top-tips/u-top-tips.vue +130 -113
  179. package/components/u-tr/types.ts +11 -8
  180. package/components/u-tr/u-tr.vue +39 -24
  181. package/components/u-upload/types.ts +82 -80
  182. package/components/u-upload/u-upload.vue +568 -559
  183. package/components/u-verification-code/types.ts +24 -22
  184. package/components/u-verification-code/u-verification-code.vue +176 -164
  185. package/components/u-waterfall/types.ts +18 -16
  186. package/components/u-waterfall/u-waterfall.vue +187 -175
  187. package/iconfont.css +913 -913
  188. package/index.scss +25 -25
  189. package/index.ts +38 -38
  190. package/libs/config/config.ts +26 -26
  191. package/libs/config/zIndex.ts +37 -37
  192. package/libs/css/color.scss +155 -155
  193. package/libs/css/common.scss +178 -178
  194. package/libs/css/style.components.scss +16 -16
  195. package/libs/css/style.h5.scss +8 -8
  196. package/libs/css/style.mp.scss +72 -72
  197. package/libs/css/style.nvue.scss +15 -15
  198. package/libs/css/style.vue.scss +188 -188
  199. package/libs/function/$parent.ts +24 -24
  200. package/libs/function/addUnit.ts +13 -13
  201. package/libs/function/color.ts +37 -37
  202. package/libs/function/colorGradient.ts +139 -139
  203. package/libs/function/debounce.ts +28 -28
  204. package/libs/function/deepClone.ts +39 -39
  205. package/libs/function/deepMerge.ts +35 -35
  206. package/libs/function/getParent.ts +63 -63
  207. package/libs/function/getRect.ts +26 -26
  208. package/libs/function/guid.ts +42 -42
  209. package/libs/function/md5.ts +403 -403
  210. package/libs/function/parent.ts +21 -21
  211. package/libs/function/queryParams.ts +64 -64
  212. package/libs/function/random.ts +16 -16
  213. package/libs/function/randomArray.ts +11 -11
  214. package/libs/function/route.ts +118 -118
  215. package/libs/function/styleUtils.ts +83 -83
  216. package/libs/function/sys.ts +15 -15
  217. package/libs/function/test.ts +289 -289
  218. package/libs/function/throttle.ts +31 -31
  219. package/libs/function/timeFormat.ts +55 -55
  220. package/libs/function/timeFrom.ts +48 -48
  221. package/libs/function/toast.ts +14 -14
  222. package/libs/function/trim.ts +21 -21
  223. package/libs/function/type2icon.ts +39 -39
  224. package/libs/hooks/index.ts +4 -3
  225. package/libs/hooks/useCompRelation.ts +364 -0
  226. package/libs/hooks/useComponent.ts +759 -759
  227. package/libs/hooks/useEmitter.ts +79 -79
  228. package/libs/hooks/useParent.ts +33 -33
  229. package/libs/hooks/useRect.ts +33 -33
  230. package/libs/index.ts +337 -320
  231. package/libs/request/auto-http.ts +76 -76
  232. package/libs/request/index.ts +242 -242
  233. package/libs/store/index.ts +88 -88
  234. package/libs/util/async-validator.d.ts +75 -75
  235. package/libs/util/async-validator.js +1 -1
  236. package/libs/util/calendar.d.ts +57 -57
  237. package/libs/util/emitter.ts +112 -112
  238. package/libs/util/eventBus.ts +86 -86
  239. package/libs/util/logger.ts +364 -364
  240. package/libs/util/mitt.ts +118 -118
  241. package/libs/util/parent.ts +20 -20
  242. package/package.json +4 -4
  243. package/readme.md +241 -241
  244. package/theme.scss +38 -38
  245. package/types/components.d.ts +97 -97
  246. package/types/global.d.ts +331 -331
  247. package/types/ignore-errors.d.ts +30 -30
  248. package/types/index.d.ts +19 -19
  249. package/types/uni-app.d.ts +63 -63
@@ -1,244 +1,256 @@
1
- <template>
2
- <view
3
- v-if="props.show"
4
- class="u-notice-bar"
5
- :style="{ background: computeBgColor, padding: props.padding }"
6
- :class="[props.type ? `u-type-${props.type}-light-bg` : '']"
7
- >
8
- <view class="u-direction-row">
9
- <view class="u-icon-wrap">
10
- <u-icon
11
- class="u-left-icon"
12
- v-if="props.volumeIcon"
13
- name="volume-fill"
14
- :size="props.volumeSize"
15
- :color="computeColor"
16
- ></u-icon>
17
- </view>
18
- <view class="u-notice-box" id="u-notice-box">
19
- <view
20
- class="u-notice-content"
21
- id="u-notice-content"
22
- :style="{ animationDuration: animationDuration, animationPlayState: animationPlayState }"
23
- >
24
- <text class="u-notice-text" @tap="click" :style="textStyle" :class="['u-type-' + props.type]">
25
- {{ showText }}
26
- </text>
27
- </view>
28
- </view>
29
- <view class="u-icon-wrap">
30
- <u-icon
31
- @click="getMore"
32
- class="u-right-icon"
33
- v-if="props.moreIcon"
34
- name="arrow-right"
35
- :size="26"
36
- :color="computeColor"
37
- ></u-icon>
38
- <u-icon
39
- @click="close"
40
- class="u-right-icon"
41
- v-if="props.closeIcon"
42
- name="close"
43
- :size="24"
44
- :color="computeColor"
45
- ></u-icon>
46
- </view>
47
- </view>
48
- </view>
49
- </template>
50
-
51
- <script setup lang="ts">
52
- import { ref, computed, watch, onMounted, nextTick, getCurrentInstance } from 'vue';
53
- import { RowNoticeProps } from './types';
54
-
55
- defineOptions({ name: 'u-row-notice' });
56
-
57
- /**
58
- * u-row-notice 水平滚动通告栏
59
- * @property {Array} list 显示的内容,数组
60
- * @property {String} type 显示的主题,success|error|primary|info|warning|none
61
- * @property {Boolean} volumeIcon 是否显示左侧的音量图标
62
- * @property {Boolean} moreIcon 是否显示右侧的右箭头图标
63
- * @property {Boolean} closeIcon 是否显示右侧的关闭图标
64
- * @property {Boolean} autoplay 是否自动播放
65
- * @property {String} color 文字颜色,各图标也会使用文字颜色
66
- * @property {String} bgColor 背景颜色
67
- * @property {Boolean} show 是否显示
68
- * @property {String|Number} fontSize 字体大小,单位rpx
69
- * @property {String|Number} volumeSize 音量喇叭的大小
70
- * @property {String|Number} speed 水平滚动时的滚动速度,即每秒滚动多少rpx
71
- * @property {String} playState 播放状态,play-播放,paused-暂停
72
- * @property {String|Number} padding 通知的边距
73
- */
74
-
75
- const props = defineProps(RowNoticeProps);
76
-
77
- const emit = defineEmits<{ (e: 'click'): void; (e: 'close'): void; (e: 'getMore'): void }>();
78
- const instance = getCurrentInstance();
79
- const textWidth = ref(0); // 滚动的文字宽度
80
- const animationDuration = ref('10s'); // 动画执行时间
81
- const animationPlayState = ref('paused'); // 动画的开始和结束执行
82
- const showText = ref(''); // 显示的文本
83
-
84
- /**
85
- * 计算字体颜色,如果没有自定义的,就用uview主题颜色
86
- */
87
- const computeColor = computed(() => {
88
- if (props.color) return props.color;
89
- // 如果是无主题,就默认使用content-color
90
- else if (props.type === 'none') return '#606266';
91
- else return props.type;
92
- });
93
-
94
- /**
95
- * 文字内容的样式
96
- */
97
- const textStyle = computed(() => {
98
- const style: Record<string, any> = {};
99
- if (props.color) style.color = props.color;
100
- else if (props.type === 'none') style.color = '#606266';
101
- style.fontSize = props.fontSize + 'rpx';
102
- return style;
103
- });
104
-
105
- /**
106
- * 计算背景颜色
107
- */
108
- const computeBgColor = computed(() => {
109
- if (props.bgColor) return props.bgColor;
110
- else if (props.type === 'none') return 'transparent';
111
- else return '';
112
- });
113
-
114
- /**
115
- * 初始化滚动宽度和动画
116
- */
117
- function initSize() {
118
- nextTick(() => {
119
- uni.createSelectorQuery()
120
- .in(instance?.proxy)
121
- .select('#u-notice-content')
122
- .boundingClientRect()
123
- .exec(ret => {
124
- textWidth.value = ret[0]?.width || 0;
125
- // 根据t=s/v(时间=路程/速度),这里为何不需要加上#u-notice-box的宽度,因为中设置了.u-notice-content样式中设置了padding-left: 100%
126
- // 恰巧计算出来的结果中已经包含了#u-notice-box的宽度
127
- animationDuration.value = `${textWidth.value / uni.upx2px(Number(props.speed))}s`;
128
- // 这里必须这样开始动画,否则在APP上动画速度不会改变(HX版本2.4.6,IOS13)
129
- animationPlayState.value = 'paused';
130
- setTimeout(() => {
131
- if (props.playState === 'play' && props.autoplay) animationPlayState.value = 'running';
132
- }, 10);
133
- });
134
- });
135
- }
136
-
137
- watch(
138
- () => props.list,
139
- val => {
140
- showText.value = val.join('');
141
- initSize();
142
- },
143
- { immediate: true }
144
- );
145
-
146
- watch(
147
- () => props.playState,
148
- val => {
149
- animationPlayState.value = val === 'play' ? 'running' : 'paused';
150
- }
151
- );
152
-
153
- watch(
154
- () => props.speed,
155
- () => {
156
- initSize();
157
- }
158
- );
159
-
160
- onMounted(() => {
161
- initSize();
162
- });
163
-
164
- /**
165
- * 点击通告栏
166
- */
167
- function click() {
168
- emit('click');
169
- }
170
-
171
- /**
172
- * 点击关闭按钮
173
- */
174
- function close() {
175
- emit('close');
176
- }
177
-
178
- /**
179
- * 点击更多箭头按钮
180
- */
181
- function getMore() {
182
- emit('getMore');
183
- }
184
- </script>
185
-
186
- <style lang="scss" scoped>
187
- @import '../../libs/css/style.components.scss';
188
-
189
- .u-notice-bar {
190
- padding: 18rpx 24rpx;
191
- overflow: hidden;
192
- }
193
-
194
- .u-direction-row {
195
- @include vue-flex;
196
- align-items: center;
197
- justify-content: space-between;
198
- }
199
-
200
- .u-left-icon {
201
- /* #ifndef APP-NVUE */
202
- display: inline-flex;
203
- /* #endif */
204
- align-items: center;
205
- }
206
-
207
- .u-notice-box {
208
- flex: 1;
209
- @include vue-flex;
210
- overflow: hidden;
211
- margin-left: 12rpx;
212
- }
213
-
214
- .u-right-icon {
215
- margin-left: 12rpx;
216
- display: inline-flex;
217
- align-items: center;
218
- }
219
-
220
- .u-notice-content {
221
- animation: u-loop-animation 10s linear infinite both;
222
- text-align: right;
223
- // 这一句很重要,为了能让滚动左右连接起来
224
- padding-left: 100%;
225
- @include vue-flex;
226
- flex-wrap: nowrap;
227
- }
228
-
229
- .u-notice-text {
230
- font-size: 26rpx;
231
- word-break: keep-all;
232
- white-space: nowrap;
233
- }
234
-
235
- @keyframes u-loop-animation {
236
- 0% {
237
- transform: translate3d(0, 0, 0);
238
- }
239
-
240
- 100% {
241
- transform: translate3d(-100%, 0, 0);
242
- }
243
- }
244
- </style>
1
+ <template>
2
+ <view
3
+ v-if="props.show"
4
+ class="u-notice-bar"
5
+ :style="$u.toStyle({ background: computeBgColor, padding: props.padding }, customStyle)"
6
+ :class="[props.type ? `u-type-${props.type}-light-bg` : '', customClass]"
7
+ >
8
+ <view class="u-direction-row">
9
+ <view class="u-icon-wrap">
10
+ <u-icon
11
+ class="u-left-icon"
12
+ v-if="props.volumeIcon"
13
+ name="volume-fill"
14
+ :size="props.volumeSize"
15
+ :color="computeColor"
16
+ ></u-icon>
17
+ </view>
18
+ <view class="u-notice-box" id="u-notice-box">
19
+ <view
20
+ class="u-notice-content"
21
+ id="u-notice-content"
22
+ :style="{ animationDuration: animationDuration, animationPlayState: animationPlayState }"
23
+ >
24
+ <text class="u-notice-text" @tap="click" :style="textStyle" :class="['u-type-' + props.type]">
25
+ {{ showText }}
26
+ </text>
27
+ </view>
28
+ </view>
29
+ <view class="u-icon-wrap">
30
+ <u-icon
31
+ @click="getMore"
32
+ class="u-right-icon"
33
+ v-if="props.moreIcon"
34
+ name="arrow-right"
35
+ :size="26"
36
+ :color="computeColor"
37
+ ></u-icon>
38
+ <u-icon
39
+ @click="close"
40
+ class="u-right-icon"
41
+ v-if="props.closeIcon"
42
+ name="close"
43
+ :size="24"
44
+ :color="computeColor"
45
+ ></u-icon>
46
+ </view>
47
+ </view>
48
+ </view>
49
+ </template>
50
+
51
+ <script lang="ts">
52
+ export default {
53
+ name: 'u-row-notice',
54
+ options: {
55
+ addGlobalClass: true,
56
+ // #ifndef MP-TOUTIAO
57
+ virtualHost: true,
58
+ // #endif
59
+ styleIsolation: 'shared'
60
+ }
61
+ };
62
+ </script>
63
+
64
+ <script setup lang="ts">
65
+ import { ref, computed, watch, onMounted, nextTick, getCurrentInstance } from 'vue';
66
+ import { RowNoticeProps } from './types';
67
+ import { $u } from '../..';
68
+
69
+ /**
70
+ * u-row-notice 水平滚动通告栏
71
+ * @property {Array} list 显示的内容,数组
72
+ * @property {String} type 显示的主题,success|error|primary|info|warning|none
73
+ * @property {Boolean} volumeIcon 是否显示左侧的音量图标
74
+ * @property {Boolean} moreIcon 是否显示右侧的右箭头图标
75
+ * @property {Boolean} closeIcon 是否显示右侧的关闭图标
76
+ * @property {Boolean} autoplay 是否自动播放
77
+ * @property {String} color 文字颜色,各图标也会使用文字颜色
78
+ * @property {String} bgColor 背景颜色
79
+ * @property {Boolean} show 是否显示
80
+ * @property {String|Number} fontSize 字体大小,单位rpx
81
+ * @property {String|Number} volumeSize 音量喇叭的大小
82
+ * @property {String|Number} speed 水平滚动时的滚动速度,即每秒滚动多少rpx
83
+ * @property {String} playState 播放状态,play-播放,paused-暂停
84
+ * @property {String|Number} padding 通知的边距
85
+ */
86
+
87
+ const props = defineProps(RowNoticeProps);
88
+
89
+ const emit = defineEmits<{ (e: 'click'): void; (e: 'close'): void; (e: 'getMore'): void }>();
90
+ const instance = getCurrentInstance();
91
+ const textWidth = ref(0); // 滚动的文字宽度
92
+ const animationDuration = ref('10s'); // 动画执行时间
93
+ const animationPlayState = ref('paused'); // 动画的开始和结束执行
94
+ const showText = ref(''); // 显示的文本
95
+
96
+ /**
97
+ * 计算字体颜色,如果没有自定义的,就用uview主题颜色
98
+ */
99
+ const computeColor = computed(() => {
100
+ if (props.color) return props.color;
101
+ // 如果是无主题,就默认使用content-color
102
+ else if (props.type === 'none') return '#606266';
103
+ else return props.type;
104
+ });
105
+
106
+ /**
107
+ * 文字内容的样式
108
+ */
109
+ const textStyle = computed(() => {
110
+ const style: Record<string, any> = {};
111
+ if (props.color) style.color = props.color;
112
+ else if (props.type === 'none') style.color = '#606266';
113
+ style.fontSize = props.fontSize + 'rpx';
114
+ return style;
115
+ });
116
+
117
+ /**
118
+ * 计算背景颜色
119
+ */
120
+ const computeBgColor = computed(() => {
121
+ if (props.bgColor) return props.bgColor;
122
+ else if (props.type === 'none') return 'transparent';
123
+ else return '';
124
+ });
125
+
126
+ /**
127
+ * 初始化滚动宽度和动画
128
+ */
129
+ function initSize() {
130
+ nextTick(() => {
131
+ uni.createSelectorQuery()
132
+ .in(instance?.proxy)
133
+ .select('#u-notice-content')
134
+ .boundingClientRect()
135
+ .exec(ret => {
136
+ textWidth.value = ret[0]?.width || 0;
137
+ // 根据t=s/v(时间=路程/速度),这里为何不需要加上#u-notice-box的宽度,因为中设置了.u-notice-content样式中设置了padding-left: 100%
138
+ // 恰巧计算出来的结果中已经包含了#u-notice-box的宽度
139
+ animationDuration.value = `${textWidth.value / uni.upx2px(Number(props.speed))}s`;
140
+ // 这里必须这样开始动画,否则在APP上动画速度不会改变(HX版本2.4.6IOS13)
141
+ animationPlayState.value = 'paused';
142
+ setTimeout(() => {
143
+ if (props.playState === 'play' && props.autoplay) animationPlayState.value = 'running';
144
+ }, 10);
145
+ });
146
+ });
147
+ }
148
+
149
+ watch(
150
+ () => props.list,
151
+ val => {
152
+ showText.value = val.join(',');
153
+ initSize();
154
+ },
155
+ { immediate: true }
156
+ );
157
+
158
+ watch(
159
+ () => props.playState,
160
+ val => {
161
+ animationPlayState.value = val === 'play' ? 'running' : 'paused';
162
+ }
163
+ );
164
+
165
+ watch(
166
+ () => props.speed,
167
+ () => {
168
+ initSize();
169
+ }
170
+ );
171
+
172
+ onMounted(() => {
173
+ initSize();
174
+ });
175
+
176
+ /**
177
+ * 点击通告栏
178
+ */
179
+ function click() {
180
+ emit('click');
181
+ }
182
+
183
+ /**
184
+ * 点击关闭按钮
185
+ */
186
+ function close() {
187
+ emit('close');
188
+ }
189
+
190
+ /**
191
+ * 点击更多箭头按钮
192
+ */
193
+ function getMore() {
194
+ emit('getMore');
195
+ }
196
+ </script>
197
+
198
+ <style lang="scss" scoped>
199
+ @import '../../libs/css/style.components.scss';
200
+
201
+ .u-notice-bar {
202
+ padding: 18rpx 24rpx;
203
+ overflow: hidden;
204
+ }
205
+
206
+ .u-direction-row {
207
+ @include vue-flex;
208
+ align-items: center;
209
+ justify-content: space-between;
210
+ }
211
+
212
+ .u-left-icon {
213
+ /* #ifndef APP-NVUE */
214
+ display: inline-flex;
215
+ /* #endif */
216
+ align-items: center;
217
+ }
218
+
219
+ .u-notice-box {
220
+ flex: 1;
221
+ @include vue-flex;
222
+ overflow: hidden;
223
+ margin-left: 12rpx;
224
+ }
225
+
226
+ .u-right-icon {
227
+ margin-left: 12rpx;
228
+ display: inline-flex;
229
+ align-items: center;
230
+ }
231
+
232
+ .u-notice-content {
233
+ animation: u-loop-animation 10s linear infinite both;
234
+ text-align: right;
235
+ // 这一句很重要,为了能让滚动左右连接起来
236
+ padding-left: 100%;
237
+ @include vue-flex;
238
+ flex-wrap: nowrap;
239
+ }
240
+
241
+ .u-notice-text {
242
+ font-size: 26rpx;
243
+ word-break: keep-all;
244
+ white-space: nowrap;
245
+ }
246
+
247
+ @keyframes u-loop-animation {
248
+ 0% {
249
+ transform: translate3d(0, 0, 0);
250
+ }
251
+
252
+ 100% {
253
+ transform: translate3d(-100%, 0, 0);
254
+ }
255
+ }
256
+ </style>
@@ -1,46 +1,57 @@
1
- <template>
2
- <view class="u-safe-bottom" :style="style" :class="[!isNVue && 'safe-area-inset-bottom']"></view>
3
- </template>
4
-
5
- <script setup lang="ts">
6
- import { ref, computed, onMounted, withDefaults, type CSSProperties } from 'vue';
7
- import { sys } from '../../libs/function/sys';
8
- import addUnit from '../../libs/function/addUnit';
9
- import deepMerge from '../../libs/function/deepMerge';
10
- import { mergeStyles } from '../../libs/function/styleUtils';
11
-
12
- defineOptions({ name: 'u-safe-bottom' });
13
-
14
- /**
15
- * SafeBottom 底部安全区
16
- * @description 这个适配,主要是针对IPhone X等一些底部带指示条的机型,指示条的操作区域与页面底部存在重合,容易导致用户误操作,因此我们需要针对这些机型进行底部安全区适配。
17
- * @property {String | Object} customStyle 自定义样式
18
- * @example <u-safe-bottom></u-safe-bottom>
19
- */
20
- const props = withDefaults(
21
- defineProps<{
22
- customStyle?: string | CSSProperties;
23
- }>(),
24
- {
25
- customStyle: () => ({})
26
- }
27
- );
28
-
29
- const isNVue = ref(false);
30
-
31
- const style = computed(() => {
32
- let r: CSSProperties = {};
33
- // #ifdef APP-NVUE || MP-TOUTIAO
34
- // nvue下,高度使用js计算填充
35
- r.height = addUnit(sys().safeAreaInsets.bottom, 'px');
36
- // #endif
37
- return deepMerge(r, mergeStyles(props.customStyle));
38
- });
39
-
40
- onMounted(() => {
41
- // #ifdef APP-NVUE
42
- // 标识为是否nvue
43
- isNVue.value = true;
44
- // #endif
45
- });
46
- </script>
1
+ <template>
2
+ <view class="u-safe-bottom" :style="style" :class="[!isNVue && 'safe-area-inset-bottom']"></view>
3
+ </template>
4
+
5
+ <script lang="ts">
6
+ export default {
7
+ name: 'u-safe-bottom',
8
+ options: {
9
+ addGlobalClass: true,
10
+ // #ifndef MP-TOUTIAO
11
+ virtualHost: true,
12
+ // #endif
13
+ styleIsolation: 'shared'
14
+ }
15
+ };
16
+ </script>
17
+
18
+ <script setup lang="ts">
19
+ import { ref, computed, onMounted, withDefaults, type CSSProperties } from 'vue';
20
+ import { sys } from '../../libs/function/sys';
21
+ import addUnit from '../../libs/function/addUnit';
22
+ import deepMerge from '../../libs/function/deepMerge';
23
+ import { mergeStyles } from '../../libs/function/styleUtils';
24
+
25
+ /**
26
+ * SafeBottom 底部安全区
27
+ * @description 这个适配,主要是针对IPhone X等一些底部带指示条的机型,指示条的操作区域与页面底部存在重合,容易导致用户误操作,因此我们需要针对这些机型进行底部安全区适配。
28
+ * @property {String | Object} customStyle 自定义样式
29
+ * @example <u-safe-bottom></u-safe-bottom>
30
+ */
31
+ const props = withDefaults(
32
+ defineProps<{
33
+ customStyle?: string | CSSProperties;
34
+ }>(),
35
+ {
36
+ customStyle: () => ({})
37
+ }
38
+ );
39
+
40
+ const isNVue = ref(false);
41
+
42
+ const style = computed(() => {
43
+ let r: CSSProperties = {};
44
+ // #ifdef APP-NVUE || MP-TOUTIAO
45
+ // nvue下,高度使用js计算填充
46
+ r.height = addUnit(sys().safeAreaInsets.bottom, 'px');
47
+ // #endif
48
+ return deepMerge(r, mergeStyles(props.customStyle));
49
+ });
50
+
51
+ onMounted(() => {
52
+ // #ifdef APP-NVUE
53
+ // 标识为是否nvue
54
+ isNVue.value = true;
55
+ // #endif
56
+ });
57
+ </script>