uview-pro 0.6.18 → 0.6.19

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 (278) hide show
  1. package/changelog.md +1778 -1768
  2. package/components/u-action-sheet/types.ts +52 -52
  3. package/components/u-action-sheet/u-action-sheet.vue +196 -196
  4. package/components/u-action-sheet-item/types.ts +35 -35
  5. package/components/u-action-sheet-item/u-action-sheet-item.vue +85 -85
  6. package/components/u-alert-tips/types.ts +49 -49
  7. package/components/u-alert-tips/u-alert-tips.vue +239 -239
  8. package/components/u-avatar/types.ts +44 -44
  9. package/components/u-avatar/u-avatar.vue +218 -218
  10. package/components/u-avatar-cropper/types.ts +23 -23
  11. package/components/u-avatar-cropper/u-avatar-cropper.vue +299 -299
  12. package/components/u-avatar-cropper/weCropper.d.ts +62 -62
  13. package/components/u-avatar-cropper/weCropper.js +1281 -1281
  14. package/components/u-avatar-cropper/weCropper.ts +1276 -1276
  15. package/components/u-back-top/types.ts +44 -44
  16. package/components/u-back-top/u-back-top.vue +141 -141
  17. package/components/u-badge/types.ts +46 -46
  18. package/components/u-badge/u-badge.vue +153 -153
  19. package/components/u-button/types.ts +76 -76
  20. package/components/u-button/u-button.vue +608 -608
  21. package/components/u-calendar/types.ts +126 -126
  22. package/components/u-calendar/u-calendar.vue +1243 -1243
  23. package/components/u-car-keyboard/types.ts +22 -22
  24. package/components/u-car-keyboard/u-car-keyboard.vue +263 -263
  25. package/components/u-card/types.ts +69 -69
  26. package/components/u-card/u-card.vue +210 -210
  27. package/components/u-cell-group/types.ts +27 -27
  28. package/components/u-cell-group/u-cell-group.vue +60 -60
  29. package/components/u-cell-item/types.ts +64 -64
  30. package/components/u-cell-item/u-cell-item.vue +221 -221
  31. package/components/u-checkbox/types.ts +45 -45
  32. package/components/u-checkbox/u-checkbox.vue +363 -363
  33. package/components/u-checkbox-group/types.ts +45 -45
  34. package/components/u-checkbox-group/u-checkbox-group.vue +172 -172
  35. package/components/u-circle-progress/types.ts +63 -63
  36. package/components/u-circle-progress/u-circle-progress.vue +299 -299
  37. package/components/u-city-select/types.ts +30 -30
  38. package/components/u-city-select/u-city-select.vue +281 -281
  39. package/components/u-col/types.ts +40 -40
  40. package/components/u-col/u-col.vue +142 -142
  41. package/components/u-collapse/types.ts +41 -41
  42. package/components/u-collapse/u-collapse.vue +190 -190
  43. package/components/u-collapse-item/types.ts +35 -35
  44. package/components/u-collapse-item/u-collapse-item.vue +291 -291
  45. package/components/u-column-notice/types.ts +58 -58
  46. package/components/u-column-notice/u-column-notice.vue +223 -223
  47. package/components/u-config-provider/types.ts +53 -53
  48. package/components/u-config-provider/u-config-provider.vue +185 -185
  49. package/components/u-count-down/types.ts +52 -52
  50. package/components/u-count-down/u-count-down.vue +288 -288
  51. package/components/u-count-to/types.ts +42 -42
  52. package/components/u-count-to/u-count-to.vue +266 -266
  53. package/components/u-divider/types.ts +41 -41
  54. package/components/u-divider/u-divider.vue +146 -146
  55. package/components/u-dropdown/types.ts +67 -67
  56. package/components/u-dropdown/u-dropdown.vue +436 -436
  57. package/components/u-dropdown-item/types.ts +40 -40
  58. package/components/u-dropdown-item/u-dropdown-item.vue +124 -124
  59. package/components/u-empty/types.ts +46 -46
  60. package/components/u-empty/u-empty.vue +109 -109
  61. package/components/u-fab/types.ts +83 -83
  62. package/components/u-fab/u-fab.vue +330 -330
  63. package/components/u-field/types.ts +81 -81
  64. package/components/u-field/u-field.vue +398 -398
  65. package/components/u-form/types.ts +39 -39
  66. package/components/u-form/u-form.vue +175 -135
  67. package/components/u-form-item/types.ts +95 -95
  68. package/components/u-form-item/u-form-item.vue +563 -563
  69. package/components/u-full-screen/types.ts +26 -26
  70. package/components/u-full-screen/u-full-screen.vue +100 -100
  71. package/components/u-gap/types.ts +28 -28
  72. package/components/u-gap/u-gap.vue +50 -50
  73. package/components/u-grid/types.ts +29 -29
  74. package/components/u-grid/u-grid.vue +91 -91
  75. package/components/u-grid-item/types.ts +24 -24
  76. package/components/u-grid-item/u-grid-item.vue +130 -130
  77. package/components/u-icon/types.ts +69 -69
  78. package/components/u-icon/u-icon.vue +301 -301
  79. package/components/u-image/types.ts +61 -61
  80. package/components/u-image/u-image.vue +245 -245
  81. package/components/u-index-anchor/types.ts +24 -24
  82. package/components/u-index-anchor/u-index-anchor.vue +120 -120
  83. package/components/u-index-list/types.ts +44 -44
  84. package/components/u-index-list/u-index-list.vue +346 -346
  85. package/components/u-input/types.ts +165 -165
  86. package/components/u-input/u-input.vue +453 -453
  87. package/components/u-keyboard/types.ts +40 -40
  88. package/components/u-keyboard/u-keyboard.vue +201 -201
  89. package/components/u-lazy-load/types.ts +37 -37
  90. package/components/u-lazy-load/u-lazy-load.vue +246 -246
  91. package/components/u-line/types.ts +44 -44
  92. package/components/u-line/u-line.vue +68 -68
  93. package/components/u-line-progress/types.ts +58 -58
  94. package/components/u-line-progress/u-line-progress.vue +131 -131
  95. package/components/u-link/types.ts +54 -54
  96. package/components/u-link/u-link.vue +100 -100
  97. package/components/u-loading/types.ts +45 -45
  98. package/components/u-loading/u-loading.vue +106 -106
  99. package/components/u-loading-popup/types.ts +26 -26
  100. package/components/u-loading-popup/u-loading-popup.vue +254 -254
  101. package/components/u-loadmore/types.ts +88 -88
  102. package/components/u-loadmore/u-loadmore.vue +170 -170
  103. package/components/u-mask/types.ts +48 -48
  104. package/components/u-mask/u-mask.vue +113 -113
  105. package/components/u-message-input/types.ts +90 -90
  106. package/components/u-message-input/u-message-input.vue +283 -283
  107. package/components/u-modal/service.ts +48 -48
  108. package/components/u-modal/types.ts +139 -139
  109. package/components/u-modal/u-modal.vue +465 -465
  110. package/components/u-navbar/types.ts +104 -104
  111. package/components/u-navbar/u-navbar.vue +268 -268
  112. package/components/u-no-network/image.ts +2 -2
  113. package/components/u-no-network/types.ts +29 -29
  114. package/components/u-no-network/u-no-network.vue +313 -313
  115. package/components/u-notice-bar/types.ts +111 -111
  116. package/components/u-notice-bar/u-notice-bar.vue +191 -191
  117. package/components/u-number-box/types.ts +42 -42
  118. package/components/u-number-box/u-number-box.vue +322 -322
  119. package/components/u-number-keyboard/types.ts +26 -26
  120. package/components/u-number-keyboard/u-number-keyboard.vue +189 -189
  121. package/components/u-pagination/types.ts +38 -38
  122. package/components/u-pagination/u-pagination.vue +102 -102
  123. package/components/u-picker/types.ts +140 -140
  124. package/components/u-picker/u-picker.vue +854 -854
  125. package/components/u-popup/types.ts +64 -64
  126. package/components/u-popup/u-popup.vue +427 -427
  127. package/components/u-radio/types.ts +39 -39
  128. package/components/u-radio/u-radio.vue +349 -349
  129. package/components/u-radio-group/types.ts +40 -40
  130. package/components/u-radio-group/u-radio-group.vue +96 -96
  131. package/components/u-rate/types.ts +50 -50
  132. package/components/u-rate/u-rate.vue +250 -250
  133. package/components/u-read-more/types.ts +46 -46
  134. package/components/u-read-more/u-read-more.vue +182 -182
  135. package/components/u-root-portal/u-root-portal.vue +55 -55
  136. package/components/u-row/types.ts +30 -30
  137. package/components/u-row/u-row.vue +105 -105
  138. package/components/u-row-notice/types.ts +49 -49
  139. package/components/u-row-notice/u-row-notice.vue +257 -257
  140. package/components/u-safe-bottom/types.ts +19 -19
  141. package/components/u-safe-bottom/u-safe-bottom.vue +55 -55
  142. package/components/u-search/u-search.vue +297 -297
  143. package/components/u-section/types.ts +42 -42
  144. package/components/u-section/u-section.vue +156 -156
  145. package/components/u-select/types.ts +56 -56
  146. package/components/u-select/u-select.vue +447 -447
  147. package/components/u-skeleton/types.ts +89 -89
  148. package/components/u-skeleton/u-skeleton.vue +253 -253
  149. package/components/u-slider/types.ts +55 -55
  150. package/components/u-slider/u-slider.vue +422 -422
  151. package/components/u-status-bar/types.ts +21 -21
  152. package/components/u-status-bar/u-status-bar.vue +64 -64
  153. package/components/u-step/types.ts +37 -37
  154. package/components/u-step/u-step.vue +292 -292
  155. package/components/u-steps/types.ts +39 -39
  156. package/components/u-steps/u-steps.vue +105 -105
  157. package/components/u-sticky/types.ts +33 -33
  158. package/components/u-sticky/u-sticky.vue +177 -177
  159. package/components/u-subsection/types.ts +46 -46
  160. package/components/u-subsection/u-subsection.vue +358 -358
  161. package/components/u-swipe-action/types.ts +60 -60
  162. package/components/u-swipe-action/u-swipe-action.vue +276 -276
  163. package/components/u-swiper/types.ts +57 -57
  164. package/components/u-swiper/u-swiper.vue +308 -308
  165. package/components/u-switch/types.ts +39 -39
  166. package/components/u-switch/u-switch.vue +212 -212
  167. package/components/u-tabbar/types.ts +57 -57
  168. package/components/u-tabbar/u-tabbar.vue +480 -480
  169. package/components/u-table/types.ts +35 -35
  170. package/components/u-table/u-table.vue +67 -67
  171. package/components/u-tabs/types.ts +64 -64
  172. package/components/u-tabs/u-tabs.vue +328 -328
  173. package/components/u-tabs-swiper/types.ts +64 -64
  174. package/components/u-tabs-swiper/u-tabs-swiper.vue +407 -407
  175. package/components/u-tag/types.ts +47 -47
  176. package/components/u-tag/u-tag.vue +276 -276
  177. package/components/u-td/types.ts +22 -22
  178. package/components/u-td/u-td.vue +65 -65
  179. package/components/u-text/types.ts +80 -80
  180. package/components/u-text/u-text.vue +355 -355
  181. package/components/u-textarea/types.ts +105 -105
  182. package/components/u-textarea/u-textarea.vue +450 -450
  183. package/components/u-th/types.ts +22 -22
  184. package/components/u-th/u-th.vue +63 -63
  185. package/components/u-time-line/u-time-line.vue +64 -64
  186. package/components/u-time-line-item/types.ts +24 -24
  187. package/components/u-time-line-item/u-time-line-item.vue +89 -89
  188. package/components/u-toast/service.ts +40 -40
  189. package/components/u-toast/types.ts +54 -54
  190. package/components/u-toast/u-toast.vue +385 -385
  191. package/components/u-top-tips/types.ts +25 -25
  192. package/components/u-top-tips/u-top-tips.vue +130 -130
  193. package/components/u-tr/types.ts +19 -19
  194. package/components/u-tr/u-tr.vue +39 -39
  195. package/components/u-transition/types.ts +43 -43
  196. package/components/u-transition/u-transition.vue +437 -437
  197. package/components/u-upload/types.ts +171 -171
  198. package/components/u-upload/u-upload.vue +1605 -1605
  199. package/components/u-verification-code/types.ts +32 -32
  200. package/components/u-verification-code/u-verification-code.vue +183 -183
  201. package/components/u-waterfall/types.ts +26 -26
  202. package/components/u-waterfall/u-waterfall.vue +188 -188
  203. package/iconfont.css +913 -913
  204. package/index.scss +26 -26
  205. package/libs/config/color.ts +9 -9
  206. package/libs/config/config.ts +59 -59
  207. package/libs/config/theme-tokens.ts +102 -102
  208. package/libs/config/zIndex.ts +32 -32
  209. package/libs/css/color.scss +155 -155
  210. package/libs/css/common.scss +183 -183
  211. package/libs/css/style.components.scss +16 -16
  212. package/libs/css/style.h5.scss +8 -8
  213. package/libs/css/style.mp.scss +68 -68
  214. package/libs/css/style.nvue.scss +15 -15
  215. package/libs/css/style.theme.scss +56 -56
  216. package/libs/css/style.vue.scss +188 -188
  217. package/libs/function/$parent.ts +24 -24
  218. package/libs/function/addUnit.ts +50 -50
  219. package/libs/function/clipboard.ts +73 -73
  220. package/libs/function/color.ts +28 -28
  221. package/libs/function/colorGradient.ts +139 -139
  222. package/libs/function/debounce.ts +28 -28
  223. package/libs/function/deepClone.ts +39 -39
  224. package/libs/function/deepMerge.ts +35 -35
  225. package/libs/function/getParent.ts +63 -63
  226. package/libs/function/getRect.ts +26 -26
  227. package/libs/function/guid.ts +42 -42
  228. package/libs/function/md5.ts +403 -403
  229. package/libs/function/parent.ts +21 -21
  230. package/libs/function/queryParams.ts +64 -64
  231. package/libs/function/random.ts +16 -16
  232. package/libs/function/randomArray.ts +11 -11
  233. package/libs/function/route.ts +118 -118
  234. package/libs/function/styleUtils.ts +83 -83
  235. package/libs/function/sys.ts +15 -15
  236. package/libs/function/test.ts +289 -289
  237. package/libs/function/throttle.ts +31 -31
  238. package/libs/function/timeFormat.ts +55 -55
  239. package/libs/function/timeFrom.ts +48 -48
  240. package/libs/function/toast.ts +14 -14
  241. package/libs/function/trim.ts +21 -21
  242. package/libs/function/type2icon.ts +38 -38
  243. package/libs/hooks/index.ts +10 -10
  244. package/libs/hooks/useColor.ts +61 -61
  245. package/libs/hooks/useCompRelation.ts +424 -424
  246. package/libs/hooks/useDebounce.ts +15 -15
  247. package/libs/hooks/useEmitter.ts +79 -79
  248. package/libs/hooks/useLocale.ts +34 -34
  249. package/libs/hooks/useModal.ts +131 -131
  250. package/libs/hooks/useRect.ts +40 -40
  251. package/libs/hooks/useRouter.ts +173 -173
  252. package/libs/hooks/useTheme.ts +173 -173
  253. package/libs/hooks/useThrottle.ts +16 -16
  254. package/libs/hooks/useToast.ts +115 -115
  255. package/libs/index.ts +349 -349
  256. package/libs/request/auto-http.ts +76 -76
  257. package/libs/request/index.ts +301 -301
  258. package/libs/store/index.ts +88 -88
  259. package/libs/util/async-validator.d.ts +75 -75
  260. package/libs/util/async-validator.js +1 -1
  261. package/libs/util/calendar.d.ts +57 -57
  262. package/libs/util/canvas-2d.ts +182 -182
  263. package/libs/util/config-provider.ts +804 -804
  264. package/libs/util/emitter.ts +112 -112
  265. package/libs/util/mitt.ts +118 -118
  266. package/libs/util/system-theme.ts +25 -25
  267. package/locale/index.ts +2 -2
  268. package/locale/lang/en-US.ts +136 -136
  269. package/locale/lang/zh-CN.ts +136 -136
  270. package/package.json +1 -1
  271. package/plugins/root/page.ts +77 -77
  272. package/plugins/root/root.ts +53 -53
  273. package/theme.scss +149 -149
  274. package/types/components.d.ts +105 -105
  275. package/types/global.d.ts +470 -470
  276. package/types/ignore-errors.d.ts +30 -30
  277. package/types/index.d.ts +15 -15
  278. package/types/uni-app.d.ts +63 -63
