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,291 +1,308 @@
1
- <template>
2
- <view class="u-swiper-wrap" :style="{ borderRadius: `${borderRadius}rpx` }">
3
- <swiper
4
- :current="elCurrent"
5
- @change="change"
6
- @animationfinish="animationfinish"
7
- :interval="interval"
8
- :circular="circular"
9
- :duration="duration"
10
- :autoplay="autoplay"
11
- :previous-margin="effect3d ? effect3dPreviousMargin + 'rpx' : '0'"
12
- :next-margin="effect3d ? effect3dPreviousMargin + 'rpx' : '0'"
13
- :style="{ height: height + 'rpx', backgroundColor: bgColor }"
14
- >
15
- <swiper-item class="u-swiper-item" v-for="(item, index) in list" :key="index">
16
- <view
17
- class="u-list-image-wrap"
18
- @tap.stop.prevent="listClick(index)"
19
- :class="[uCurrent != index ? 'u-list-scale' : '']"
20
- :style="{
21
- borderRadius: `${borderRadius}rpx`,
22
- transform: effect3d && uCurrent != index ? 'scaleY(0.9)' : 'scaleY(1)',
23
- margin: effect3d && uCurrent != index ? '0 20rpx' : 0
24
- }"
25
- >
26
- <image class="u-swiper-image" :src="item[name] || item" :mode="imgMode"></image>
27
- <view
28
- v-if="title && item.title"
29
- class="u-swiper-title u-line-1"
30
- :style="[{ 'padding-bottom': titlePaddingBottom }, titleStyle]"
31
- >
32
- {{ item.title }}
33
- </view>
34
- </view>
35
- </swiper-item>
36
- </swiper>
37
- <view
38
- class="u-swiper-indicator"
39
- :style="{
40
- top:
41
- indicatorPos == 'topLeft' || indicatorPos == 'topCenter' || indicatorPos == 'topRight'
42
- ? '12rpx'
43
- : 'auto',
44
- bottom:
45
- indicatorPos == 'bottomLeft' || indicatorPos == 'bottomCenter' || indicatorPos == 'bottomRight'
46
- ? '12rpx'
47
- : 'auto',
48
- justifyContent: justifyContent,
49
- padding: `0 ${effect3d ? '74rpx' : '24rpx'}`
50
- }"
51
- >
52
- <block v-if="mode == 'rect'">
53
- <view
54
- class="u-indicator-item-rect"
55
- :class="{ 'u-indicator-item-rect-active': index == uCurrent }"
56
- v-for="(item, index) in list"
57
- :key="index"
58
- ></view>
59
- </block>
60
- <block v-if="mode == 'dot'">
61
- <view
62
- class="u-indicator-item-dot"
63
- :class="{ 'u-indicator-item-dot-active': index == uCurrent }"
64
- v-for="(item, index) in list"
65
- :key="index"
66
- ></view>
67
- </block>
68
- <block v-if="mode == 'round'">
69
- <view
70
- class="u-indicator-item-round"
71
- :class="{ 'u-indicator-item-round-active': index == uCurrent }"
72
- v-for="(item, index) in list"
73
- :key="index"
74
- ></view>
75
- </block>
76
- <block v-if="mode == 'number'">
77
- <view class="u-indicator-item-number">{{ uCurrent + 1 }}/{{ list.length }}</view>
78
- </block>
79
- </view>
80
- </view>
81
- </template>
82
-
83
- <script setup lang="ts">
84
- import { ref, computed, watch } from 'vue';
85
- import { SwiperProps } from './types';
86
-
87
- defineOptions({ name: 'u-swiper' });
88
- /**
89
- * swiper 轮播图
90
- * @description 该组件一般用于导航轮播,广告展示等场景,可开箱即用
91
- * @tutorial https://uviewpro.cn/zh/components/swiper.html
92
- * @property {Array} list 轮播图数据,见官网"基本使用"说明
93
- * @property {Boolean} title 是否显示标题文字,需要配合list参数,见官网说明(默认false)
94
- * @property {String} mode 指示器模式,见官网说明(默认round)
95
- * @property {String|Number} height 轮播图组件高度,单位rpx(默认250)
96
- * @property {String} indicator-pos 指示器的位置(默认bottomCenter)
97
- * @property {Boolean} effect3d 是否开启3D效果(默认false)
98
- * @property {Boolean} autoplay 是否自动播放(默认true)
99
- * @property {String|Number} interval 自动轮播时间间隔,单位ms(默认2500)
100
- * @property {Boolean} circular 是否衔接播放,见官网说明(默认true)
101
- * @property {String} bg-color 背景颜色(默认#f3f4f6)
102
- * @property {String|Number} border-radius 轮播图圆角值,单位rpx(默认8)
103
- * @property {Object} title-style 自定义标题样式
104
- * @property {String|Number} effect3d-previous-margin mode = true模式的情况下,激活项与前后项之间的距离,单位rpx(默认50)
105
- * @property {String} img-mode 图片的裁剪模式,详见image组件裁剪模式(默认aspectFill)
106
- * @event {Function} click 点击轮播图时触发
107
- * @example <u-swiper :list="list" mode="dot" indicator-pos="bottomRight"></u-swiper>
108
- */
109
-
110
- const props = defineProps(SwiperProps);
111
- const emit = defineEmits(['click', 'change']);
112
-
113
- // 当前活跃的swiper-item的index
114
- const uCurrent = ref(Number(props.current));
115
-
116
- // 监听list变化,重置uCurrent值,避免溢出
117
- watch(
118
- () => props.list,
119
- (nVal, oVal) => {
120
- if (nVal.length !== oVal.length) uCurrent.value = 0;
121
- }
122
- );
123
- // 监听外部current的变化,实时修改内部依赖于此测uCurrent值
124
- watch(
125
- () => props.current,
126
- n => {
127
- uCurrent.value = Number(n);
128
- }
129
- );
130
-
131
- // 容器 justifyContent
132
- const justifyContent = computed(() => {
133
- if (props.indicatorPos == 'topLeft' || props.indicatorPos == 'bottomLeft') return 'flex-start';
134
- if (props.indicatorPos == 'topCenter' || props.indicatorPos == 'bottomCenter') return 'center';
135
- if (props.indicatorPos == 'topRight' || props.indicatorPos == 'bottomRight') return 'flex-end';
136
- return 'center';
137
- });
138
-
139
- // 标题下边距
140
- const titlePaddingBottom = computed(() => {
141
- if (props.mode == 'none') return '12rpx';
142
- if (['bottomLeft', 'bottomCenter', 'bottomRight'].includes(props.indicatorPos) && props.mode == 'number') {
143
- return '60rpx';
144
- } else if (['bottomLeft', 'bottomCenter', 'bottomRight'].includes(props.indicatorPos) && props.mode != 'number') {
145
- return '40rpx';
146
- } else {
147
- return '12rpx';
148
- }
149
- });
150
-
151
- // swiper组件current参数只接受Number类型
152
- const elCurrent = computed(() => Number(props.current));
153
-
154
- /**
155
- * 点击轮播图项
156
- */
157
- function listClick(index: number) {
158
- emit('click', index);
159
- }
160
-
161
- /**
162
- * swiper change事件
163
- */
164
- function change(e: any) {
165
- const current = e.detail.current;
166
- uCurrent.value = current;
167
- emit('change', current);
168
- }
169
-
170
- /**
171
- * swiper animationfinish事件
172
- * 头条小程序不支持animationfinish事件,改由change事件
173
- * 暂不监听此事件,因为不再给swiper绑定uCurrent属性
174
- */
175
- function animationfinish(e: any) {
176
- // #ifndef MP-TOUTIAO
177
- // uCurrent.value = e.detail.current
178
- // #endif
179
- }
180
-
181
- defineExpose({ listClick, change, animationfinish });
182
- </script>
183
-
184
- <style lang="scss" scoped>
185
- @import '../../libs/css/style.components.scss';
186
-
187
- .u-swiper-wrap {
188
- position: relative;
189
- overflow: hidden;
190
- transform: translateY(0);
191
- }
192
-
193
- .u-swiper-image {
194
- width: 100%;
195
- will-change: transform;
196
- height: 100%;
197
- /* #ifndef APP-NVUE */
198
- display: block;
199
- /* #endif */
200
- /* #ifdef H5 */
201
- pointer-events: none;
202
- /* #endif */
203
- }
204
-
205
- .u-swiper-indicator {
206
- padding: 0 24rpx;
207
- position: absolute;
208
- @include vue-flex;
209
- width: 100%;
210
- z-index: 1;
211
- }
212
-
213
- .u-indicator-item-rect {
214
- width: 26rpx;
215
- height: 8rpx;
216
- margin: 0 6rpx;
217
- transition: all 0.5s;
218
- background-color: rgba(0, 0, 0, 0.3);
219
- }
220
-
221
- .u-indicator-item-rect-active {
222
- background-color: rgba(255, 255, 255, 0.8);
223
- }
224
-
225
- .u-indicator-item-dot {
226
- width: 14rpx;
227
- height: 14rpx;
228
- margin: 0 6rpx;
229
- border-radius: 20rpx;
230
- transition: all 0.5s;
231
- background-color: rgba(0, 0, 0, 0.3);
232
- }
233
-
234
- .u-indicator-item-dot-active {
235
- background-color: rgba(255, 255, 255, 0.8);
236
- }
237
-
238
- .u-indicator-item-round {
239
- width: 14rpx;
240
- height: 14rpx;
241
- margin: 0 6rpx;
242
- border-radius: 20rpx;
243
- transition: all 0.5s;
244
- background-color: rgba(0, 0, 0, 0.3);
245
- }
246
-
247
- .u-indicator-item-round-active {
248
- width: 34rpx;
249
- background-color: rgba(255, 255, 255, 0.8);
250
- }
251
-
252
- .u-indicator-item-number {
253
- padding: 6rpx 16rpx;
254
- line-height: 1;
255
- background-color: rgba(0, 0, 0, 0.3);
256
- border-radius: 100rpx;
257
- font-size: 26rpx;
258
- color: rgba(255, 255, 255, 0.8);
259
- }
260
-
261
- .u-list-scale {
262
- transform-origin: center center;
263
- }
264
-
265
- .u-list-image-wrap {
266
- width: 100%;
267
- height: 100%;
268
- flex: 1;
269
- transition: all 0.5s;
270
- overflow: hidden;
271
- box-sizing: content-box;
272
- position: relative;
273
- }
274
-
275
- .u-swiper-title {
276
- position: absolute;
277
- background-color: rgba(0, 0, 0, 0.3);
278
- bottom: 0;
279
- left: 0;
280
- width: 100%;
281
- font-size: 28rpx;
282
- padding: 12rpx 24rpx;
283
- color: rgba(255, 255, 255, 0.9);
284
- }
285
-
286
- .u-swiper-item {
287
- @include vue-flex;
288
- overflow: hidden;
289
- align-items: center;
290
- }
291
- </style>
1
+ <template>
2
+ <view
3
+ class="u-swiper-wrap"
4
+ :style="$u.toStyle({ borderRadius: `${borderRadius}rpx` }, customStyle)"
5
+ :class="customClass"
6
+ >
7
+ <swiper
8
+ :current="elCurrent"
9
+ @change="change"
10
+ @animationfinish="animationfinish"
11
+ :interval="interval"
12
+ :circular="circular"
13
+ :duration="duration"
14
+ :autoplay="autoplay"
15
+ :previous-margin="effect3d ? effect3dPreviousMargin + 'rpx' : '0'"
16
+ :next-margin="effect3d ? effect3dPreviousMargin + 'rpx' : '0'"
17
+ :style="{ height: height + 'rpx', backgroundColor: bgColor }"
18
+ >
19
+ <swiper-item class="u-swiper-item" v-for="(item, index) in list" :key="index">
20
+ <view
21
+ class="u-list-image-wrap"
22
+ @tap.stop.prevent="listClick(index)"
23
+ :class="[uCurrent != index ? 'u-list-scale' : '']"
24
+ :style="{
25
+ borderRadius: `${borderRadius}rpx`,
26
+ transform: effect3d && uCurrent != index ? 'scaleY(0.9)' : 'scaleY(1)',
27
+ margin: effect3d && uCurrent != index ? '0 20rpx' : 0
28
+ }"
29
+ >
30
+ <image class="u-swiper-image" :src="item[name] || item" :mode="imgMode"></image>
31
+ <view
32
+ v-if="title && item.title"
33
+ class="u-swiper-title u-line-1"
34
+ :style="[{ 'padding-bottom': titlePaddingBottom }, titleStyle]"
35
+ >
36
+ {{ item.title }}
37
+ </view>
38
+ </view>
39
+ </swiper-item>
40
+ </swiper>
41
+ <view
42
+ class="u-swiper-indicator"
43
+ :style="{
44
+ top:
45
+ indicatorPos == 'topLeft' || indicatorPos == 'topCenter' || indicatorPos == 'topRight'
46
+ ? '12rpx'
47
+ : 'auto',
48
+ bottom:
49
+ indicatorPos == 'bottomLeft' || indicatorPos == 'bottomCenter' || indicatorPos == 'bottomRight'
50
+ ? '12rpx'
51
+ : 'auto',
52
+ justifyContent: justifyContent,
53
+ padding: `0 ${effect3d ? '74rpx' : '24rpx'}`
54
+ }"
55
+ >
56
+ <block v-if="mode == 'rect'">
57
+ <view
58
+ class="u-indicator-item-rect"
59
+ :class="{ 'u-indicator-item-rect-active': index == uCurrent }"
60
+ v-for="(item, index) in list"
61
+ :key="index"
62
+ ></view>
63
+ </block>
64
+ <block v-if="mode == 'dot'">
65
+ <view
66
+ class="u-indicator-item-dot"
67
+ :class="{ 'u-indicator-item-dot-active': index == uCurrent }"
68
+ v-for="(item, index) in list"
69
+ :key="index"
70
+ ></view>
71
+ </block>
72
+ <block v-if="mode == 'round'">
73
+ <view
74
+ class="u-indicator-item-round"
75
+ :class="{ 'u-indicator-item-round-active': index == uCurrent }"
76
+ v-for="(item, index) in list"
77
+ :key="index"
78
+ ></view>
79
+ </block>
80
+ <block v-if="mode == 'number'">
81
+ <view class="u-indicator-item-number">{{ uCurrent + 1 }}/{{ list.length }}</view>
82
+ </block>
83
+ </view>
84
+ </view>
85
+ </template>
86
+
87
+ <script lang="ts">
88
+ export default {
89
+ name: 'u-swiper',
90
+ options: {
91
+ addGlobalClass: true,
92
+ // #ifndef MP-TOUTIAO
93
+ virtualHost: true,
94
+ // #endif
95
+ styleIsolation: 'shared'
96
+ }
97
+ };
98
+ </script>
99
+
100
+ <script setup lang="ts">
101
+ import { ref, computed, watch } from 'vue';
102
+ import { SwiperProps } from './types';
103
+ import { $u } from '../..';
104
+
105
+ /**
106
+ * swiper 轮播图
107
+ * @description 该组件一般用于导航轮播,广告展示等场景,可开箱即用
108
+ * @tutorial https://uviewpro.cn/zh/components/swiper.html
109
+ * @property {Array} list 轮播图数据,见官网"基本使用"说明
110
+ * @property {Boolean} title 是否显示标题文字,需要配合list参数,见官网说明(默认false)
111
+ * @property {String} mode 指示器模式,见官网说明(默认round)
112
+ * @property {String|Number} height 轮播图组件高度,单位rpx(默认250)
113
+ * @property {String} indicator-pos 指示器的位置(默认bottomCenter)
114
+ * @property {Boolean} effect3d 是否开启3D效果(默认false)
115
+ * @property {Boolean} autoplay 是否自动播放(默认true)
116
+ * @property {String|Number} interval 自动轮播时间间隔,单位ms(默认2500)
117
+ * @property {Boolean} circular 是否衔接播放,见官网说明(默认true)
118
+ * @property {String} bg-color 背景颜色(默认#f3f4f6)
119
+ * @property {String|Number} border-radius 轮播图圆角值,单位rpx(默认8)
120
+ * @property {Object} title-style 自定义标题样式
121
+ * @property {String|Number} effect3d-previous-margin mode = true模式的情况下,激活项与前后项之间的距离,单位rpx(默认50)
122
+ * @property {String} img-mode 图片的裁剪模式,详见image组件裁剪模式(默认aspectFill)
123
+ * @event {Function} click 点击轮播图时触发
124
+ * @example <u-swiper :list="list" mode="dot" indicator-pos="bottomRight"></u-swiper>
125
+ */
126
+
127
+ const props = defineProps(SwiperProps);
128
+ const emit = defineEmits(['click', 'change']);
129
+
130
+ // 当前活跃的swiper-item的index
131
+ const uCurrent = ref(Number(props.current));
132
+
133
+ // 监听list变化,重置uCurrent值,避免溢出
134
+ watch(
135
+ () => props.list,
136
+ (nVal, oVal) => {
137
+ if (nVal.length !== oVal.length) uCurrent.value = 0;
138
+ }
139
+ );
140
+ // 监听外部current的变化,实时修改内部依赖于此测uCurrent值
141
+ watch(
142
+ () => props.current,
143
+ n => {
144
+ uCurrent.value = Number(n);
145
+ }
146
+ );
147
+
148
+ // 容器 justifyContent
149
+ const justifyContent = computed(() => {
150
+ if (props.indicatorPos == 'topLeft' || props.indicatorPos == 'bottomLeft') return 'flex-start';
151
+ if (props.indicatorPos == 'topCenter' || props.indicatorPos == 'bottomCenter') return 'center';
152
+ if (props.indicatorPos == 'topRight' || props.indicatorPos == 'bottomRight') return 'flex-end';
153
+ return 'center';
154
+ });
155
+
156
+ // 标题下边距
157
+ const titlePaddingBottom = computed(() => {
158
+ if (props.mode == 'none') return '12rpx';
159
+ if (['bottomLeft', 'bottomCenter', 'bottomRight'].includes(props.indicatorPos) && props.mode == 'number') {
160
+ return '60rpx';
161
+ } else if (['bottomLeft', 'bottomCenter', 'bottomRight'].includes(props.indicatorPos) && props.mode != 'number') {
162
+ return '40rpx';
163
+ } else {
164
+ return '12rpx';
165
+ }
166
+ });
167
+
168
+ // swiper组件current参数只接受Number类型
169
+ const elCurrent = computed(() => Number(props.current));
170
+
171
+ /**
172
+ * 点击轮播图项
173
+ */
174
+ function listClick(index: number) {
175
+ emit('click', index);
176
+ }
177
+
178
+ /**
179
+ * swiper change事件
180
+ */
181
+ function change(e: any) {
182
+ const current = e.detail.current;
183
+ uCurrent.value = current;
184
+ emit('change', current);
185
+ }
186
+
187
+ /**
188
+ * swiper animationfinish事件
189
+ * 头条小程序不支持animationfinish事件,改由change事件
190
+ * 暂不监听此事件,因为不再给swiper绑定uCurrent属性
191
+ */
192
+ function animationfinish(e: any) {
193
+ // #ifndef MP-TOUTIAO
194
+ // uCurrent.value = e.detail.current
195
+ // #endif
196
+ }
197
+
198
+ defineExpose({ listClick, change, animationfinish });
199
+ </script>
200
+
201
+ <style lang="scss" scoped>
202
+ @import '../../libs/css/style.components.scss';
203
+
204
+ .u-swiper-wrap {
205
+ position: relative;
206
+ overflow: hidden;
207
+ transform: translateY(0);
208
+ }
209
+
210
+ .u-swiper-image {
211
+ width: 100%;
212
+ will-change: transform;
213
+ height: 100%;
214
+ /* #ifndef APP-NVUE */
215
+ display: block;
216
+ /* #endif */
217
+ /* #ifdef H5 */
218
+ pointer-events: none;
219
+ /* #endif */
220
+ }
221
+
222
+ .u-swiper-indicator {
223
+ padding: 0 24rpx;
224
+ position: absolute;
225
+ @include vue-flex;
226
+ width: 100%;
227
+ z-index: 1;
228
+ }
229
+
230
+ .u-indicator-item-rect {
231
+ width: 26rpx;
232
+ height: 8rpx;
233
+ margin: 0 6rpx;
234
+ transition: all 0.5s;
235
+ background-color: rgba(0, 0, 0, 0.3);
236
+ }
237
+
238
+ .u-indicator-item-rect-active {
239
+ background-color: rgba(255, 255, 255, 0.8);
240
+ }
241
+
242
+ .u-indicator-item-dot {
243
+ width: 14rpx;
244
+ height: 14rpx;
245
+ margin: 0 6rpx;
246
+ border-radius: 20rpx;
247
+ transition: all 0.5s;
248
+ background-color: rgba(0, 0, 0, 0.3);
249
+ }
250
+
251
+ .u-indicator-item-dot-active {
252
+ background-color: rgba(255, 255, 255, 0.8);
253
+ }
254
+
255
+ .u-indicator-item-round {
256
+ width: 14rpx;
257
+ height: 14rpx;
258
+ margin: 0 6rpx;
259
+ border-radius: 20rpx;
260
+ transition: all 0.5s;
261
+ background-color: rgba(0, 0, 0, 0.3);
262
+ }
263
+
264
+ .u-indicator-item-round-active {
265
+ width: 34rpx;
266
+ background-color: rgba(255, 255, 255, 0.8);
267
+ }
268
+
269
+ .u-indicator-item-number {
270
+ padding: 6rpx 16rpx;
271
+ line-height: 1;
272
+ background-color: rgba(0, 0, 0, 0.3);
273
+ border-radius: 100rpx;
274
+ font-size: 26rpx;
275
+ color: rgba(255, 255, 255, 0.8);
276
+ }
277
+
278
+ .u-list-scale {
279
+ transform-origin: center center;
280
+ }
281
+
282
+ .u-list-image-wrap {
283
+ width: 100%;
284
+ height: 100%;
285
+ flex: 1;
286
+ transition: all 0.5s;
287
+ overflow: hidden;
288
+ box-sizing: content-box;
289
+ position: relative;
290
+ }
291
+
292
+ .u-swiper-title {
293
+ position: absolute;
294
+ background-color: rgba(0, 0, 0, 0.3);
295
+ bottom: 0;
296
+ left: 0;
297
+ width: 100%;
298
+ font-size: 28rpx;
299
+ padding: 12rpx 24rpx;
300
+ color: rgba(255, 255, 255, 0.9);
301
+ }
302
+
303
+ .u-swiper-item {
304
+ @include vue-flex;
305
+ overflow: hidden;
306
+ align-items: center;
307
+ }
308
+ </style>