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,279 +1,288 @@
1
- <template>
2
- <view
3
- class="u-input"
4
- :class="{
5
- 'u-input--border': border,
6
- 'u-input--error': validateState
7
- }"
8
- :style="{
9
- padding: `0 ${border ? 20 : 0}rpx`,
10
- borderColor: borderColor,
11
- textAlign: inputAlign
12
- }"
13
- @tap.stop="inputClick"
14
- >
15
- <textarea
16
- v-if="type == 'textarea'"
17
- class="u-input__input u-input__textarea"
18
- :style="getStyle"
19
- :value="defaultValue"
20
- :placeholder="placeholder"
21
- :placeholderStyle="placeholderStyle"
22
- :disabled="disabled"
23
- :maxlength="inputMaxlength"
24
- :fixed="fixed"
25
- :focus="focus"
26
- :autoHeight="autoHeight"
27
- :selection-end="uSelectionEnd"
28
- :selection-start="uSelectionStart"
29
- :cursor-spacing="getCursorSpacing"
30
- :show-confirm-bar="showConfirmbar"
31
- :adjust-position="adjustPosition"
32
- @input="handleInput"
33
- @blur="handleBlur"
34
- @focus="onFocus"
35
- @confirm="onConfirm"
36
- />
37
- <input
38
- v-else
39
- class="u-input__input"
40
- :type="type == 'password' ? 'text' : type"
41
- :style="getStyle"
42
- :value="defaultValue"
43
- :password="type == 'password' && !showPassword"
44
- :placeholder="placeholder"
45
- :placeholderStyle="placeholderStyle"
46
- :disabled="disabled || type === 'select'"
47
- :maxlength="inputMaxlength"
48
- :focus="focus"
49
- :confirmType="confirmType"
50
- :cursor-spacing="getCursorSpacing"
51
- :selection-end="uSelectionEnd"
52
- :selection-start="uSelectionStart"
53
- :show-confirm-bar="showConfirmbar"
54
- :adjust-position="adjustPosition"
55
- @focus="onFocus"
56
- @blur="handleBlur"
57
- @input="handleInput"
58
- @confirm="onConfirm"
59
- />
60
- <view class="u-input__right-icon u-flex">
61
- <view
62
- class="u-input__right-icon__clear u-input__right-icon__item"
63
- v-if="clearable && modelValue != '' && !disabled"
64
- >
65
- <u-icon size="32" name="close-circle-fill" color="#c0c4cc" @click="onClear" />
66
- </view>
67
- <view
68
- class="u-input__right-icon__clear u-input__right-icon__item"
69
- v-if="passwordIcon && type == 'password'"
70
- >
71
- <u-icon
72
- size="32"
73
- :name="!showPassword ? 'eye' : 'eye-fill'"
74
- color="#c0c4cc"
75
- @click="showPassword = !showPassword"
76
- />
77
- </view>
78
- <view
79
- class="u-input__right-icon--select u-input__right-icon__item"
80
- v-if="type == 'select'"
81
- :class="{
82
- 'u-input__right-icon--select--reverse': selectOpen
83
- }"
84
- >
85
- <u-icon name="arrow-down-fill" size="26" color="#c0c4cc"></u-icon>
86
- </view>
87
- </view>
88
- </view>
89
- </template>
90
-
91
- <script lang="ts">
92
- export default {
93
- name: 'u-input',
94
- options: {
95
- addGlobalClass: true,
96
- virtualHost: true,
97
- styleIsolation: 'shared'
98
- }
99
- };
100
- </script>
101
-
102
- <script setup lang="ts">
103
- import { ref, computed, watch, getCurrentInstance } from 'vue';
104
- import { $u } from '../..';
105
- import { dispatch } from '../../libs/util/emitter';
106
- import { InputProps } from './types';
107
-
108
- const props = defineProps(InputProps);
109
- const emit = defineEmits(['update:modelValue', 'blur', 'focus', 'confirm', 'click']);
110
-
111
- const defaultValue = ref(props.modelValue);
112
- const inputHeight = 70; // input的高度
113
- const textareaHeight = 100; // textarea的高度
114
- const validateState = ref(props.validateState); // 当前input的验证状态,用于错误时,边框是否改为红色
115
- const focused = ref(false); // 当前是否处于获得焦点的状态
116
- const showPassword = ref(false); // 是否预览密码
117
- const lastValue = ref(''); // 用于头条小程序,判断@input中,前后的值是否发生了变化
118
-
119
- // 监听 value 变化
120
- watch(
121
- () => props.modelValue,
122
- (nVal, oVal) => {
123
- defaultValue.value = nVal;
124
- // 当值发生变化,且为select类型时(此时input被设置为disabled,不会触发@input事件),模拟触发@input事件
125
- if (nVal != oVal && props.type == 'select') handleInput({ detail: { value: nVal } });
126
- }
127
- );
128
-
129
- // 监听 validateState 变化
130
- watch(
131
- () => props.validateState,
132
- val => {
133
- validateState.value = val;
134
- }
135
- );
136
-
137
- // 计算属性
138
- const inputMaxlength = computed(() => Number(props.maxlength));
139
-
140
- const getStyle = computed(() => {
141
- let style: Record<string, any> = {};
142
- // 如果没有自定义高度,就根据type为input还是textarea来分配一个默认的高度
143
- style.minHeight = props.height
144
- ? props.height + 'rpx'
145
- : props.type == 'textarea'
146
- ? `${textareaHeight}rpx`
147
- : `${inputHeight}rpx`;
148
- style = Object.assign(style, props.customStyle);
149
- return style;
150
- });
151
- const getCursorSpacing = computed(() => Number(props.cursorSpacing));
152
- // 光标起始位置
153
- const uSelectionStart = computed(() => String(props.selectionStart));
154
- // 光标结束位置
155
- const uSelectionEnd = computed(() => String(props.selectionEnd));
156
-
157
- const instance = getCurrentInstance();
158
-
159
- // 监听u-form-item发出的错误事件,将输入框边框变红色,失效了
160
- // uni.$on('on-form-item-error', onFormItemError);
161
- /**
162
- * change 事件
163
- * @param event
164
- */
165
- function handleInput(event: any) {
166
- let value = event.detail.value;
167
- // 判断是否去除空格
168
- if (props.trim) value = $u.trim(value);
169
- emit('update:modelValue', value);
170
- // 当前model 赋值
171
- defaultValue.value = value;
172
- // 过一个生命周期再发送事件给u-form-item,否则this.$emit('update:modelValue')更新了父组件的值,但是微信小程序上
173
- // 尚未更新到u-form-item,导致获取的值为空,从而校验混论
174
- // 这里不能延时时间太短,或者使用this.$nextTick,否则在头条上,会造成混乱
175
- setTimeout(() => {
176
- // 头条小程序由于自身bug,导致中文下,每按下一个键(尚未完成输入),都会触发一次@input,导致错误,这里进行判断处理
177
- // #ifdef MP-TOUTIAO
178
- if ($u.trim(value) == lastValue.value) return;
179
- lastValue.value = value;
180
- // #endif
181
- // 通过 emitter 派发事件
182
- dispatch(instance, 'u-form-item', 'on-form-change', value);
183
- }, 40);
184
- }
185
-
186
- /**
187
- * blur 事件
188
- * @param event
189
- */
190
- function handleBlur(event: any) {
191
- // 最开始使用的是监听图标@touchstart事件,自从hx2.8.4后,此方法在微信小程序出错
192
- // 这里改为监听点击事件,手点击清除图标时,同时也发生了@blur事件,导致图标消失而无法点击,这里做一个延时
193
- let value = event.detail.value;
194
- setTimeout(() => {
195
- focused.value = false;
196
- }, 100);
197
- emit('blur', value);
198
- setTimeout(() => {
199
- // 头条小程序由于自身bug,导致中文下,每按下一个键(尚未完成输入),都会触发一次@input,导致错误,这里进行判断处理
200
- // #ifdef MP-TOUTIAO
201
- if ($u.trim(value) == lastValue.value) return;
202
- lastValue.value = value;
203
- // #endif
204
- dispatch(instance, 'u-form-item', 'on-form-blur', value);
205
- }, 40);
206
- }
207
-
208
- function onFormItemError(status: boolean) {
209
- console.log('onFormItemError', status);
210
- validateState.value = status;
211
- }
212
-
213
- function onFocus(event: any) {
214
- focused.value = true;
215
- emit('focus');
216
- }
217
-
218
- function onConfirm(e: any) {
219
- emit('confirm', e.detail.value);
220
- }
221
-
222
- function onClear(event: any) {
223
- emit('update:modelValue', '');
224
- }
225
-
226
- function inputClick() {
227
- emit('click');
228
- }
229
- </script>
230
-
231
- <style lang="scss" scoped>
232
- @import '../../libs/css/style.components.scss';
233
-
234
- .u-input {
235
- position: relative;
236
- flex: 1;
237
- @include vue-flex;
238
-
239
- &__input {
240
- //height: $u-form-item-height;
241
- font-size: 28rpx;
242
- color: $u-main-color;
243
- flex: 1;
244
- }
245
-
246
- &__textarea {
247
- width: auto;
248
- font-size: 28rpx;
249
- color: $u-main-color;
250
- padding: 10rpx 0;
251
- line-height: normal;
252
- flex: 1;
253
- }
254
-
255
- &--border {
256
- border-radius: 6rpx;
257
- border-radius: 4px;
258
- border: 1px solid $u-form-item-border-color;
259
- }
260
-
261
- &--error {
262
- border-color: $u-type-error !important;
263
- }
264
-
265
- &__right-icon {
266
- &__item {
267
- margin-left: 10rpx;
268
- }
269
-
270
- &--select {
271
- transition: transform 0.4s;
272
-
273
- &--reverse {
274
- transform: rotate(-180deg);
275
- }
276
- }
277
- }
278
- }
279
- </style>
1
+ <template>
2
+ <view
3
+ class="u-input"
4
+ :class="[
5
+ {
6
+ 'u-input--border': border,
7
+ 'u-input--error': validateState
8
+ },
9
+ customClass
10
+ ]"
11
+ :style="{
12
+ padding: `0 ${border ? 20 : 0}rpx`,
13
+ borderColor: borderColor,
14
+ textAlign: inputAlign
15
+ }"
16
+ @tap.stop="inputClick"
17
+ >
18
+ <textarea
19
+ v-if="type == 'textarea'"
20
+ class="u-input__input u-input__textarea"
21
+ :style="getStyle"
22
+ :value="defaultValue"
23
+ :placeholder="placeholder"
24
+ :placeholderStyle="placeholderStyle"
25
+ :disabled="disabled"
26
+ :maxlength="inputMaxlength"
27
+ :fixed="fixed"
28
+ :focus="focus"
29
+ :autoHeight="autoHeight"
30
+ :selection-end="uSelectionEnd"
31
+ :selection-start="uSelectionStart"
32
+ :cursor-spacing="getCursorSpacing"
33
+ :show-confirm-bar="showConfirmbar"
34
+ :adjust-position="adjustPosition"
35
+ @input="handleInput"
36
+ @blur="handleBlur"
37
+ @focus="onFocus"
38
+ @confirm="onConfirm"
39
+ />
40
+ <input
41
+ v-else
42
+ class="u-input__input"
43
+ :type="type == 'password' ? 'text' : type"
44
+ :style="getStyle"
45
+ :value="defaultValue"
46
+ :password="type == 'password' && !showPassword"
47
+ :placeholder="placeholder"
48
+ :placeholderStyle="placeholderStyle"
49
+ :disabled="disabled || type === 'select'"
50
+ :maxlength="inputMaxlength"
51
+ :focus="focus"
52
+ :confirmType="confirmType"
53
+ :cursor-spacing="getCursorSpacing"
54
+ :selection-end="uSelectionEnd"
55
+ :selection-start="uSelectionStart"
56
+ :show-confirm-bar="showConfirmbar"
57
+ :adjust-position="adjustPosition"
58
+ @focus="onFocus"
59
+ @blur="handleBlur"
60
+ @input="handleInput"
61
+ @confirm="onConfirm"
62
+ />
63
+ <view class="u-input__right-icon u-flex">
64
+ <view
65
+ class="u-input__right-icon__clear u-input__right-icon__item"
66
+ v-if="clearable && modelValue != '' && !disabled"
67
+ >
68
+ <u-icon size="32" name="close-circle-fill" color="#c0c4cc" @click="onClear" />
69
+ </view>
70
+ <view
71
+ class="u-input__right-icon__clear u-input__right-icon__item"
72
+ v-if="passwordIcon && type == 'password'"
73
+ >
74
+ <u-icon
75
+ size="32"
76
+ :name="!showPassword ? 'eye' : 'eye-fill'"
77
+ color="#c0c4cc"
78
+ @click="showPassword = !showPassword"
79
+ />
80
+ </view>
81
+ <view
82
+ class="u-input__right-icon--select u-input__right-icon__item"
83
+ v-if="type == 'select'"
84
+ :class="{
85
+ 'u-input__right-icon--select--reverse': selectOpen
86
+ }"
87
+ >
88
+ <u-icon name="arrow-down-fill" size="26" color="#c0c4cc"></u-icon>
89
+ </view>
90
+ </view>
91
+ </view>
92
+ </template>
93
+
94
+ <script lang="ts">
95
+ export default {
96
+ name: 'u-input',
97
+ options: {
98
+ addGlobalClass: true,
99
+ // #ifndef MP-TOUTIAO
100
+ virtualHost: true,
101
+ // #endif
102
+ styleIsolation: 'shared'
103
+ }
104
+ };
105
+ </script>
106
+
107
+ <script setup lang="ts">
108
+ import { ref, computed, watch, getCurrentInstance } from 'vue';
109
+ import { $u } from '../..';
110
+ import { dispatch } from '../../libs/util/emitter';
111
+ import { InputProps } from './types';
112
+
113
+ const props = defineProps(InputProps);
114
+ const emit = defineEmits(['update:modelValue', 'blur', 'focus', 'confirm', 'click']);
115
+
116
+ const defaultValue = ref(props.modelValue);
117
+ const inputHeight = 70; // input的高度
118
+ const textareaHeight = 100; // textarea的高度
119
+ const validateState = ref(props.validateState); // 当前input的验证状态,用于错误时,边框是否改为红色
120
+ const focused = ref(false); // 当前是否处于获得焦点的状态
121
+ const showPassword = ref(false); // 是否预览密码
122
+ const lastValue = ref(''); // 用于头条小程序,判断@input中,前后的值是否发生了变化
123
+
124
+ // 监听 value 变化
125
+ watch(
126
+ () => props.modelValue,
127
+ (nVal, oVal) => {
128
+ defaultValue.value = nVal;
129
+ // 当值发生变化,且为select类型时(此时input被设置为disabled,不会触发@input事件),模拟触发@input事件
130
+ if (nVal != oVal && props.type == 'select') handleInput({ detail: { value: nVal } });
131
+ }
132
+ );
133
+
134
+ // 监听 validateState 变化
135
+ watch(
136
+ () => props.validateState,
137
+ val => {
138
+ validateState.value = val;
139
+ }
140
+ );
141
+
142
+ // 计算属性
143
+ const inputMaxlength = computed(() => Number(props.maxlength));
144
+
145
+ const getStyle = computed(() => {
146
+ let style: Record<string, any> = {};
147
+ // 如果没有自定义高度,就根据type为input还是textarea来分配一个默认的高度
148
+ style.minHeight = props.height
149
+ ? props.height + 'rpx'
150
+ : props.type == 'textarea'
151
+ ? `${textareaHeight}rpx`
152
+ : `${inputHeight}rpx`;
153
+ return $u.toStyle(style, props.customStyle);
154
+ });
155
+ const getCursorSpacing = computed(() => Number(props.cursorSpacing));
156
+ // 光标起始位置
157
+ const uSelectionStart = computed(() => String(props.selectionStart));
158
+ // 光标结束位置
159
+ const uSelectionEnd = computed(() => String(props.selectionEnd));
160
+
161
+ const instance = getCurrentInstance();
162
+
163
+ // 监听u-form-item发出的错误事件,将输入框边框变红色,失效了
164
+ // uni.$on('on-form-item-error', onFormItemError);
165
+ /**
166
+ * change 事件
167
+ * @param event
168
+ */
169
+ function handleInput(event: any) {
170
+ let value = event.detail.value;
171
+ // 判断是否去除空格
172
+ if (props.trim) value = $u.trim(value);
173
+ emit('update:modelValue', value);
174
+ // 当前model 赋值
175
+ defaultValue.value = value;
176
+ // 过一个生命周期再发送事件给u-form-item,否则this.$emit('update:modelValue')更新了父组件的值,但是微信小程序上
177
+ // 尚未更新到u-form-item,导致获取的值为空,从而校验混论
178
+ // 这里不能延时时间太短,或者使用this.$nextTick,否则在头条上,会造成混乱
179
+ setTimeout(() => {
180
+ // 头条小程序由于自身bug,导致中文下,每按下一个键(尚未完成输入),都会触发一次@input,导致错误,这里进行判断处理
181
+ // #ifdef MP-TOUTIAO
182
+ if ($u.trim(value) == lastValue.value) return;
183
+ lastValue.value = value;
184
+ // #endif
185
+ // 通过 emitter 派发事件
186
+ dispatch(instance, 'u-form-item', 'on-form-change', value);
187
+ }, 40);
188
+ }
189
+
190
+ /**
191
+ * blur 事件
192
+ * @param event
193
+ */
194
+ function handleBlur(event: any) {
195
+ // 最开始使用的是监听图标@touchstart事件,自从hx2.8.4后,此方法在微信小程序出错
196
+ // 这里改为监听点击事件,手点击清除图标时,同时也发生了@blur事件,导致图标消失而无法点击,这里做一个延时
197
+ let value = event.detail.value;
198
+ setTimeout(() => {
199
+ focused.value = false;
200
+ }, 100);
201
+ emit('blur', value);
202
+ setTimeout(() => {
203
+ // 头条小程序由于自身bug,导致中文下,每按下一个键(尚未完成输入),都会触发一次@input,导致错误,这里进行判断处理
204
+ // #ifdef MP-TOUTIAO
205
+ if ($u.trim(value) == lastValue.value) return;
206
+ lastValue.value = value;
207
+ // #endif
208
+ dispatch(instance, 'u-form-item', 'on-form-blur', value);
209
+ }, 40);
210
+ }
211
+
212
+ function onFormItemError(status: boolean) {
213
+ console.log('onFormItemError', status);
214
+ validateState.value = status;
215
+ }
216
+
217
+ function onFocus(event: any) {
218
+ focused.value = true;
219
+ emit('focus');
220
+ }
221
+
222
+ function onConfirm(e: any) {
223
+ emit('confirm', e.detail.value);
224
+ }
225
+
226
+ function onClear(event: any) {
227
+ try {
228
+ event.stopPropagation();
229
+ } catch (e) {
230
+ console.log(e);
231
+ }
232
+ emit('update:modelValue', '');
233
+ }
234
+
235
+ function inputClick() {
236
+ emit('click');
237
+ }
238
+ </script>
239
+
240
+ <style lang="scss" scoped>
241
+ @import '../../libs/css/style.components.scss';
242
+
243
+ .u-input {
244
+ position: relative;
245
+ flex: 1;
246
+ @include vue-flex;
247
+
248
+ &__input {
249
+ //height: $u-form-item-height;
250
+ font-size: 28rpx;
251
+ color: $u-main-color;
252
+ flex: 1;
253
+ }
254
+
255
+ &__textarea {
256
+ width: auto;
257
+ font-size: 28rpx;
258
+ color: $u-main-color;
259
+ padding: 10rpx 0;
260
+ line-height: normal;
261
+ flex: 1;
262
+ }
263
+
264
+ &--border {
265
+ border-radius: 6rpx;
266
+ border-radius: 4px;
267
+ border: 1px solid $u-form-item-border-color;
268
+ }
269
+
270
+ &--error {
271
+ border-color: $u-type-error !important;
272
+ }
273
+
274
+ &__right-icon {
275
+ &__item {
276
+ margin-left: 10rpx;
277
+ }
278
+
279
+ &--select {
280
+ transition: transform 0.4s;
281
+
282
+ &--reverse {
283
+ transform: rotate(-180deg);
284
+ }
285
+ }
286
+ }
287
+ }
288
+ </style>