@@ -1,385 +1,385 @@
1
- <template>
2
- <u-mask :z-index="uZIndex" :show="isShow" custom-style="background-color:transparent;">
3
- <view
4
- class="u-toast"
5
- :class="[
6
- isShow ? 'u-show' : '',
7
- 'u-type-' + tmpConfig.type,
8
- 'u-position-' + tmpConfig.position,
9
- customClass
10
- ]"
11
- :style="$u.toStyle({ zIndex: uZIndex }, customStyle)"
12
- >
13
- <view class="u-icon-wrap">
14
- <!-- loading 类型走独立的加载动画组件 -->
15
- <u-loading
16
- v-if="tmpConfig.loading"
17
- mode="circle"
18
- custom-style="margin-right: 16rpx;"
19
- :color="($u.color as any)[tmpConfig.type]"
20
- ></u-loading>
21
- <!-- 其它类型仍然使用图标 -->
22
- <u-icon
23
- v-else-if="tmpConfig.icon && iconName"
24
- custom-class="u-toast_icon"
25
- custom-style="margin-right: 10rpx;"
26
- :name="iconName"
27
- :size="40"
28
- :color="tmpConfig.type"
29
- ></u-icon>
30
- </view>
31
- <text class="u-text">{{ tmpConfig.title }}</text>
32
- </view>
33
- </u-mask>
34
- </template>
35
-
36
- <script lang="ts">
37
- export default {
38
- name: 'u-toast',
39
- options: {
40
- addGlobalClass: true,
41
- // #ifndef MP-TOUTIAO
42
- virtualHost: true,
43
- // #endif
44
- styleIsolation: 'shared'
45
- }
46
- };
47
- </script>
48
-
49
- <script setup lang="ts">
50
- import { ref, computed, onMounted, onBeforeUnmount } from 'vue';
51
- import { onPageHide, onPageShow } from '@dcloudio/uni-app';
52
- import { $u } from '../..';
53
- import type { ToastExpose } from './types';
54
- import { ToastProps } from './types';
55
- import {
56
- U_TOAST_EVENT_HIDE,
57
- U_TOAST_EVENT_SHOW,
58
- U_TOAST_GLOBAL_EVENT_HIDE,
59
- U_TOAST_GLOBAL_EVENT_SHOW,
60
- getEventWithCurrentPage,
61
- type ToastPayload
62
- } from './service';
63
- import uIcon from '../u-icon/u-icon.vue';
64
- import uLoading from '../u-loading/u-loading.vue';
65
- import uMask from '../u-mask/u-mask.vue';
66
-
67
- /**
68
- * toast 消息提示
69
- * @description 此组件表现形式类似uni的uni.showToastAPI,但也有不同的地方。
70
- * @tutorial https://uviewpro.cn/zh/components/toast.html
71
- * @property {String|Number} z-index toast展示时的z-index值
72
- * @event {Function} show 显示toast,如需一进入页面就显示toast,请在onReady生命周期调用
73
- * @example <u-toast ref="uToast" />
74
- */
75
- const props = defineProps(ToastProps);
76
- // 是否已经初始化事件监听
77
- const isInit = ref(false);
78
- // 是否显示toast
79
- const isShow = ref(false);
80
- // 定时器
81
- let timer: ReturnType<typeof setTimeout> | null = null;
82
- // 内置配置
83
- const config = computed(() => {
84
- return {
85
- zIndex: props.zIndex, // z-index值
86
- type: props.type, // 主题类型,primary,success,error,warning,black
87
- duration: props.duration, // 显示的时间,毫秒
88
- icon: props.icon, // 显示的图标
89
- position: props.position, // toast出现的位置
90
- callback: props.callback, // 执行完后的回调函数
91
- back: props.back, // 结束toast是否自动返回上一页
92
- isTab: props.isTab, // 是否跳转tab页面
93
- url: props.url, // toast消失后是否跳转页面,有则跳转,优先级高于back参数
94
- params: props.params, // URL跳转的参数,对象
95
- loading: props.loading,
96
- title: '' // 显示文本
97
- };
98
- });
99
- // 合并后的临时配置变量
100
- const tmpConfig = ref<any>({ ...config.value });
101
-
102
- /**
103
- * 只有不为none,并且type为error|warning|success|info时候,才显示图标
104
- */
105
- const iconName = computed(() => {
106
- if (['error', 'warning', 'success', 'info'].indexOf(tmpConfig.value.type) >= 0 && tmpConfig.value.icon) {
107
- let icon = $u.type2icon(tmpConfig.value.type);
108
- return icon;
109
- }
110
- return '';
111
- });
112
- /**
113
- * 显示toast时候,如果用户有传递z-index值,优先使用
114
- */
115
- const uZIndex = computed(() => {
116
- return isShow.value ? (props.zIndex ? props.zIndex : $u.zIndex.toast) : '999999';
117
- });
118
-
119
- /**
120
- * 显示toast组件,由父组件通过ref.show(options)形式调用
121
- * @description 当 duration 为 0 或不传时,表示不自动关闭,需要手动调用 hide/close 方法关闭
122
- */
123
- function show(options: any) {
124
- // 不将结果合并到config变量,避免多次调用u-toast,前后的配置造成混乱
125
- tmpConfig.value = $u.deepMerge(config.value, options);
126
- if (timer) {
127
- // 清除定时器
128
- clearTimeout(timer);
129
- timer = null;
130
- }
131
- isShow.value = true;
132
- // duration 为 0、undefined 或小于等于 0 时,表示不自动关闭,需要手动调用 hide/close
133
- if (tmpConfig.value.duration > 0) {
134
- timer = setTimeout(() => {
135
- // 倒计时结束,清除定时器,隐藏toast组件
136
- isShow.value = false;
137
- clearTimeout(timer!);
138
- timer = null;
139
- // 判断是否存在callback方法,如果存在就执行
140
- typeof tmpConfig.value.callback === 'function' && tmpConfig.value.callback();
141
- timeEnd();
142
- }, tmpConfig.value.duration);
143
- }
144
- }
145
- /**
146
- * 隐藏toast组件,由父组件通过ref.hide()形式调用
147
- */
148
- function hide() {
149
- isShow.value = false;
150
- if (timer) {
151
- // 清除定时器
152
- clearTimeout(timer);
153
- timer = null;
154
- }
155
- }
156
- /**
157
- * 倒计时结束之后,进行的一些操作
158
- */
159
- function timeEnd() {
160
- // 如果带有url值,根据isTab为true或者false进行跳转
161
- if (tmpConfig.value.url) {
162
- // 如果url没有"/"开头,添加上,因为uni的路由跳转需要"/"开头
163
- if (tmpConfig.value.url[0] != '/') tmpConfig.value.url = '/' + tmpConfig.value.url;
164
- // 判断是否有传递显式的参数
165
- if (Object.keys(tmpConfig.value.params).length) {
166
- // 判断用户传递的url中,是否带有参数
167
- // 使用正则匹配,主要依据是判断是否有"/","?","="等,如“/page/index/index?name=mary"
168
- // 如果有params参数,转换后无需带上"?"
169
- let query = '';
170
- if (/.*\/.*\?.*=.*/.test(tmpConfig.value.url)) {
171
- // object对象转为get类型的参数
172
- query = $u.queryParams(tmpConfig.value.params, false);
173
- tmpConfig.value.url = tmpConfig.value.url + '&' + query;
174
- } else {
175
- query = $u.queryParams(tmpConfig.value.params);
176
- tmpConfig.value.url += query;
177
- }
178
- }
179
- // 如果是跳转tab页面,就使用uni.switchTab
180
- if (tmpConfig.value.isTab) {
181
- uni.switchTab({ url: tmpConfig.value.url });
182
- } else {
183
- uni.navigateTo({ url: tmpConfig.value.url });
184
- }
185
- } else if (tmpConfig.value.back) {
186
- // 回退到上一页
187
- $u.route({ type: 'back' });
188
- }
189
- }
190
-
191
- /**
192
- * @description
193
- * 函数式调用支持:
194
- * - useToast() 内部通过 uni.$emit 派发「全局」事件,仅由 App 根部的 <u-toast global /> 承接
195
- * - 普通页面级 <u-toast /> 监听「页面级」事件(当前版本暂未开放对应函数式 API,仅支持 ref 调用)
196
- * - 不影响原有 ref.show()/ref.hide() 使用方式
197
- */
198
- function onServiceShow(payload: ToastPayload) {
199
- show(payload || {});
200
- }
201
- function onServiceHide() {
202
- hide();
203
- }
204
-
205
- // 是否为 App 根部的“全局 toast”
206
- const isGlobal = computed(() => !!props.global);
207
- // 是否为页面级 toast
208
- const isPage = computed(() => !!props.page);
209
-
210
- // 显示事件
211
- const showEvent = computed(() =>
212
- isGlobal.value
213
- ? U_TOAST_GLOBAL_EVENT_SHOW
214
- : isPage.value
215
- ? getEventWithCurrentPage(U_TOAST_EVENT_SHOW, props.page)
216
- : ''
217
- );
218
-
219
- // 隐藏事件
220
- const hideEvent = computed(() =>
221
- isGlobal.value
222
- ? U_TOAST_GLOBAL_EVENT_HIDE
223
- : isPage.value
224
- ? getEventWithCurrentPage(U_TOAST_EVENT_HIDE, props.page)
225
- : ''
226
- );
227
-
228
- // 开始监听事件
229
- function startListeners() {
230
- if (isInit.value) {
231
- return;
232
- }
233
- isInit.value = true;
234
- if (showEvent.value) {
235
- uni?.$on && uni.$on(showEvent.value, onServiceShow);
236
- }
237
- if (hideEvent.value) {
238
- uni?.$on && uni.$on(hideEvent.value, onServiceHide);
239
- }
240
- }
241
-
242
- // 停止监听事件
243
- function stopListeners() {
244
- if (!isInit.value) {
245
- return;
246
- }
247
- isInit.value = false;
248
- if (showEvent.value) {
249
- uni?.$off && uni.$off(showEvent.value, onServiceShow);
250
- }
251
- if (hideEvent.value) {
252
- uni?.$off && uni.$off(hideEvent.value, onServiceHide);
253
- }
254
- }
255
-
256
- // 移除所有事件监听
257
- function removeAllListeners() {
258
- if (showEvent.value) {
259
- uni?.$off && uni.$off(showEvent.value);
260
- }
261
- if (hideEvent.value) {
262
- uni?.$off && uni.$off(hideEvent.value);
263
- }
264
- }
265
-
266
- onPageShow(() => {
267
- startListeners();
268
- });
269
-
270
- onPageHide(() => {
271
- stopListeners();
272
- });
273
-
274
- onMounted(() => {
275
- startListeners();
276
- });
277
-
278
- onBeforeUnmount(() => {
279
- stopListeners();
280
- });
281
-
282
- defineExpose<ToastExpose>({
283
- show,
284
- hide,
285
- close: hide
286
- });
287
- </script>
288
-
289
- <style lang="scss" scoped>
290
- @import '../../libs/css/style.components.scss';
291
-
292
- .u-toast {
293
- position: fixed;
294
- z-index: -1;
295
- transition: opacity 0.3s;
296
- text-align: center;
297
- color: var(--u-white-color);
298
- border-radius: 8rpx;
299
- background: var(--u-content-color);
300
- @include vue-flex;
301
- align-items: center;
302
- justify-content: center;
303
- font-size: 28rpx;
304
- opacity: 0;
305
- pointer-events: none;
306
- padding: 30rpx 40rpx;
307
- }
308
-
309
- .u-toast.u-show {
310
- opacity: 1;
311
- }
312
-
313
- .u-icon-wrap {
314
- /* #ifdef H5 */
315
- padding-top: 6rpx;
316
- /* #endif */
317
- }
318
-
319
- .u-text {
320
- word-break: break-all;
321
- }
322
-
323
- :deep(.u-toast_icon) {
324
- margin-right: 10rpx;
325
- @include vue-flex;
326
- align-items: center;
327
- line-height: normal;
328
- }
329
-
330
- .u-position-center {
331
- left: 50%;
332
- top: 50%;
333
- transform: translate(-50%, -50%);
334
- /* #ifndef APP-NVUE */
335
- max-width: 70%;
336
- /* #endif */
337
- }
338
-
339
- .u-position-top {
340
- left: 50%;
341
- top: 20%;
342
- transform: translate(-50%, -50%);
343
- }
344
-
345
- .u-position-bottom {
346
- left: 50%;
347
- bottom: 20%;
348
- transform: translate(-50%, -50%);
349
- }
350
-
351
- .u-type-primary {
352
- color: $u-type-primary;
353
- background-color: $u-type-primary-light;
354
- border: 1px solid var(--u-type-primary-light);
355
- }
356
-
357
- .u-type-success {
358
- color: $u-type-success;
359
- background-color: $u-type-success-light;
360
- border: 1px solid var(--u-type-success-light);
361
- }
362
-
363
- .u-type-error {
364
- color: $u-type-error;
365
- background-color: $u-type-error-light;
366
- border: 1px solid var(--u-type-error-light);
367
- }
368
-
369
- .u-type-warning {
370
- color: $u-type-warning;
371
- background-color: $u-type-warning-light;
372
- border: 1px solid var(--u-type-warning-light);
373
- }
374
-
375
- .u-type-info {
376
- color: $u-type-info;
377
- background-color: $u-type-info-light;
378
- border: 1px solid var(--u-bg-gray-light);
379
- }
380
-
381
- .u-type-default {
382
- color: var(--u-white-color);
383
- background-color: var(--u-content-color);
384
- }
385
- </style>
1
+ <template>
2
+ <u-mask :z-index="uZIndex" :show="isShow" custom-style="background-color:transparent;">
3
+ <view
4
+ class="u-toast"
5
+ :class="[
6
+ isShow ? 'u-show' : '',
7
+ 'u-type-' + tmpConfig.type,
8
+ 'u-position-' + tmpConfig.position,
9
+ customClass
10
+ ]"
11
+ :style="$u.toStyle({ zIndex: uZIndex }, customStyle)"
12
+ >
13
+ <view class="u-icon-wrap">
14
+ <!-- loading 类型走独立的加载动画组件 -->
15
+ <u-loading
16
+ v-if="tmpConfig.loading"
17
+ mode="circle"
18
+ custom-style="margin-right: 16rpx;"
19
+ :color="($u.color as any)[tmpConfig.type]"
20
+ ></u-loading>
21
+ <!-- 其它类型仍然使用图标 -->
22
+ <u-icon
23
+ v-else-if="tmpConfig.icon && iconName"
24
+ custom-class="u-toast_icon"
25
+ custom-style="margin-right: 10rpx;"
26
+ :name="iconName"
27
+ :size="40"
28
+ :color="tmpConfig.type"
29
+ ></u-icon>
30
+ </view>
31
+ <text class="u-text">{{ tmpConfig.title }}</text>
32
+ </view>
33
+ </u-mask>
34
+ </template>
35
+
36
+ <script lang="ts">
37
+ export default {
38
+ name: 'u-toast',
39
+ options: {
40
+ addGlobalClass: true,
41
+ // #ifndef MP-TOUTIAO
42
+ virtualHost: true,
43
+ // #endif
44
+ styleIsolation: 'shared'
45
+ }
46
+ };
47
+ </script>
48
+
49
+ <script setup lang="ts">
50
+ import { ref, computed, onMounted, onBeforeUnmount } from 'vue';
51
+ import { onPageHide, onPageShow } from '@dcloudio/uni-app';
52
+ import { $u } from '../..';
53
+ import type { ToastExpose } from './types';
54
+ import { ToastProps } from './types';
55
+ import {
56
+ U_TOAST_EVENT_HIDE,
57
+ U_TOAST_EVENT_SHOW,
58
+ U_TOAST_GLOBAL_EVENT_HIDE,
59
+ U_TOAST_GLOBAL_EVENT_SHOW,
60
+ getEventWithCurrentPage,
61
+ type ToastPayload
62
+ } from './service';
63
+ import uIcon from '../u-icon/u-icon.vue';
64
+ import uLoading from '../u-loading/u-loading.vue';
65
+ import uMask from '../u-mask/u-mask.vue';
66
+
67
+ /**
68
+ * toast 消息提示
69
+ * @description 此组件表现形式类似uni的uni.showToastAPI,但也有不同的地方。
70
+ * @tutorial https://uviewpro.cn/zh/components/toast.html
71
+ * @property {String|Number} z-index toast展示时的z-index值
72
+ * @event {Function} show 显示toast,如需一进入页面就显示toast,请在onReady生命周期调用
73
+ * @example <u-toast ref="uToast" />
74
+ */
75
+ const props = defineProps(ToastProps);
76
+ // 是否已经初始化事件监听
77
+ const isInit = ref(false);
78
+ // 是否显示toast
79
+ const isShow = ref(false);
80
+ // 定时器
81
+ let timer: ReturnType<typeof setTimeout> | null = null;
82
+ // 内置配置
83
+ const config = computed(() => {
84
+ return {
85
+ zIndex: props.zIndex, // z-index值
86
+ type: props.type, // 主题类型,primary,success,error,warning,black
87
+ duration: props.duration, // 显示的时间,毫秒
88
+ icon: props.icon, // 显示的图标
89
+ position: props.position, // toast出现的位置
90
+ callback: props.callback, // 执行完后的回调函数
91
+ back: props.back, // 结束toast是否自动返回上一页
92
+ isTab: props.isTab, // 是否跳转tab页面
93
+ url: props.url, // toast消失后是否跳转页面,有则跳转,优先级高于back参数
94
+ params: props.params, // URL跳转的参数,对象
95
+ loading: props.loading,
96
+ title: '' // 显示文本
97
+ };
98
+ });
99
+ // 合并后的临时配置变量
100
+ const tmpConfig = ref<any>({ ...config.value });
101
+
102
+ /**
103
+ * 只有不为none,并且type为error|warning|success|info时候,才显示图标
104
+ */
105
+ const iconName = computed(() => {
106
+ if (['error', 'warning', 'success', 'info'].indexOf(tmpConfig.value.type) >= 0 && tmpConfig.value.icon) {
107
+ let icon = $u.type2icon(tmpConfig.value.type);
108
+ return icon;
109
+ }
110
+ return '';
111
+ });
112
+ /**
113
+ * 显示toast时候,如果用户有传递z-index值,优先使用
114
+ */
115
+ const uZIndex = computed(() => {
116
+ return isShow.value ? (props.zIndex ? props.zIndex : $u.zIndex.toast) : '999999';
117
+ });
118
+
119
+ /**
120
+ * 显示toast组件,由父组件通过ref.show(options)形式调用
121
+ * @description 当 duration 为 0 或不传时,表示不自动关闭,需要手动调用 hide/close 方法关闭
122
+ */
123
+ function show(options: any) {
124
+ // 不将结果合并到config变量,避免多次调用u-toast,前后的配置造成混乱
125
+ tmpConfig.value = $u.deepMerge(config.value, options);
126
+ if (timer) {
127
+ // 清除定时器
128
+ clearTimeout(timer);
129
+ timer = null;
130
+ }
131
+ isShow.value = true;
132
+ // duration 为 0、undefined 或小于等于 0 时,表示不自动关闭,需要手动调用 hide/close
133
+ if (tmpConfig.value.duration > 0) {
134
+ timer = setTimeout(() => {
135
+ // 倒计时结束,清除定时器,隐藏toast组件
136
+ isShow.value = false;
137
+ clearTimeout(timer!);
138
+ timer = null;
139
+ // 判断是否存在callback方法,如果存在就执行
140
+ typeof tmpConfig.value.callback === 'function' && tmpConfig.value.callback();
141
+ timeEnd();
142
+ }, tmpConfig.value.duration);
143
+ }
144
+ }
145
+ /**
146
+ * 隐藏toast组件,由父组件通过ref.hide()形式调用
147
+ */
148
+ function hide() {
149
+ isShow.value = false;
150
+ if (timer) {
151
+ // 清除定时器
152
+ clearTimeout(timer);
153
+ timer = null;
154
+ }
155
+ }
156
+ /**
157
+ * 倒计时结束之后,进行的一些操作
158
+ */
159
+ function timeEnd() {
160
+ // 如果带有url值,根据isTab为true或者false进行跳转
161
+ if (tmpConfig.value.url) {
162
+ // 如果url没有"/"开头,添加上,因为uni的路由跳转需要"/"开头
163
+ if (tmpConfig.value.url[0] != '/') tmpConfig.value.url = '/' + tmpConfig.value.url;
164
+ // 判断是否有传递显式的参数
165
+ if (Object.keys(tmpConfig.value.params).length) {
166
+ // 判断用户传递的url中,是否带有参数
167
+ // 使用正则匹配,主要依据是判断是否有"/","?","="等,如“/page/index/index?name=mary"
168
+ // 如果有params参数,转换后无需带上"?"
169
+ let query = '';
170
+ if (/.*\/.*\?.*=.*/.test(tmpConfig.value.url)) {
171
+ // object对象转为get类型的参数
172
+ query = $u.queryParams(tmpConfig.value.params, false);
173
+ tmpConfig.value.url = tmpConfig.value.url + '&' + query;
174
+ } else {
175
+ query = $u.queryParams(tmpConfig.value.params);
176
+ tmpConfig.value.url += query;
177
+ }
178
+ }
179
+ // 如果是跳转tab页面,就使用uni.switchTab
180
+ if (tmpConfig.value.isTab) {
181
+ uni.switchTab({ url: tmpConfig.value.url });
182
+ } else {
183
+ uni.navigateTo({ url: tmpConfig.value.url });
184
+ }
185
+ } else if (tmpConfig.value.back) {
186
+ // 回退到上一页
187
+ $u.route({ type: 'back' });
188
+ }
189
+ }
190
+
191
+ /**
192
+ * @description
193
+ * 函数式调用支持:
194
+ * - useToast() 内部通过 uni.$emit 派发「全局」事件,仅由 App 根部的 <u-toast global /> 承接
195
+ * - 普通页面级 <u-toast /> 监听「页面级」事件(当前版本暂未开放对应函数式 API,仅支持 ref 调用)
196
+ * - 不影响原有 ref.show()/ref.hide() 使用方式
197
+ */
198
+ function onServiceShow(payload: ToastPayload) {
199
+ show(payload || {});
200
+ }
201
+ function onServiceHide() {
202
+ hide();
203
+ }
204
+
205
+ // 是否为 App 根部的“全局 toast”
206
+ const isGlobal = computed(() => !!props.global);
207
+ // 是否为页面级 toast
208
+ const isPage = computed(() => !!props.page);
209
+
210
+ // 显示事件
211
+ const showEvent = computed(() =>
212
+ isGlobal.value
213
+ ? U_TOAST_GLOBAL_EVENT_SHOW
214
+ : isPage.value
215
+ ? getEventWithCurrentPage(U_TOAST_EVENT_SHOW, props.page)
216
+ : ''
217
+ );
218
+
219
+ // 隐藏事件
220
+ const hideEvent = computed(() =>
221
+ isGlobal.value
222
+ ? U_TOAST_GLOBAL_EVENT_HIDE
223
+ : isPage.value
224
+ ? getEventWithCurrentPage(U_TOAST_EVENT_HIDE, props.page)
225
+ : ''
226
+ );
227
+
228
+ // 开始监听事件
229
+ function startListeners() {
230
+ if (isInit.value) {
231
+ return;
232
+ }
233
+ isInit.value = true;
234
+ if (showEvent.value) {
235
+ uni?.$on && uni.$on(showEvent.value, onServiceShow);
236
+ }
237
+ if (hideEvent.value) {
238
+ uni?.$on && uni.$on(hideEvent.value, onServiceHide);
239
+ }
240
+ }
241
+
242
+ // 停止监听事件
243
+ function stopListeners() {
244
+ if (!isInit.value) {
245
+ return;
246
+ }
247
+ isInit.value = false;
248
+ if (showEvent.value) {
249
+ uni?.$off && uni.$off(showEvent.value, onServiceShow);
250
+ }
251
+ if (hideEvent.value) {
252
+ uni?.$off && uni.$off(hideEvent.value, onServiceHide);
253
+ }
254
+ }
255
+
256
+ // 移除所有事件监听
257
+ function removeAllListeners() {
258
+ if (showEvent.value) {
259
+ uni?.$off && uni.$off(showEvent.value);
260
+ }
261
+ if (hideEvent.value) {
262
+ uni?.$off && uni.$off(hideEvent.value);
263
+ }
264
+ }
265
+
266
+ onPageShow(() => {
267
+ startListeners();
268
+ });
269
+
270
+ onPageHide(() => {
271
+ stopListeners();
272
+ });
273
+
274
+ onMounted(() => {
275
+ startListeners();
276
+ });
277
+
278
+ onBeforeUnmount(() => {
279
+ stopListeners();
280
+ });
281
+
282
+ defineExpose<ToastExpose>({
283
+ show,
284
+ hide,
285
+ close: hide
286
+ });
287
+ </script>
288
+
289
+ <style lang="scss" scoped>
290
+ @import '../../libs/css/style.components.scss';
291
+
292
+ .u-toast {
293
+ position: fixed;
294
+ z-index: -1;
295
+ transition: opacity 0.3s;
296
+ text-align: center;
297
+ color: var(--u-white-color);
298
+ border-radius: 8rpx;
299
+ background: var(--u-content-color);
300
+ @include vue-flex;
301
+ align-items: center;
302
+ justify-content: center;
303
+ font-size: 28rpx;
304
+ opacity: 0;
305
+ pointer-events: none;
306
+ padding: 30rpx 40rpx;
307
+ }
308
+
309
+ .u-toast.u-show {
310
+ opacity: 1;
311
+ }
312
+
313
+ .u-icon-wrap {
314
+ /* #ifdef H5 */
315
+ padding-top: 6rpx;
316
+ /* #endif */
317
+ }
318
+
319
+ .u-text {
320
+ word-break: break-all;
321
+ }
322
+
323
+ :deep(.u-toast_icon) {
324
+ margin-right: 10rpx;
325
+ @include vue-flex;
326
+ align-items: center;
327
+ line-height: normal;
328
+ }
329
+
330
+ .u-position-center {
331
+ left: 50%;
332
+ top: 50%;
333
+ transform: translate(-50%, -50%);
334
+ /* #ifndef APP-NVUE */
335
+ max-width: 70%;
336
+ /* #endif */
337
+ }
338
+
339
+ .u-position-top {
340
+ left: 50%;
341
+ top: 20%;
342
+ transform: translate(-50%, -50%);
343
+ }
344
+
345
+ .u-position-bottom {
346
+ left: 50%;
347
+ bottom: 20%;
348
+ transform: translate(-50%, -50%);
349
+ }
350
+
351
+ .u-type-primary {
352
+ color: $u-type-primary;
353
+ background-color: $u-type-primary-light;
354
+ border: 1px solid var(--u-type-primary-light);
355
+ }
356
+
357
+ .u-type-success {
358
+ color: $u-type-success;
359
+ background-color: $u-type-success-light;
360
+ border: 1px solid var(--u-type-success-light);
361
+ }
362
+
363
+ .u-type-error {
364
+ color: $u-type-error;
365
+ background-color: $u-type-error-light;
366
+ border: 1px solid var(--u-type-error-light);
367
+ }
368
+
369
+ .u-type-warning {
370
+ color: $u-type-warning;
371
+ background-color: $u-type-warning-light;
372
+ border: 1px solid var(--u-type-warning-light);
373
+ }
374
+
375
+ .u-type-info {
376
+ color: $u-type-info;
377
+ background-color: $u-type-info-light;
378
+ border: 1px solid var(--u-bg-gray-light);
379
+ }
380
+
381
+ .u-type-default {
382
+ color: var(--u-white-color);
383
+ background-color: var(--u-content-color);
384
+ }
385
+ </style>