uview-pro 0.0.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 (149) hide show
  1. package/changelog.md +6 -0
  2. package/components/u-action-sheet/u-action-sheet.vue +205 -0
  3. package/components/u-alert-tips/u-alert-tips.vue +241 -0
  4. package/components/u-avatar/u-avatar.vue +220 -0
  5. package/components/u-avatar-cropper/u-avatar-cropper.vue +329 -0
  6. package/components/u-avatar-cropper/weCropper.d.ts +54 -0
  7. package/components/u-avatar-cropper/weCropper.js +1267 -0
  8. package/components/u-avatar-cropper/weCropper.ts +1254 -0
  9. package/components/u-back-top/u-back-top.vue +156 -0
  10. package/components/u-badge/u-badge.vue +189 -0
  11. package/components/u-button/u-button.vue +562 -0
  12. package/components/u-calendar/u-calendar.vue +725 -0
  13. package/components/u-car-keyboard/u-car-keyboard.vue +236 -0
  14. package/components/u-card/u-card.vue +240 -0
  15. package/components/u-cell-group/u-cell-group.vue +56 -0
  16. package/components/u-cell-item/u-cell-item.vue +245 -0
  17. package/components/u-checkbox/u-checkbox.vue +310 -0
  18. package/components/u-checkbox-group/u-checkbox-group.vue +134 -0
  19. package/components/u-circle-progress/u-circle-progress.vue +210 -0
  20. package/components/u-col/u-col.vue +135 -0
  21. package/components/u-collapse/u-collapse.vue +82 -0
  22. package/components/u-collapse-item/u-collapse-item.vue +190 -0
  23. package/components/u-column-notice/u-column-notice.vue +264 -0
  24. package/components/u-count-down/u-count-down.vue +333 -0
  25. package/components/u-count-to/u-count-to.vue +297 -0
  26. package/components/u-divider/u-divider.vue +141 -0
  27. package/components/u-dropdown/u-dropdown.vue +311 -0
  28. package/components/u-dropdown-item/u-dropdown-item.vue +135 -0
  29. package/components/u-empty/u-empty.vue +111 -0
  30. package/components/u-field/u-field.vue +469 -0
  31. package/components/u-form/u-form.vue +162 -0
  32. package/components/u-form-item/u-form-item.vue +476 -0
  33. package/components/u-full-screen/u-full-screen.vue +80 -0
  34. package/components/u-gap/u-gap.vue +48 -0
  35. package/components/u-grid/u-grid.vue +101 -0
  36. package/components/u-grid-item/u-grid-item.vue +136 -0
  37. package/components/u-icon/u-icon.vue +389 -0
  38. package/components/u-image/types.ts +48 -0
  39. package/components/u-image/u-image.vue +218 -0
  40. package/components/u-index-anchor/u-index-anchor.vue +101 -0
  41. package/components/u-index-list/u-index-list.vue +376 -0
  42. package/components/u-input/u-input.vue +462 -0
  43. package/components/u-keyboard/u-keyboard.vue +188 -0
  44. package/components/u-lazy-load/u-lazy-load.vue +288 -0
  45. package/components/u-line/u-line.vue +71 -0
  46. package/components/u-line-progress/u-line-progress.vue +128 -0
  47. package/components/u-link/u-link.vue +87 -0
  48. package/components/u-loading/u-loading.vue +111 -0
  49. package/components/u-loadmore/u-loadmore.vue +205 -0
  50. package/components/u-mask/u-mask.vue +137 -0
  51. package/components/u-message-input/u-message-input.vue +315 -0
  52. package/components/u-modal/u-modal.vue +284 -0
  53. package/components/u-navbar/u-navbar.vue +314 -0
  54. package/components/u-no-network/image.ts +2 -0
  55. package/components/u-no-network/u-no-network.vue +311 -0
  56. package/components/u-notice-bar/u-notice-bar.vue +274 -0
  57. package/components/u-number-box/u-number-box.vue +344 -0
  58. package/components/u-number-keyboard/u-number-keyboard.vue +170 -0
  59. package/components/u-parse/libs/CssHandler.js +100 -0
  60. package/components/u-parse/libs/MpHtmlParser.js +580 -0
  61. package/components/u-parse/libs/config.js +80 -0
  62. package/components/u-parse/libs/handler.wxs +22 -0
  63. package/components/u-parse/libs/trees.vue +505 -0
  64. package/components/u-parse/u-parse.vue +645 -0
  65. package/components/u-picker/u-picker.vue +808 -0
  66. package/components/u-popup/u-popup.vue +404 -0
  67. package/components/u-radio/u-radio.vue +272 -0
  68. package/components/u-radio-group/u-radio-group.vue +116 -0
  69. package/components/u-rate/u-rate.vue +349 -0
  70. package/components/u-read-more/u-read-more.vue +199 -0
  71. package/components/u-row/u-row.vue +95 -0
  72. package/components/u-row-notice/u-row-notice.vue +273 -0
  73. package/components/u-search/u-search.vue +298 -0
  74. package/components/u-section/u-section.vue +175 -0
  75. package/components/u-select/u-select.vue +387 -0
  76. package/components/u-skeleton/u-skeleton.vue +230 -0
  77. package/components/u-slider/u-slider.vue +293 -0
  78. package/components/u-steps/u-steps.vue +200 -0
  79. package/components/u-sticky/u-sticky.vue +189 -0
  80. package/components/u-subsection/u-subsection.vue +388 -0
  81. package/components/u-swipe-action/u-swipe-action.vue +289 -0
  82. package/components/u-swiper/u-swiper.vue +305 -0
  83. package/components/u-switch/u-switch.vue +146 -0
  84. package/components/u-tabbar/u-tabbar.vue +347 -0
  85. package/components/u-table/u-table.vue +104 -0
  86. package/components/u-tabs/u-tabs.vue +322 -0
  87. package/components/u-tabs-swiper/u-tabs-swiper.vue +426 -0
  88. package/components/u-tag/u-tag.vue +270 -0
  89. package/components/u-td/u-td.vue +76 -0
  90. package/components/u-th/u-th.vue +70 -0
  91. package/components/u-time-line/u-time-line.vue +39 -0
  92. package/components/u-time-line-item/u-time-line-item.vue +88 -0
  93. package/components/u-toast/types.ts +4 -0
  94. package/components/u-toast/u-toast.vue +238 -0
  95. package/components/u-top-tips/u-top-tips.vue +118 -0
  96. package/components/u-tr/u-tr.vue +24 -0
  97. package/components/u-upload/u-upload.vue +600 -0
  98. package/components/u-verification-code/u-verification-code.vue +194 -0
  99. package/components/u-waterfall/u-waterfall.vue +186 -0
  100. package/iconfont.css +910 -0
  101. package/index.scss +23 -0
  102. package/index.ts +166 -0
  103. package/libs/config/config.ts +26 -0
  104. package/libs/config/zIndex.ts +37 -0
  105. package/libs/css/color.scss +155 -0
  106. package/libs/css/common.scss +176 -0
  107. package/libs/css/style.components.scss +7 -0
  108. package/libs/css/style.h5.scss +8 -0
  109. package/libs/css/style.mp.scss +72 -0
  110. package/libs/css/style.nvue.scss +3 -0
  111. package/libs/css/style.vue.scss +175 -0
  112. package/libs/function/$parent.ts +22 -0
  113. package/libs/function/addUnit.ts +13 -0
  114. package/libs/function/color.ts +37 -0
  115. package/libs/function/colorGradient.ts +123 -0
  116. package/libs/function/debounce.ts +28 -0
  117. package/libs/function/deepClone.ts +39 -0
  118. package/libs/function/deepMerge.ts +34 -0
  119. package/libs/function/getParent.ts +59 -0
  120. package/libs/function/getRect.ts +26 -0
  121. package/libs/function/guid.ts +42 -0
  122. package/libs/function/md5.ts +397 -0
  123. package/libs/function/parent.ts +21 -0
  124. package/libs/function/queryParams.ts +60 -0
  125. package/libs/function/random.ts +16 -0
  126. package/libs/function/randomArray.ts +11 -0
  127. package/libs/function/route.ts +118 -0
  128. package/libs/function/sys.ts +15 -0
  129. package/libs/function/test.ts +229 -0
  130. package/libs/function/throttle.ts +31 -0
  131. package/libs/function/timeFormat.ts +54 -0
  132. package/libs/function/timeFrom.ts +48 -0
  133. package/libs/function/toast.ts +14 -0
  134. package/libs/function/trim.ts +21 -0
  135. package/libs/function/type2icon.ts +36 -0
  136. package/libs/hooks/useEmitter.ts +77 -0
  137. package/libs/hooks/useParent.ts +29 -0
  138. package/libs/request/index.ts +237 -0
  139. package/libs/store/index.ts +88 -0
  140. package/libs/util/area.ts +1 -0
  141. package/libs/util/async-validator.js +1356 -0
  142. package/libs/util/city.ts +1 -0
  143. package/libs/util/emitter.ts +112 -0
  144. package/libs/util/mitt.ts +118 -0
  145. package/libs/util/parent.ts +20 -0
  146. package/libs/util/province.ts +1 -0
  147. package/package.json +98 -0
  148. package/readme.md +165 -0
  149. package/theme.scss +38 -0
