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,465 +1,465 @@
1
- <template>
2
- <view>
3
- <u-popup
4
- v-model="popupValue"
5
- mode="center"
6
- :zoom="effectiveConfig.zoom"
7
- :popup="false"
8
- :z-index="uZIndex"
9
- :length="effectiveConfig.width"
10
- :mask-close-able="effectiveConfig.maskCloseAble"
11
- :border-radius="effectiveConfig.borderRadius"
12
- :negative-top="effectiveConfig.negativeTop"
13
- :custom-class="effectiveConfig.customClass"
14
- @close="popupClose"
15
- >
16
- <view class="u-model" :style="$u.toStyle(effectiveConfig.customStyle)">
17
- <view
18
- v-if="effectiveConfig.showTitle"
19
- class="u-model__title u-line-1"
20
- :style="$u.toStyle(effectiveConfig.titleStyle)"
21
- >
22
- {{ effectiveConfig.title }}
23
- </view>
24
- <view class="u-model__content">
25
- <view v-if="slots.default" :style="$u.toStyle(effectiveConfig.contentStyle)">
26
- <slot />
27
- </view>
28
- <view v-else class="u-model__content__message" :style="$u.toStyle(effectiveConfig.contentStyle)">
29
- <text>{{ effectiveConfig.content }}</text>
30
- </view>
31
- </view>
32
- <view
33
- v-if="effectiveConfig.showCancelButton || effectiveConfig.showConfirmButton"
34
- class="u-model__footer u-border-top"
35
- >
36
- <view
37
- v-if="effectiveConfig.showCancelButton"
38
- :hover-stay-time="100"
39
- hover-class="u-model__btn--hover"
40
- class="u-model__footer__button"
41
- :style="$u.toStyle(cancelBtnStyle)"
42
- @tap="cancel"
43
- >
44
- {{ effectiveConfig.cancelText }}
45
- </view>
46
- <view
47
- v-if="effectiveConfig.showConfirmButton || slots['confirm-button']"
48
- :class="['u-model__footer__button', effectiveConfig.showCancelButton ? 'u-border-left' : '']"
49
- :hover-stay-time="100"
50
- :hover-class="effectiveConfig.asyncClose ? 'none' : 'u-model__btn--hover'"
51
- :style="[confirmBtnStyle]"
52
- @tap="confirm"
53
- >
54
- <slot v-if="slots['confirm-button']" name="confirm-button"></slot>
55
- <template v-else>
56
- <u-loading mode="circle" :color="effectiveConfig.confirmColor" v-if="loading"></u-loading>
57
- <template v-else>
58
- {{ effectiveConfig.confirmText }}
59
- </template>
60
- </template>
61
- </view>
62
- </view>
63
- </view>
64
- </u-popup>
65
- </view>
66
- </template>
67
-
68
- <script lang="ts">
69
- export default {
70
- name: 'u-modal',
71
- options: {
72
- addGlobalClass: true,
73
- // #ifndef MP-TOUTIAO
74
- virtualHost: true,
75
- // #endif
76
- styleIsolation: 'shared'
77
- }
78
- };
79
- </script>
80
-
81
- <script setup lang="ts">
82
- import { ref, computed, watch, useSlots, onMounted, onBeforeUnmount } from 'vue';
83
- import { onPageHide, onPageShow } from '@dcloudio/uni-app';
84
- import { $u, useLocale } from '../..';
85
- import { ModalProps } from './types';
86
- import {
87
- U_MODAL_EVENT_CLEAR_LOADING,
88
- U_MODAL_EVENT_HIDE,
89
- U_MODAL_EVENT_SHOW,
90
- U_MODAL_GLOBAL_EVENT_CLEAR_LOADING,
91
- U_MODAL_GLOBAL_EVENT_HIDE,
92
- U_MODAL_GLOBAL_EVENT_SHOW,
93
- getEventWithCurrentPage,
94
- type ModalPayload
95
- } from './service';
96
- import uLoading from '../u-loading/u-loading.vue';
97
- import uPopup from '../u-popup/u-popup.vue';
98
-
99
- /**
100
- * modal 模态框
101
- * @description 弹出模态框,常用于消息提示、消息确认、在当前页面内完成特定的交互操作
102
- * @tutorial https://uviewpro.cn/zh/components/modal.html
103
- * @property {Boolean} value 是否显示模态框
104
- * @property {String | Number} z-index 层级
105
- * @property {String} title 模态框标题(默认"提示")
106
- * @property {String | Number} width 模态框宽度(默认600)
107
- * @property {String} content 模态框内容(默认"内容")
108
- * @property {Boolean} show-title 是否显示标题(默认true)
109
- * @property {Boolean} async-close 是否异步关闭,只对确定按钮有效(默认false)
110
- * @property {Boolean} show-confirm-button 是否显示确认按钮(默认true)
111
- * @property {String | Number} negative-top modal往上偏移的值
112
- * @property {Boolean} show-cancel-button 是否显示取消按钮(默认false)
113
- * @property {Boolean} mask-close-able 是否允许点击遮罩关闭modal(默认false)
114
- * @property {String} confirm-text 确认按钮的文字内容(默认"确认")
115
- * @property {String} cancel-text 取消按钮的文字内容(默认"取消")
116
- * @property {String} cancel-color 取消按钮的颜色(默认"var(--u-content-color)")
117
- * @property {String} confirm-color 确认按钮的文字内容(默认主题色primary)
118
- * @property {String | Number} border-radius 模态框圆角值,单位rpx(默认16)
119
- * @property {Object} title-style 自定义标题样式,对象形式
120
- * @property {Object} content-style 自定义内容样式,对象形式
121
- * @property {Object} cancel-style 自定义取消按钮样式,对象形式
122
- * @property {Object} confirm-style 自定义确认按钮样式,对象形式
123
- * @property {Boolean} zoom 是否开启缩放模式(默认true)
124
- * @event {Function} confirm 确认按钮被点击
125
- * @event {Function} cancel 取消按钮被点击
126
- * @example <u-modal :src="title" :content="content"></u-modal>
127
- */
128
-
129
- const props = defineProps(ModalProps);
130
- const emit = defineEmits(['update:modelValue', 'confirm', 'cancel']);
131
- const slots = useSlots();
132
-
133
- const { t } = useLocale();
134
-
135
- // 是否已经初始化事件监听
136
- const isInit = ref(false);
137
- // 确认按钮是否正在加载中
138
- const loading = ref(false);
139
- const isGlobal = computed(() => !!props.global);
140
- const isPage = computed(() => !!props.page);
141
- const showEvent = computed(() =>
142
- isGlobal.value
143
- ? U_MODAL_GLOBAL_EVENT_SHOW
144
- : isPage.value
145
- ? getEventWithCurrentPage(U_MODAL_EVENT_SHOW, props.page)
146
- : ''
147
- );
148
- const hideEvent = computed(() =>
149
- isGlobal.value
150
- ? U_MODAL_GLOBAL_EVENT_HIDE
151
- : isPage.value
152
- ? getEventWithCurrentPage(U_MODAL_EVENT_HIDE, props.page)
153
- : ''
154
- );
155
- const clearLoadingEvent = computed(() =>
156
- isGlobal.value
157
- ? U_MODAL_GLOBAL_EVENT_CLEAR_LOADING
158
- : isPage.value
159
- ? getEventWithCurrentPage(U_MODAL_EVENT_CLEAR_LOADING, props.page)
160
- : ''
161
- );
162
-
163
- // 存储用户传入的回调函数
164
- let userOnConfirm: (() => void) | null = null;
165
- let userOnCancel: (() => void) | null = null;
166
-
167
- // 需要与 effectiveConfig 合并的 props 键名列表(用于函数式调用)
168
- const MERGE_PROPS_KEYS = [
169
- 'title',
170
- 'content',
171
- 'showTitle',
172
- 'showConfirmButton',
173
- 'showCancelButton',
174
- 'confirmText',
175
- 'cancelText',
176
- 'confirmColor',
177
- 'cancelColor',
178
- 'confirmStyle',
179
- 'cancelStyle',
180
- 'titleStyle',
181
- 'contentStyle',
182
- 'asyncClose',
183
- 'borderRadius',
184
- 'width',
185
- 'zoom',
186
- 'maskCloseAble',
187
- 'negativeTop',
188
- 'zIndex',
189
- 'customStyle',
190
- 'customClass'
191
- ] as const;
192
-
193
- // 函数式调用时的临时配置
194
- const tempConfig = ref<Partial<ModalPayload>>({});
195
-
196
- // 函数式调用时的内部显示状态(用于 global 模式)
197
- const internalShow = ref(false);
198
-
199
- // 国际化计算属性
200
- const getTitle = computed(() => props.title || t('uModal.title'));
201
- const getConfirmText = computed(() => props.confirmText || t('uModal.confirmText'));
202
- const getCancelText = computed(() => props.cancelText || t('uModal.cancelText'));
203
-
204
- // 有效的配置(函数式调用时合并 tempConfig 和 props,v-model 时使用 props)
205
- const effectiveConfig = computed(() => {
206
- // 如果有临时配置(函数式调用),合并用户配置与 props 默认值
207
- if (Object.keys(tempConfig.value).length > 0) {
208
- const result: Record<string, any> = {};
209
- for (const key of MERGE_PROPS_KEYS) {
210
- // 用户配置优先,否则使用 props 默认值
211
- result[key] = (tempConfig.value as Record<string, any>)[key] ?? (props as Record<string, any>)[key];
212
- }
213
- result.zIndex = tempConfig.value.zIndex ?? props.zIndex ?? $u.zIndex.popup;
214
- // 处理国际化字段
215
- result.title = result.title || t('uModal.title');
216
- result.confirmText = result.confirmText || t('uModal.confirmText');
217
- result.cancelText = result.cancelText || t('uModal.cancelText');
218
- return result;
219
- }
220
- // v-model 直接控制时使用 props,但处理国际化
221
- return {
222
- ...props,
223
- title: getTitle.value,
224
- confirmText: getConfirmText.value,
225
- cancelText: getCancelText.value
226
- };
227
- });
228
- // 取消按钮样式
229
- const cancelBtnStyle = computed(() => {
230
- return Object.assign({ color: effectiveConfig.value.cancelColor }, effectiveConfig.value.cancelStyle);
231
- });
232
- // 确认按钮样式
233
- const confirmBtnStyle = computed(() => {
234
- return Object.assign({ color: effectiveConfig.value.confirmColor }, effectiveConfig.value.confirmStyle);
235
- });
236
- // 弹窗的样式
237
- const uZIndex = computed(() => effectiveConfig.value.zIndex ?? $u.zIndex.popup);
238
- // 是否使用内部状态控制显示(global 模式)
239
- const useInternalShow = computed(() => isGlobal.value || isPage.value);
240
- // 最终显示状态
241
- const finalShow = computed(() => {
242
- if (useInternalShow.value) {
243
- return internalShow.value;
244
- }
245
- return props.modelValue;
246
- });
247
- // u-popup 绑定的值
248
- const popupValue = computed({
249
- get: () => finalShow.value,
250
- set: (val: boolean) => {
251
- if (useInternalShow.value) {
252
- internalShow.value = val;
253
- } else {
254
- emit('update:modelValue', val);
255
- }
256
- }
257
- });
258
-
259
- // 如果是异步关闭时,外部修改v-model的值为false时,重置内部的loading状态,避免下次打开的时候,状态混乱
260
- watch(
261
- () => popupValue.value,
262
- n => {
263
- if (n === true) loading.value = false;
264
- }
265
- );
266
-
267
- /**
268
- * 确认按钮点击事件
269
- */
270
- function confirm() {
271
- // 先调用回调,再重置配置
272
- const onConfirm = userOnConfirm;
273
- // 异步关闭
274
- if (effectiveConfig.value.asyncClose) {
275
- loading.value = true;
276
- } else {
277
- popupValue.value = false;
278
- // 延迟重置配置,避免闪屏
279
- setTimeout(() => resetTempConfig(), 300);
280
- }
281
- emit('confirm');
282
- // 调用函数式调用时用户传入的回调
283
- onConfirm?.();
284
- }
285
-
286
- /**
287
- * 取消按钮点击事件
288
- */
289
- function cancel() {
290
- // 先调用回调,再重置配置
291
- const onCancel = userOnCancel;
292
- // 延迟重置配置,避免闪屏
293
- setTimeout(() => resetTempConfig(), 300);
294
- emit('cancel');
295
- popupValue.value = false;
296
- // 调用函数式调用时用户传入的回调
297
- onCancel?.();
298
- // 目前popup弹窗关闭有一个延时操作,此处做一个延时
299
- // 避免确认按钮文字变成了"确定"字样,modal还没消失,造成视觉不好的效果
300
- setTimeout(() => {
301
- loading.value = false;
302
- }, 300);
303
- }
304
-
305
- /**
306
- * 点击遮罩关闭modal,设置v-model的值为false,否则无法第二次弹起modal
307
- */
308
- function popupClose() {
309
- popupValue.value = false;
310
- resetTempConfig();
311
- }
312
-
313
- /**
314
- * 清除加载中的状态
315
- */
316
- function clearLoading() {
317
- loading.value = false;
318
- }
319
-
320
- /**
321
- * 函数式调用显示 modal
322
- */
323
- function onServiceShow(payload: ModalPayload) {
324
- // 保存回调函数
325
- userOnConfirm = payload.onConfirm ?? null;
326
- userOnCancel = payload.onCancel ?? null;
327
-
328
- // 只保存用户传入的配置(过滤掉回调)
329
- const { onConfirm, onCancel, ...rest } = payload;
330
- tempConfig.value = rest;
331
-
332
- // 使用内部状态控制显示
333
- internalShow.value = true;
334
- }
335
-
336
- /**
337
- * 函数式调用关闭 modal
338
- */
339
- function onServiceHide() {
340
- internalShow.value = false;
341
- resetTempConfig();
342
- }
343
-
344
- /**
345
- * 重置临时配置
346
- */
347
- function resetTempConfig() {
348
- tempConfig.value = {};
349
- userOnConfirm = null;
350
- userOnCancel = null;
351
- }
352
-
353
- // 开始监听事件
354
- function startListeners() {
355
- if (isInit.value) {
356
- return;
357
- }
358
- isInit.value = true;
359
- if (showEvent.value) {
360
- uni?.$on && uni.$on(showEvent.value, onServiceShow);
361
- }
362
- if (hideEvent.value) {
363
- uni?.$on && uni.$on(hideEvent.value, onServiceHide);
364
- }
365
- if (clearLoadingEvent.value) {
366
- uni?.$on && uni.$on(clearLoadingEvent.value, clearLoading);
367
- }
368
- }
369
-
370
- // 停止监听事件
371
- function stopListeners() {
372
- if (!isInit.value) {
373
- return;
374
- }
375
- isInit.value = false;
376
- if (showEvent.value) {
377
- uni?.$off && uni.$off(showEvent.value, onServiceShow);
378
- }
379
- if (hideEvent.value) {
380
- uni?.$off && uni.$off(hideEvent.value, onServiceHide);
381
- }
382
- if (clearLoadingEvent.value) {
383
- uni?.$off && uni.$off(clearLoadingEvent.value, clearLoading);
384
- }
385
- }
386
-
387
- // 移除所有事件监听
388
- function removeAllListeners() {
389
- if (showEvent.value) {
390
- uni?.$off && uni.$off(showEvent.value);
391
- }
392
- if (hideEvent.value) {
393
- uni?.$off && uni.$off(hideEvent.value);
394
- }
395
- if (clearLoadingEvent.value) {
396
- uni?.$off && uni.$off(clearLoadingEvent.value);
397
- }
398
- }
399
-
400
- onPageShow(() => {
401
- startListeners();
402
- });
403
-
404
- onPageHide(() => {
405
- stopListeners();
406
- });
407
-
408
- onMounted(() => {
409
- startListeners();
410
- });
411
-
412
- onBeforeUnmount(() => {
413
- stopListeners();
414
- });
415
-
416
- defineExpose({
417
- clearLoading
418
- });
419
- </script>
420
-
421
- <style lang="scss" scoped>
422
- @import '../../libs/css/style.components.scss';
423
-
424
- .u-model {
425
- height: auto;
426
- overflow: hidden;
427
- font-size: 32rpx;
428
- background-color: var(--u-bg-white);
429
-
430
- &__btn--hover {
431
- background-color: rgb(230, 230, 230);
432
- }
433
-
434
- &__title {
435
- padding-top: 48rpx;
436
- font-weight: 500;
437
- text-align: center;
438
- color: $u-main-color;
439
- }
440
-
441
- &__content {
442
- &__message {
443
- padding: 48rpx;
444
- font-size: 30rpx;
445
- text-align: center;
446
- color: $u-content-color;
447
- }
448
- }
449
-
450
- &__footer {
451
- @include vue-flex;
452
-
453
- &__button {
454
- flex: 1;
455
- height: 100rpx;
456
- line-height: 100rpx;
457
- font-size: 32rpx;
458
- box-sizing: border-box;
459
- cursor: pointer;
460
- text-align: center;
461
- border-radius: 4rpx;
462
- }
463
- }
464
- }
465
- </style>
1
+ <template>
2
+ <view>
3
+ <u-popup
4
+ v-model="popupValue"
5
+ mode="center"
6
+ :zoom="effectiveConfig.zoom"
7
+ :popup="false"
8
+ :z-index="uZIndex"
9
+ :length="effectiveConfig.width"
10
+ :mask-close-able="effectiveConfig.maskCloseAble"
11
+ :border-radius="effectiveConfig.borderRadius"
12
+ :negative-top="effectiveConfig.negativeTop"
13
+ :custom-class="effectiveConfig.customClass"
14
+ @close="popupClose"
15
+ >
16
+ <view class="u-model" :style="$u.toStyle(effectiveConfig.customStyle)">
17
+ <view
18
+ v-if="effectiveConfig.showTitle"
19
+ class="u-model__title u-line-1"
20
+ :style="$u.toStyle(effectiveConfig.titleStyle)"
21
+ >
22
+ {{ effectiveConfig.title }}
23
+ </view>
24
+ <view class="u-model__content">
25
+ <view v-if="slots.default" :style="$u.toStyle(effectiveConfig.contentStyle)">
26
+ <slot />
27
+ </view>
28
+ <view v-else class="u-model__content__message" :style="$u.toStyle(effectiveConfig.contentStyle)">
29
+ <text>{{ effectiveConfig.content }}</text>
30
+ </view>
31
+ </view>
32
+ <view
33
+ v-if="effectiveConfig.showCancelButton || effectiveConfig.showConfirmButton"
34
+ class="u-model__footer u-border-top"
35
+ >
36
+ <view
37
+ v-if="effectiveConfig.showCancelButton"
38
+ :hover-stay-time="100"
39
+ hover-class="u-model__btn--hover"
40
+ class="u-model__footer__button"
41
+ :style="$u.toStyle(cancelBtnStyle)"
42
+ @tap="cancel"
43
+ >
44
+ {{ effectiveConfig.cancelText }}
45
+ </view>
46
+ <view
47
+ v-if="effectiveConfig.showConfirmButton || slots['confirm-button']"
48
+ :class="['u-model__footer__button', effectiveConfig.showCancelButton ? 'u-border-left' : '']"
49
+ :hover-stay-time="100"
50
+ :hover-class="effectiveConfig.asyncClose ? 'none' : 'u-model__btn--hover'"
51
+ :style="[confirmBtnStyle]"
52
+ @tap="confirm"
53
+ >
54
+ <slot v-if="slots['confirm-button']" name="confirm-button"></slot>
55
+ <template v-else>
56
+ <u-loading mode="circle" :color="effectiveConfig.confirmColor" v-if="loading"></u-loading>
57
+ <template v-else>
58
+ {{ effectiveConfig.confirmText }}
59
+ </template>
60
+ </template>
61
+ </view>
62
+ </view>
63
+ </view>
64
+ </u-popup>
65
+ </view>
66
+ </template>
67
+
68
+ <script lang="ts">
69
+ export default {
70
+ name: 'u-modal',
71
+ options: {
72
+ addGlobalClass: true,
73
+ // #ifndef MP-TOUTIAO
74
+ virtualHost: true,
75
+ // #endif
76
+ styleIsolation: 'shared'
77
+ }
78
+ };
79
+ </script>
80
+
81
+ <script setup lang="ts">
82
+ import { ref, computed, watch, useSlots, onMounted, onBeforeUnmount } from 'vue';
83
+ import { onPageHide, onPageShow } from '@dcloudio/uni-app';
84
+ import { $u, useLocale } from '../..';
85
+ import { ModalProps } from './types';
86
+ import {
87
+ U_MODAL_EVENT_CLEAR_LOADING,
88
+ U_MODAL_EVENT_HIDE,
89
+ U_MODAL_EVENT_SHOW,
90
+ U_MODAL_GLOBAL_EVENT_CLEAR_LOADING,
91
+ U_MODAL_GLOBAL_EVENT_HIDE,
92
+ U_MODAL_GLOBAL_EVENT_SHOW,
93
+ getEventWithCurrentPage,
94
+ type ModalPayload
95
+ } from './service';
96
+ import uLoading from '../u-loading/u-loading.vue';
97
+ import uPopup from '../u-popup/u-popup.vue';
98
+
99
+ /**
100
+ * modal 模态框
101
+ * @description 弹出模态框,常用于消息提示、消息确认、在当前页面内完成特定的交互操作
102
+ * @tutorial https://uviewpro.cn/zh/components/modal.html
103
+ * @property {Boolean} value 是否显示模态框
104
+ * @property {String | Number} z-index 层级
105
+ * @property {String} title 模态框标题(默认"提示")
106
+ * @property {String | Number} width 模态框宽度(默认600)
107
+ * @property {String} content 模态框内容(默认"内容")
108
+ * @property {Boolean} show-title 是否显示标题(默认true)
109
+ * @property {Boolean} async-close 是否异步关闭,只对确定按钮有效(默认false)
110
+ * @property {Boolean} show-confirm-button 是否显示确认按钮(默认true)
111
+ * @property {String | Number} negative-top modal往上偏移的值
112
+ * @property {Boolean} show-cancel-button 是否显示取消按钮(默认false)
113
+ * @property {Boolean} mask-close-able 是否允许点击遮罩关闭modal(默认false)
114
+ * @property {String} confirm-text 确认按钮的文字内容(默认"确认")
115
+ * @property {String} cancel-text 取消按钮的文字内容(默认"取消")
116
+ * @property {String} cancel-color 取消按钮的颜色(默认"var(--u-content-color)")
117
+ * @property {String} confirm-color 确认按钮的文字内容(默认主题色primary)
118
+ * @property {String | Number} border-radius 模态框圆角值,单位rpx(默认16)
119
+ * @property {Object} title-style 自定义标题样式,对象形式
120
+ * @property {Object} content-style 自定义内容样式,对象形式
121
+ * @property {Object} cancel-style 自定义取消按钮样式,对象形式
122
+ * @property {Object} confirm-style 自定义确认按钮样式,对象形式
123
+ * @property {Boolean} zoom 是否开启缩放模式(默认true)
124
+ * @event {Function} confirm 确认按钮被点击
125
+ * @event {Function} cancel 取消按钮被点击
126
+ * @example <u-modal :src="title" :content="content"></u-modal>
127
+ */
128
+
129
+ const props = defineProps(ModalProps);
130
+ const emit = defineEmits(['update:modelValue', 'confirm', 'cancel']);
131
+ const slots = useSlots();
132
+
133
+ const { t } = useLocale();
134
+
135
+ // 是否已经初始化事件监听
136
+ const isInit = ref(false);
137
+ // 确认按钮是否正在加载中
138
+ const loading = ref(false);
139
+ const isGlobal = computed(() => !!props.global);
140
+ const isPage = computed(() => !!props.page);
141
+ const showEvent = computed(() =>
142
+ isGlobal.value
143
+ ? U_MODAL_GLOBAL_EVENT_SHOW
144
+ : isPage.value
145
+ ? getEventWithCurrentPage(U_MODAL_EVENT_SHOW, props.page)
146
+ : ''
147
+ );
148
+ const hideEvent = computed(() =>
149
+ isGlobal.value
150
+ ? U_MODAL_GLOBAL_EVENT_HIDE
151
+ : isPage.value
152
+ ? getEventWithCurrentPage(U_MODAL_EVENT_HIDE, props.page)
153
+ : ''
154
+ );
155
+ const clearLoadingEvent = computed(() =>
156
+ isGlobal.value
157
+ ? U_MODAL_GLOBAL_EVENT_CLEAR_LOADING
158
+ : isPage.value
159
+ ? getEventWithCurrentPage(U_MODAL_EVENT_CLEAR_LOADING, props.page)
160
+ : ''
161
+ );
162
+
163
+ // 存储用户传入的回调函数
164
+ let userOnConfirm: (() => void) | null = null;
165
+ let userOnCancel: (() => void) | null = null;
166
+
167
+ // 需要与 effectiveConfig 合并的 props 键名列表(用于函数式调用)
168
+ const MERGE_PROPS_KEYS = [
169
+ 'title',
170
+ 'content',
171
+ 'showTitle',
172
+ 'showConfirmButton',
173
+ 'showCancelButton',
174
+ 'confirmText',
175
+ 'cancelText',
176
+ 'confirmColor',
177
+ 'cancelColor',
178
+ 'confirmStyle',
179
+ 'cancelStyle',
180
+ 'titleStyle',
181
+ 'contentStyle',
182
+ 'asyncClose',
183
+ 'borderRadius',
184
+ 'width',
185
+ 'zoom',
186
+ 'maskCloseAble',
187
+ 'negativeTop',
188
+ 'zIndex',
189
+ 'customStyle',
190
+ 'customClass'
191
+ ] as const;
192
+
193
+ // 函数式调用时的临时配置
194
+ const tempConfig = ref<Partial<ModalPayload>>({});
195
+
196
+ // 函数式调用时的内部显示状态(用于 global 模式)
197
+ const internalShow = ref(false);
198
+
199
+ // 国际化计算属性
200
+ const getTitle = computed(() => props.title || t('uModal.title'));
201
+ const getConfirmText = computed(() => props.confirmText || t('uModal.confirmText'));
202
+ const getCancelText = computed(() => props.cancelText || t('uModal.cancelText'));
203
+
204
+ // 有效的配置(函数式调用时合并 tempConfig 和 props,v-model 时使用 props)
205
+ const effectiveConfig = computed(() => {
206
+ // 如果有临时配置(函数式调用),合并用户配置与 props 默认值
207
+ if (Object.keys(tempConfig.value).length > 0) {
208
+ const result: Record<string, any> = {};
209
+ for (const key of MERGE_PROPS_KEYS) {
210
+ // 用户配置优先,否则使用 props 默认值
211
+ result[key] = (tempConfig.value as Record<string, any>)[key] ?? (props as Record<string, any>)[key];
212
+ }
213
+ result.zIndex = tempConfig.value.zIndex ?? props.zIndex ?? $u.zIndex.popup;
214
+ // 处理国际化字段
215
+ result.title = result.title || t('uModal.title');
216
+ result.confirmText = result.confirmText || t('uModal.confirmText');
217
+ result.cancelText = result.cancelText || t('uModal.cancelText');
218
+ return result;
219
+ }
220
+ // v-model 直接控制时使用 props,但处理国际化
221
+ return {
222
+ ...props,
223
+ title: getTitle.value,
224
+ confirmText: getConfirmText.value,
225
+ cancelText: getCancelText.value
226
+ };
227
+ });
228
+ // 取消按钮样式
229
+ const cancelBtnStyle = computed(() => {
230
+ return Object.assign({ color: effectiveConfig.value.cancelColor }, effectiveConfig.value.cancelStyle);
231
+ });
232
+ // 确认按钮样式
233
+ const confirmBtnStyle = computed(() => {
234
+ return Object.assign({ color: effectiveConfig.value.confirmColor }, effectiveConfig.value.confirmStyle);
235
+ });
236
+ // 弹窗的样式
237
+ const uZIndex = computed(() => effectiveConfig.value.zIndex ?? $u.zIndex.popup);
238
+ // 是否使用内部状态控制显示(global 模式)
239
+ const useInternalShow = computed(() => isGlobal.value || isPage.value);
240
+ // 最终显示状态
241
+ const finalShow = computed(() => {
242
+ if (useInternalShow.value) {
243
+ return internalShow.value;
244
+ }
245
+ return props.modelValue;
246
+ });
247
+ // u-popup 绑定的值
248
+ const popupValue = computed({
249
+ get: () => finalShow.value,
250
+ set: (val: boolean) => {
251
+ if (useInternalShow.value) {
252
+ internalShow.value = val;
253
+ } else {
254
+ emit('update:modelValue', val);
255
+ }
256
+ }
257
+ });
258
+
259
+ // 如果是异步关闭时,外部修改v-model的值为false时,重置内部的loading状态,避免下次打开的时候,状态混乱
260
+ watch(
261
+ () => popupValue.value,
262
+ n => {
263
+ if (n === true) loading.value = false;
264
+ }
265
+ );
266
+
267
+ /**
268
+ * 确认按钮点击事件
269
+ */
270
+ function confirm() {
271
+ // 先调用回调,再重置配置
272
+ const onConfirm = userOnConfirm;
273
+ // 异步关闭
274
+ if (effectiveConfig.value.asyncClose) {
275
+ loading.value = true;
276
+ } else {
277
+ popupValue.value = false;
278
+ // 延迟重置配置,避免闪屏
279
+ setTimeout(() => resetTempConfig(), 300);
280
+ }
281
+ emit('confirm');
282
+ // 调用函数式调用时用户传入的回调
283
+ onConfirm?.();
284
+ }
285
+
286
+ /**
287
+ * 取消按钮点击事件
288
+ */
289
+ function cancel() {
290
+ // 先调用回调,再重置配置
291
+ const onCancel = userOnCancel;
292
+ // 延迟重置配置,避免闪屏
293
+ setTimeout(() => resetTempConfig(), 300);
294
+ emit('cancel');
295
+ popupValue.value = false;
296
+ // 调用函数式调用时用户传入的回调
297
+ onCancel?.();
298
+ // 目前popup弹窗关闭有一个延时操作,此处做一个延时
299
+ // 避免确认按钮文字变成了"确定"字样,modal还没消失,造成视觉不好的效果
300
+ setTimeout(() => {
301
+ loading.value = false;
302
+ }, 300);
303
+ }
304
+
305
+ /**
306
+ * 点击遮罩关闭modal,设置v-model的值为false,否则无法第二次弹起modal
307
+ */
308
+ function popupClose() {
309
+ popupValue.value = false;
310
+ resetTempConfig();
311
+ }
312
+
313
+ /**
314
+ * 清除加载中的状态
315
+ */
316
+ function clearLoading() {
317
+ loading.value = false;
318
+ }
319
+
320
+ /**
321
+ * 函数式调用显示 modal
322
+ */
323
+ function onServiceShow(payload: ModalPayload) {
324
+ // 保存回调函数
325
+ userOnConfirm = payload.onConfirm ?? null;
326
+ userOnCancel = payload.onCancel ?? null;
327
+
328
+ // 只保存用户传入的配置(过滤掉回调)
329
+ const { onConfirm, onCancel, ...rest } = payload;
330
+ tempConfig.value = rest;
331
+
332
+ // 使用内部状态控制显示
333
+ internalShow.value = true;
334
+ }
335
+
336
+ /**
337
+ * 函数式调用关闭 modal
338
+ */
339
+ function onServiceHide() {
340
+ internalShow.value = false;
341
+ resetTempConfig();
342
+ }
343
+
344
+ /**
345
+ * 重置临时配置
346
+ */
347
+ function resetTempConfig() {
348
+ tempConfig.value = {};
349
+ userOnConfirm = null;
350
+ userOnCancel = null;
351
+ }
352
+
353
+ // 开始监听事件
354
+ function startListeners() {
355
+ if (isInit.value) {
356
+ return;
357
+ }
358
+ isInit.value = true;
359
+ if (showEvent.value) {
360
+ uni?.$on && uni.$on(showEvent.value, onServiceShow);
361
+ }
362
+ if (hideEvent.value) {
363
+ uni?.$on && uni.$on(hideEvent.value, onServiceHide);
364
+ }
365
+ if (clearLoadingEvent.value) {
366
+ uni?.$on && uni.$on(clearLoadingEvent.value, clearLoading);
367
+ }
368
+ }
369
+
370
+ // 停止监听事件
371
+ function stopListeners() {
372
+ if (!isInit.value) {
373
+ return;
374
+ }
375
+ isInit.value = false;
376
+ if (showEvent.value) {
377
+ uni?.$off && uni.$off(showEvent.value, onServiceShow);
378
+ }
379
+ if (hideEvent.value) {
380
+ uni?.$off && uni.$off(hideEvent.value, onServiceHide);
381
+ }
382
+ if (clearLoadingEvent.value) {
383
+ uni?.$off && uni.$off(clearLoadingEvent.value, clearLoading);
384
+ }
385
+ }
386
+
387
+ // 移除所有事件监听
388
+ function removeAllListeners() {
389
+ if (showEvent.value) {
390
+ uni?.$off && uni.$off(showEvent.value);
391
+ }
392
+ if (hideEvent.value) {
393
+ uni?.$off && uni.$off(hideEvent.value);
394
+ }
395
+ if (clearLoadingEvent.value) {
396
+ uni?.$off && uni.$off(clearLoadingEvent.value);
397
+ }
398
+ }
399
+
400
+ onPageShow(() => {
401
+ startListeners();
402
+ });
403
+
404
+ onPageHide(() => {
405
+ stopListeners();
406
+ });
407
+
408
+ onMounted(() => {
409
+ startListeners();
410
+ });
411
+
412
+ onBeforeUnmount(() => {
413
+ stopListeners();
414
+ });
415
+
416
+ defineExpose({
417
+ clearLoading
418
+ });
419
+ </script>
420
+
421
+ <style lang="scss" scoped>
422
+ @import '../../libs/css/style.components.scss';
423
+
424
+ .u-model {
425
+ height: auto;
426
+ overflow: hidden;
427
+ font-size: 32rpx;
428
+ background-color: var(--u-bg-white);
429
+
430
+ &__btn--hover {
431
+ background-color: rgb(230, 230, 230);
432
+ }
433
+
434
+ &__title {
435
+ padding-top: 48rpx;
436
+ font-weight: 500;
437
+ text-align: center;
438
+ color: $u-main-color;
439
+ }
440
+
441
+ &__content {
442
+ &__message {
443
+ padding: 48rpx;
444
+ font-size: 30rpx;
445
+ text-align: center;
446
+ color: $u-content-color;
447
+ }
448
+ }
449
+
450
+ &__footer {
451
+ @include vue-flex;
452
+
453
+ &__button {
454
+ flex: 1;
455
+ height: 100rpx;
456
+ line-height: 100rpx;
457
+ font-size: 32rpx;
458
+ box-sizing: border-box;
459
+ cursor: pointer;
460
+ text-align: center;
461
+ border-radius: 4rpx;
462
+ }
463
+ }
464
+ }
465
+ </style>