@@ -0,0 +1,288 @@
1
+ <template>
2
+ <view
3
+ class="u-wrap"
4
+ :style="{
5
+ opacity: Number(opacity),
6
+ borderRadius: props.borderRadius + 'rpx',
7
+ // 因为time值需要改变,所以不直接用duration值(不能改变父组件prop传过来的值)
8
+ transition: `opacity ${Number(time) / 1000}s ${props.effect}`
9
+ }"
10
+ :class="'u-lazy-item-' + elIndex"
11
+ >
12
+ <view :class="'u-lazy-item-' + elIndex">
13
+ <image
14
+ :style="{ borderRadius: props.borderRadius + 'rpx', height: imgHeight }"
15
+ v-if="!isError"
16
+ class="u-lazy-item"
17
+ :src="isShow ? props.image : props.loadingImg"
18
+ :mode="props.imgMode"
19
+ @load="imgLoaded"
20
+ @error="loadError"
21
+ @tap="clickImg"
22
+ ></image>
23
+ <image
24
+ :style="{ borderRadius: props.borderRadius + 'rpx', height: imgHeight }"
25
+ class="u-lazy-item error"
26
+ v-else
27
+ :src="props.errorImg"
28
+ :mode="props.imgMode"
29
+ @load="errorImgLoaded"
30
+ @tap="clickImg"
31
+ ></image>
32
+ </view>
33
+ </view>
34
+ </template>
35
+
36
+ <script setup lang="ts">
37
+ import { ref, computed, watch, onMounted, nextTick, getCurrentInstance } from 'vue';
38
+ import { $u } from '../..';
39
+
40
+ defineOptions({ name: 'u-lazy-load' });
41
+
42
+ /**
43
+ * lazyLoad 懒加载
44
+ * @description 懒加载使用的场景为:页面有很多图片时,APP会同时加载所有的图片,导致页面卡顿,各个位置的图片出现前后不一致等.
45
+ * @tutorial https://www.uviewui.com/components/lazyLoad.html
46
+ * @property {String | Number} index 用户自定义值,在事件触发时回调,用以区分是哪个图片
47
+ * @property {String} image 图片路径
48
+ * @property {String} loading-img 预加载时的占位图
49
+ * @property {String} error-img 图片加载出错时的占位图
50
+ * @property {String | Number} threshold 触发加载时的位置,单位 rpx(默认300)
51
+ * @property {String | Number} duration 图片加载成功时,淡入淡出时间,单位ms(默认)
52
+ * @property {String} effect 图片加载成功时,淡入淡出的css动画效果(默认ease-in-out)
53
+ * @property {Boolean} is-effect 图片加载成功时,是否启用淡入淡出效果(默认true)
54
+ * @property {String | Number} border-radius 图片圆角值,单位rpx(默认0)
55
+ * @property {String | Number} height 图片高度,注意:实际高度可能受img-mode参数影响(默认450)
56
+ * @property {String} img-mode 图片的裁剪模式,详见image组件裁剪模式(默认widthFix)
57
+ * @event {Function} click 点击图片时触发
58
+ * @event {Function} load 图片加载成功时触发
59
+ * @event {Function} error 图片加载失败时触发
60
+ * @example <u-lazy-load :image="image" :loading-img="loadingImg" :error-img="errorImg"></u-lazy-load>
61
+ */
62
+
63
+ const emit = defineEmits(['click', 'load', 'error']);
64
+
65
+ const props = defineProps({
66
+ /** 用户自定义值,在事件触发时回调,用以区分是哪个图片 */
67
+ index: [Number, String],
68
+ /** 要显示的图片 */
69
+ image: {
70
+ type: String,
71
+ default: ''
72
+ },
73
+ /** 图片裁剪模式 */
74
+ imgMode: {
75
+ type: String,
76
+ default: 'widthFix'
77
+ },
78
+ /** 占位图片路径 */
79
+ loadingImg: {
80
+ type: String,
81
+ default:
82
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAMAAAC3Ycb+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1zbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1zbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUM0QjNBQjkyQUQ2MTFFQTlCNUQ4RTIzNDE5RUIxNjciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUM0QjNBQkEyQUQ2MTFFQTlCNUQ4RTIzNDE5RUIxNjciPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5QzRCM0FCNzJBRDYxMUVBOUI1RDhFMjM0MTlFQjE2NyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5QzRCM0FCODJBRDYxMUVBOUI1RDhFMjM0MTlFQjE2NyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PtRHfPcAAAAzUExURZWVldfX18PD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'
83
+ },
84
+ // 加载失败的错误占位图
85
+ errorImg: {
86
+ type: String,
87
+ default:
88
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAMAAAC3Ycb+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODdDMjhENDYyQUQ2MTFFQTlDQ0VBODgxQjFFOEEyMEMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODdDMjhENDcyQUQ2MTFFQTlDQ0VBODgxQjFFOEEyMEMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4N0MyOEQ0NDJBRDYxMUVBOUNDRUE4ODFCMUU4QTIwQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4N0MyOEQ0NTJBRDYxMUVBOUNDRUE4ODFCMUU4QTIwQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhLwhikAAAAzUExURZWVldfX162t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'
89
+ },
90
+ /** 图片进入可见区域前多少像素时,单位rpx,开始加载图片 */
91
+ /** 负数为图片超出屏幕底部多少距离后触发懒加载,正数为图片顶部距离屏幕底部多少距离时触发(图片还没出现在屏幕上) */
92
+ threshold: {
93
+ type: [Number, String],
94
+ default: 100
95
+ },
96
+ /** 淡入淡出动画的过渡时间 */
97
+ duration: {
98
+ type: [Number, String],
99
+ default: 500
100
+ },
101
+ /** 渡效果的速度曲线,各个之间差别不大,因为这是淡入淡出,且时间很短,不是那些变形或者移动的情况,会明显 */
102
+ /** linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(n,n,n,n); */
103
+ effect: {
104
+ type: String,
105
+ default: 'ease-in-out'
106
+ },
107
+ /** 是否使用过渡效果 */
108
+ isEffect: {
109
+ type: Boolean,
110
+ default: true
111
+ },
112
+ /** 圆角值 */
113
+ borderRadius: {
114
+ type: [Number, String],
115
+ default: 0
116
+ },
117
+ /** 图片高度,单位rpx */
118
+ height: {
119
+ type: [Number, String],
120
+ default: '450'
121
+ }
122
+ });
123
+ const instance = getCurrentInstance();
124
+ // 懒加载相关响应式变量
125
+ const isShow = ref(false);
126
+ const opacity = ref(1);
127
+ const time = ref(Number(props.duration));
128
+ const loadStatus = ref(''); // 默认是懒加载中的状态
129
+ const isError = ref(false); // 图片加载失败
130
+ const elIndex = ref('');
131
+
132
+ // IntersectionObserver 实例
133
+ let contentObserver: any = null;
134
+
135
+ /**
136
+ * 将 threshold 从 rpx 转为 px
137
+ */
138
+ const getThreshold = computed(() => {
139
+ // 先取绝对值,因为 threshold 可能是负数,最后根据 props.threshold 是正数或者负数,重新还原
140
+ const thresholdPx = uni.upx2px(Math.abs(Number(props.threshold)));
141
+ return Number(props.threshold) < 0 ? -thresholdPx : thresholdPx;
142
+ });
143
+
144
+ /**
145
+ * 计算图片的高度,可能为 auto,带 %,或者直接数值
146
+ */
147
+ const imgHeight = computed(() => {
148
+ return $u.addUnit(props.height);
149
+ });
150
+
151
+ // 监听 isShow 变化,处理淡入淡出动画
152
+ watch(isShow, nVal => {
153
+ // 如果是不开启过渡效果,直接返回
154
+ if (!props.isEffect) return;
155
+ time.value = 0;
156
+ // 原来opacity为1(不透明,是为了显示占位图),改成0(透明,意味着该元素显示的是背景颜色,默认的白色),再改成1,是为了获得过渡效果
157
+ opacity.value = 0;
158
+ // 延时30ms,否则在浏览器H5,过渡效果无效
159
+ setTimeout(() => {
160
+ time.value = Number(props.duration);
161
+ opacity.value = 1;
162
+ }, 30);
163
+ });
164
+
165
+ // 监听图片路径变化,重置状态,图片路径发生变化时,需要重新标记一些变量,否则会一直卡在某一个状态,比如isError
166
+ watch(
167
+ () => props.image,
168
+ n => {
169
+ if (!n) {
170
+ // 如果传入null或者'',或者undefined,标记为错误状态
171
+ isError.value = true;
172
+ } else {
173
+ init();
174
+ isError.value = false;
175
+ }
176
+ }
177
+ );
178
+
179
+ /**
180
+ * 用于重新初始化
181
+ */
182
+ function init() {
183
+ isError.value = false;
184
+ loadStatus.value = '';
185
+ }
186
+
187
+ /**
188
+ * 点击图片触发的事件
189
+ * loadlazy-还是懒加载中状态,loading-图片正在加载,loaded-图片加加载完成
190
+ */
191
+ function clickImg() {
192
+ let whichImg = '';
193
+ // 如果isShow为false,意味着图片还没开始加载,点击的只能是最开始的占位图
194
+ if (!isShow.value) whichImg = 'lazyImg';
195
+ // 如果isError为true,意味着图片加载失败,这是只剩下错误的占位图,所以点击的只能是错误占位图
196
+ // 当然,也可以给错误的占位图元素绑定点击事件,看你喜欢~
197
+ else if (isError.value) whichImg = 'errorImg';
198
+ // 总共三张图片,除了两个占位图,剩下的只能是正常的那张图片了
199
+ else whichImg = 'realImg';
200
+ // 只通知当前图片的index
201
+ emit('click', props.index);
202
+ }
203
+
204
+ /**
205
+ * 图片加载完成事件
206
+ * 可能是加载占位图时触发,也可能是加载真正的图片完成时触发,通过 isShow 区分
207
+ */
208
+ function imgLoaded() {
209
+ // 占位图加载完成
210
+ if (loadStatus.value === '') {
211
+ loadStatus.value = 'lazyed';
212
+ } else if (loadStatus.value === 'lazyed') {
213
+ // 真正的图片加载完成
214
+ loadStatus.value = 'loaded';
215
+ emit('load', props.index);
216
+ }
217
+ }
218
+
219
+ /**
220
+ * 错误的图片加载完成
221
+ */
222
+ function errorImgLoaded() {
223
+ emit('error', props.index);
224
+ }
225
+
226
+ /**
227
+ * 图片加载失败
228
+ */
229
+ function loadError() {
230
+ isError.value = true;
231
+ }
232
+
233
+ /**
234
+ * 断开 IntersectionObserver
235
+ */
236
+ function disconnectObserver(observerName: string) {
237
+ if (observerName === 'contentObserver' && contentObserver) {
238
+ contentObserver.disconnect();
239
+ contentObserver = null;
240
+ }
241
+ }
242
+
243
+ onMounted(() => {
244
+ // 生成唯一 id
245
+ elIndex.value = $u.guid();
246
+ nextTick(() => {
247
+ uni.$once('uOnReachBottom', () => {
248
+ if (!isShow.value) isShow.value = true;
249
+ });
250
+ // mounted的时候,不一定挂载了这个元素,延时30ms,否则会报错或者不报错,但是也没有效果
251
+ setTimeout(() => {
252
+ // 这里是组件内获取布局状态,不能用uni.createIntersectionObserver,而必须用this.createIntersectionObserver
253
+ disconnectObserver('contentObserver');
254
+ contentObserver = uni.createIntersectionObserver(instance?.proxy);
255
+ // 要理解这里怎么计算的,请看这个:
256
+ // https://blog.csdn.net/qq_25324335/article/details/83687695
257
+ contentObserver.relativeToViewport({ bottom: getThreshold.value }).observe('.u-lazy-item-' + elIndex.value, (res: any) => {
258
+ if (res.intersectionRatio > 0) {
259
+ // 懒加载状态改变
260
+ isShow.value = true;
261
+ // 如果图片已经加载,去掉监听,减少性能的消耗
262
+ disconnectObserver('contentObserver');
263
+ }
264
+ });
265
+ }, 30);
266
+ });
267
+ });
268
+ </script>
269
+
270
+ <style scoped lang="scss">
271
+ @import '../../libs/css/style.components.scss';
272
+
273
+ .u-wrap {
274
+ background-color: #eee;
275
+ overflow: hidden;
276
+ }
277
+
278
+ .u-lazy-item {
279
+ width: 100%;
280
+ // 骗系统开启硬件加速
281
+ transform: transition3d(0, 0, 0);
282
+ // 防止图片加载“闪一下”
283
+ will-change: transform;
284
+ /* #ifndef APP-NVUE */
285
+ display: block;
286
+ /* #endif */
287
+ }
288
+ </style>
@@ -0,0 +1,71 @@
1
+ <template>
2
+ <view class="u-line" :style="lineStyle"></view>
3
+ </template>
4
+
5
+ <script setup lang="ts">
6
+ import { computed } from 'vue';
7
+ import { $u } from '../..';
8
+
9
+ defineOptions({
10
+ name: 'u-line'
11
+ });
12
+
13
+ /**
14
+ * line 线条
15
+ * @description 此组件一般用于显示一根线条,用于分隔内容块,有横向和竖向两种模式,且能设置0.5px线条,使用也很简单
16
+ * @tutorial https://www.uviewui.com/components/line.html
17
+ * @property {String} color 线条的颜色(默认#e4e7ed)
18
+ * @property {String} length 长度,竖向时表现为高度,横向时表现为长度,可以为百分比,带rpx单位的值等
19
+ * @property {String} direction 线条的方向,row-横向,col-竖向(默认row)
20
+ * @property {String} border-style 线条的类型,solid-实线,dashed-方形虚线,dotted-圆点虚线(默认solid)
21
+ * @property {Boolean} hair-line 是否显示细线条(默认true)
22
+ * @property {String} margin 线条与上下左右元素的间距,字符串形式,如"30rpx"
23
+ * @example <u-line color="red"></u-line>
24
+ */
25
+ const props = defineProps({
26
+ /** 线条的颜色 */
27
+ color: { type: String, default: '#e4e7ed' },
28
+ /** 长度,竖向时表现为高度,横向时表现为长度,可以为百分比,带rpx单位的值等 */
29
+ length: { type: String, default: '100%' },
30
+ /** 线条方向,col-竖向,row-横向 */
31
+ direction: { type: String, default: 'row' },
32
+ /** 是否显示细边框 */
33
+ hairLine: { type: Boolean, default: true },
34
+ /** 线条与上下左右元素的间距,字符串形式,如"30rpx"、"20rpx 30rpx" */
35
+ margin: { type: String, default: '0' },
36
+ /** 线条的类型,solid-实线,dashed-方形虚线,dotted-圆点虚线 */
37
+ borderStyle: { type: String, default: 'solid' }
38
+ });
39
+
40
+ /**
41
+ * 线条样式
42
+ */
43
+ const lineStyle = computed(() => {
44
+ let style: Record<string, string> = {};
45
+ style.margin = props.margin;
46
+ // 如果是水平线条,边框高度为1px,再通过transform缩小一半,就是0.5px了
47
+ if (props.direction === 'row') {
48
+ // 此处采用兼容分开写,兼容nvue的写法
49
+ style.borderBottomWidth = '1px';
50
+ style.borderBottomStyle = props.borderStyle;
51
+ style.width = $u.addUnit(props.length);
52
+ if (props.hairLine) style.transform = 'scaleY(0.5)';
53
+ } else {
54
+ // 如果是竖向线条,边框宽度为1px,再通过transform缩小一半,就是0.5px了
55
+ style.borderLeftWidth = '1px';
56
+ style.borderLeftStyle = props.borderStyle;
57
+ style.height = $u.addUnit(props.length);
58
+ if (props.hairLine) style.transform = 'scaleX(0.5)';
59
+ }
60
+ style.borderColor = props.color;
61
+ return style;
62
+ });
63
+ </script>
64
+
65
+ <style scoped lang="scss">
66
+ @import '../../libs/css/style.components.scss';
67
+
68
+ .u-line {
69
+ vertical-align: middle;
70
+ }
71
+ </style>
@@ -0,0 +1,128 @@
1
+ <template>
2
+ <view
3
+ class="u-progress"
4
+ :style="{
5
+ borderRadius: round ? '100rpx' : 0,
6
+ height: height + 'rpx',
7
+ backgroundColor: inactiveColor
8
+ }"
9
+ >
10
+ <view :class="[type ? `u-type-${type}-bg` : '', striped ? 'u-striped' : '', striped && stripedActive ? 'u-striped-active' : '']" class="u-active" :style="progressStyle">
11
+ <slot v-if="slots.default" />
12
+ <template v-else-if="showPercent">
13
+ {{ percent + '%' }}
14
+ </template>
15
+ </view>
16
+ </view>
17
+ </template>
18
+
19
+ <script setup lang="ts">
20
+ import { computed, useSlots } from 'vue';
21
+
22
+ defineOptions({
23
+ name: 'u-line-progress'
24
+ });
25
+
26
+ /**
27
+ * lineProgress 线型进度条
28
+ * @description 展示操作或任务的当前进度,比如上传文件,是一个线形的进度条。
29
+ * @tutorial https://www.uviewui.com/components/lineProgress.html
30
+ * @property {String Number} percent 进度条百分比值,为数值类型,0-100
31
+ * @property {Boolean} round 进度条两端是否为半圆(默认true)
32
+ * @property {String} type 如设置,active-color值将会失效
33
+ * @property {String} active-color 进度条激活部分的颜色(默认#19be6b)
34
+ * @property {String} inactive-color 进度条的底色(默认#ececec)
35
+ * @property {Boolean} show-percent 是否在进度条内部显示当前的百分比值数值(默认true)
36
+ * @property {String Number} height 进度条的高度,单位rpx(默认28)
37
+ * @property {Boolean} striped 是否显示进度条激活部分的条纹(默认false)
38
+ * @property {Boolean} striped-active 条纹是否具有动态效果(默认false)
39
+ * @example <u-line-progress :percent="70" :show-percent="true"></u-line-progress>
40
+ */
41
+ const props = defineProps({
42
+ /** 两端是否显示半圆形 */
43
+ round: { type: Boolean, default: true },
44
+ /** 主题颜色 */
45
+ type: { type: String, default: '' },
46
+ /** 激活部分的颜色 */
47
+ activeColor: { type: String, default: '#19be6b' },
48
+ /** 进度条的底色 */
49
+ inactiveColor: { type: String, default: '#ececec' },
50
+ /** 进度百分比,数值 */
51
+ percent: { type: Number, default: 0 },
52
+ /** 是否在进度条内部显示百分比的值 */
53
+ showPercent: { type: Boolean, default: true },
54
+ /** 进度条的高度,单位rpx */
55
+ height: { type: [Number, String], default: 28 },
56
+ /** 是否显示条纹 */
57
+ striped: { type: Boolean, default: false },
58
+ /** 条纹是否显示活动状态 */
59
+ stripedActive: { type: Boolean, default: false }
60
+ });
61
+
62
+ const slots = useSlots();
63
+
64
+ /**
65
+ * 进度条激活部分的样式
66
+ */
67
+ const progressStyle = computed(() => {
68
+ let style: Record<string, string> = {};
69
+ style.width = props.percent + '%';
70
+ if (props.activeColor) style.backgroundColor = props.activeColor;
71
+ return style;
72
+ });
73
+ </script>
74
+
75
+ <style lang="scss" scoped>
76
+ @import '../../libs/css/style.components.scss';
77
+
78
+ .u-progress {
79
+ overflow: hidden;
80
+ height: 15px;
81
+ /* #ifndef APP-NVUE */
82
+ display: inline-flex;
83
+ /* #endif */
84
+ align-items: center;
85
+ width: 100%;
86
+ border-radius: 100rpx;
87
+ }
88
+
89
+ .u-active {
90
+ width: 0;
91
+ height: 100%;
92
+ align-items: center;
93
+ @include vue-flex;
94
+ justify-items: flex-end;
95
+ justify-content: space-around;
96
+ font-size: 20rpx;
97
+ color: #ffffff;
98
+ transition: all 0.4s ease;
99
+ }
100
+
101
+ .u-striped {
102
+ background-image: linear-gradient(
103
+ 45deg,
104
+ rgba(255, 255, 255, 0.15) 25%,
105
+ transparent 25%,
106
+ transparent 50%,
107
+ rgba(255, 255, 255, 0.15) 50%,
108
+ rgba(255, 255, 255, 0.15) 75%,
109
+ transparent 75%,
110
+ transparent
111
+ );
112
+ background-size: 39px 39px;
113
+ }
114
+
115
+ .u-striped-active {
116
+ animation: progress-stripes 2s linear infinite;
117
+ }
118
+
119
+ @keyframes progress-stripes {
120
+ 0% {
121
+ background-position: 0 0;
122
+ }
123
+
124
+ 100% {
125
+ background-position: 39px 0;
126
+ }
127
+ }
128
+ </style>
@@ -0,0 +1,87 @@
1
+ <template>
2
+ <text
3
+ class="u-link"
4
+ @tap.stop="openLink"
5
+ :style="{
6
+ color: color,
7
+ fontSize: fontSize + 'rpx',
8
+ borderBottom: underLine ? `1px solid ${lineColor ? lineColor : color}` : 'none',
9
+ paddingBottom: underLine ? '0rpx' : '0'
10
+ }"
11
+ >
12
+ <slot></slot>
13
+ </text>
14
+ </template>
15
+
16
+ <script setup lang="ts">
17
+ import { $u } from '../..';
18
+
19
+ defineOptions({
20
+ name: 'u-link'
21
+ });
22
+
23
+ /**
24
+ * link 超链接
25
+ * @description 该组件为超链接组件,在不同平台有不同表现形式:在APP平台会通过plus环境打开内置浏览器,在小程序中把链接复制到粘贴板,同时提示信息,在H5中通过window.open打开链接。
26
+ * @tutorial https://www.uviewui.com/components/link.html
27
+ * @property {String} color 文字颜色(默认#606266)
28
+ * @property {String Number} font-size 字体大小,单位rpx(默认28)
29
+ * @property {Boolean} under-line 是否显示下划线(默认false)
30
+ * @property {String} href 跳转的链接,要带上http(s)
31
+ * @property {String} line-color 下划线颜色,默认同color参数颜色
32
+ * @property {String} mp-tips 各个小程序平台把链接复制到粘贴板后的提示语(默认“链接已复制,请在浏览器打开”)
33
+ * @example <u-link href="http://www.uviewui.com">蜀道难,难于上青天</u-link>
34
+ */
35
+ const props = defineProps({
36
+ /** 文字颜色 */
37
+ color: { type: String, default: '#2979ff' },
38
+ /** 字体大小,单位rpx */
39
+ fontSize: { type: [String, Number], default: 28 },
40
+ /** 是否显示下划线 */
41
+ underLine: { type: Boolean, default: false },
42
+ /** 要跳转的链接 */
43
+ href: { type: String, default: '' },
44
+ /** 小程序中复制到粘贴板的提示语 */
45
+ mpTips: { type: String, default: '链接已复制,请在浏览器打开' },
46
+ /** 下划线颜色 */
47
+ lineColor: { type: String, default: '' }
48
+ });
49
+
50
+ /**
51
+ * 打开链接方法
52
+ * 不同平台有不同表现形式
53
+ */
54
+ function openLink() {
55
+ // #ifdef APP-PLUS
56
+ if (typeof plus !== 'undefined' && plus.runtime) {
57
+ plus.runtime.openURL(props.href);
58
+ }
59
+ // #endif
60
+ // #ifdef H5
61
+ if (typeof window !== 'undefined') {
62
+ window.open(props.href);
63
+ }
64
+ // #endif
65
+ // #ifdef MP
66
+ if (typeof uni !== 'undefined' && uni.setClipboardData) {
67
+ uni.setClipboardData({
68
+ data: props.href,
69
+ success: () => {
70
+ uni.hideToast();
71
+ if (typeof $u !== 'undefined' && $u.toast && props.mpTips) {
72
+ $u.toast(props.mpTips);
73
+ }
74
+ }
75
+ });
76
+ }
77
+ // #endif
78
+ }
79
+ </script>
80
+
81
+ <style lang="scss" scoped>
82
+ @import '../../libs/css/style.components.scss';
83
+
84
+ .u-link {
85
+ line-height: 1;
86
+ }
87
+ </style>