uview-pro 0.3.5 → 0.3.6

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 (40) hide show
  1. package/changelog.md +22 -0
  2. package/components/u-calendar/types.ts +3 -2
  3. package/components/u-calendar/u-calendar.vue +2 -2
  4. package/components/u-checkbox-group/types.ts +2 -1
  5. package/components/u-checkbox-group/u-checkbox-group.vue +1 -1
  6. package/components/u-city-select/u-city-select.vue +2 -2
  7. package/components/u-dropdown/types.ts +3 -2
  8. package/components/u-dropdown/u-dropdown.vue +1 -1
  9. package/components/u-index-anchor/u-index-anchor.vue +1 -1
  10. package/components/u-index-list/types.ts +2 -1
  11. package/components/u-index-list/u-index-list.vue +1 -1
  12. package/components/u-link/types.ts +2 -1
  13. package/components/u-message-input/types.ts +3 -2
  14. package/components/u-message-input/u-message-input.vue +1 -1
  15. package/components/u-modal/types.ts +3 -2
  16. package/components/u-modal/u-modal.vue +1 -1
  17. package/components/u-picker/types.ts +8 -2
  18. package/components/u-picker/u-picker.vue +276 -126
  19. package/components/u-radio/u-radio.vue +2 -2
  20. package/components/u-radio-group/types.ts +2 -1
  21. package/components/u-radio-group/u-radio-group.vue +1 -1
  22. package/components/u-read-more/types.ts +2 -1
  23. package/components/u-read-more/u-read-more.vue +1 -1
  24. package/components/u-select/types.ts +5 -2
  25. package/components/u-select/u-select.vue +56 -18
  26. package/components/u-slider/types.ts +3 -2
  27. package/components/u-slider/u-slider.vue +2 -2
  28. package/components/u-step/types.ts +29 -0
  29. package/components/u-step/u-step.vue +264 -0
  30. package/components/u-steps/types.ts +3 -2
  31. package/components/u-steps/u-steps.vue +17 -106
  32. package/components/u-switch/types.ts +2 -1
  33. package/components/u-switch/u-switch.vue +2 -2
  34. package/components/u-tabs/types.ts +3 -2
  35. package/components/u-tabs/u-tabs.vue +1 -1
  36. package/components/u-tabs-swiper/types.ts +3 -2
  37. package/components/u-tabs-swiper/u-tabs-swiper.vue +1 -1
  38. package/package.json +1 -1
  39. package/types/components.d.ts +1 -0
  40. package/types/global.d.ts +2 -0
@@ -20,7 +20,7 @@
20
20
  >
21
21
  {{ cancelText }}
22
22
  </view>
23
- <view class="u-picker__title">{{ title }}</view>
23
+ <view class="u-picker__title u-line-1">{{ title }}</view>
24
24
  <view
25
25
  class="u-btn-picker u-btn-picker--primary"
26
26
  :style="{ color: moving ? cancelColor : confirmColor }"
@@ -33,103 +33,105 @@
33
33
  </view>
34
34
  </view>
35
35
  <view class="u-picker-body">
36
- <picker-view
37
- v-if="mode == 'region'"
38
- :value="valueArr"
39
- @change="change"
40
- class="u-picker-view"
41
- @pickstart="pickstart"
42
- @pickend="pickend"
43
- >
44
- <picker-view-column v-if="!reset && params.province">
45
- <view class="u-column-item" v-for="(item, index) in provinces" :key="index">
46
- <view class="u-line-1">{{ item.label }}</view>
47
- </view>
48
- </picker-view-column>
49
- <picker-view-column v-if="!reset && params.city">
50
- <view class="u-column-item" v-for="(item, index) in citysRef" :key="index">
51
- <view class="u-line-1">{{ item.label }}</view>
52
- </view>
53
- </picker-view-column>
54
- <picker-view-column v-if="!reset && params.area">
55
- <view class="u-column-item" v-for="(item, index) in areasRef" :key="index">
56
- <view class="u-line-1">{{ item.label }}</view>
57
- </view>
58
- </picker-view-column>
59
- </picker-view>
60
- <picker-view
61
- v-else-if="mode == 'time'"
62
- :value="valueArr"
63
- @change="change"
64
- class="u-picker-view"
65
- @pickstart="pickstart"
66
- @pickend="pickend"
67
- >
68
- <picker-view-column v-if="!reset && params.year">
69
- <view class="u-column-item" v-for="(item, index) in years" :key="index">
70
- {{ item }}
71
- <text class="u-text" v-if="showTimeTag">年</text>
72
- </view>
73
- </picker-view-column>
74
- <picker-view-column v-if="!reset && params.month">
75
- <view class="u-column-item" v-for="(item, index) in months" :key="index">
76
- {{ formatNumber(item) }}
77
- <text class="u-text" v-if="showTimeTag">月</text>
78
- </view>
79
- </picker-view-column>
80
- <picker-view-column v-if="!reset && params.day">
81
- <view class="u-column-item" v-for="(item, index) in days" :key="index">
82
- {{ formatNumber(item) }}
83
- <text class="u-text" v-if="showTimeTag">日</text>
84
- </view>
85
- </picker-view-column>
86
- <picker-view-column v-if="!reset && params.hour">
87
- <view class="u-column-item" v-for="(item, index) in hours" :key="index">
88
- {{ formatNumber(item) }}
89
- <text class="u-text" v-if="showTimeTag">时</text>
90
- </view>
91
- </picker-view-column>
92
- <picker-view-column v-if="!reset && params.minute">
93
- <view class="u-column-item" v-for="(item, index) in minutes" :key="index">
94
- {{ formatNumber(item) }}
95
- <text class="u-text" v-if="showTimeTag">分</text>
96
- </view>
97
- </picker-view-column>
98
- <picker-view-column v-if="!reset && params.second">
99
- <view class="u-column-item" v-for="(item, index) in seconds" :key="index">
100
- {{ formatNumber(item) }}
101
- <text class="u-text" v-if="showTimeTag">秒</text>
102
- </view>
103
- </picker-view-column>
104
- </picker-view>
105
- <picker-view
106
- v-else-if="mode == 'selector'"
107
- :value="valueArr"
108
- @change="change"
109
- class="u-picker-view"
110
- @pickstart="pickstart"
111
- @pickend="pickend"
112
- >
113
- <picker-view-column v-if="!reset">
114
- <view class="u-column-item" v-for="(item, index) in range" :key="index">
115
- <view class="u-line-1">{{ getItemValue(item, 'selector') }}</view>
116
- </view>
117
- </picker-view-column>
118
- </picker-view>
119
- <picker-view
120
- v-else-if="mode == 'multiSelector'"
121
- :value="valueArr"
122
- @change="change"
123
- class="u-picker-view"
124
- @pickstart="pickstart"
125
- @pickend="pickend"
126
- >
127
- <picker-view-column v-if="!reset" v-for="(item, index) in range" :key="index">
128
- <view class="u-column-item" v-for="(item1, index1) in item" :key="index1">
129
- <view class="u-line-1">{{ getItemValue(item1, 'multiSelector') }}</view>
130
- </view>
131
- </picker-view-column>
132
- </picker-view>
36
+ <template v-if="readyToRender">
37
+ <picker-view
38
+ v-if="mode == 'region'"
39
+ :value="valueArr"
40
+ @change="change"
41
+ class="u-picker-view"
42
+ @pickstart="pickstart"
43
+ @pickend="pickend"
44
+ >
45
+ <picker-view-column v-if="params.province">
46
+ <view class="u-column-item" v-for="(item, index) in provinces" :key="index">
47
+ <view class="u-line-1">{{ item.label }}</view>
48
+ </view>
49
+ </picker-view-column>
50
+ <picker-view-column v-if="params.city">
51
+ <view class="u-column-item" v-for="(item, index) in citysRef" :key="index">
52
+ <view class="u-line-1">{{ item.label }}</view>
53
+ </view>
54
+ </picker-view-column>
55
+ <picker-view-column v-if="params.area">
56
+ <view class="u-column-item" v-for="(item, index) in areasRef" :key="index">
57
+ <view class="u-line-1">{{ item.label }}</view>
58
+ </view>
59
+ </picker-view-column>
60
+ </picker-view>
61
+ <picker-view
62
+ v-else-if="mode == 'time'"
63
+ :value="valueArr"
64
+ @change="change"
65
+ class="u-picker-view"
66
+ @pickstart="pickstart"
67
+ @pickend="pickend"
68
+ >
69
+ <picker-view-column v-if="params.year">
70
+ <view class="u-column-item" v-for="(item, index) in years" :key="index">
71
+ {{ item }}
72
+ <text class="u-text" v-if="showTimeTag">年</text>
73
+ </view>
74
+ </picker-view-column>
75
+ <picker-view-column v-if="params.month">
76
+ <view class="u-column-item" v-for="(item, index) in months" :key="index">
77
+ {{ formatNumber(item) }}
78
+ <text class="u-text" v-if="showTimeTag">月</text>
79
+ </view>
80
+ </picker-view-column>
81
+ <picker-view-column v-if="params.day">
82
+ <view class="u-column-item" v-for="(item, index) in days" :key="index">
83
+ {{ formatNumber(item) }}
84
+ <text class="u-text" v-if="showTimeTag">日</text>
85
+ </view>
86
+ </picker-view-column>
87
+ <picker-view-column v-if="params.hour">
88
+ <view class="u-column-item" v-for="(item, index) in hours" :key="index">
89
+ {{ formatNumber(item) }}
90
+ <text class="u-text" v-if="showTimeTag">时</text>
91
+ </view>
92
+ </picker-view-column>
93
+ <picker-view-column v-if="params.minute">
94
+ <view class="u-column-item" v-for="(item, index) in minutes" :key="index">
95
+ {{ formatNumber(item) }}
96
+ <text class="u-text" v-if="showTimeTag">分</text>
97
+ </view>
98
+ </picker-view-column>
99
+ <picker-view-column v-if="params.second">
100
+ <view class="u-column-item" v-for="(item, index) in seconds" :key="index">
101
+ {{ formatNumber(item) }}
102
+ <text class="u-text" v-if="showTimeTag">秒</text>
103
+ </view>
104
+ </picker-view-column>
105
+ </picker-view>
106
+ <picker-view
107
+ v-else-if="mode == 'selector'"
108
+ :value="valueArr"
109
+ @change="change"
110
+ class="u-picker-view"
111
+ @pickstart="pickstart"
112
+ @pickend="pickend"
113
+ >
114
+ <picker-view-column>
115
+ <view class="u-column-item" v-for="(item, index) in range" :key="index">
116
+ <view class="u-line-1">{{ getItemValue(item, 'selector') }}</view>
117
+ </view>
118
+ </picker-view-column>
119
+ </picker-view>
120
+ <picker-view
121
+ v-else-if="mode == 'multiSelector'"
122
+ :value="valueArr"
123
+ @change="change"
124
+ class="u-picker-view"
125
+ @pickstart="pickstart"
126
+ @pickend="pickend"
127
+ >
128
+ <picker-view-column v-for="(item, index) in range" :key="index">
129
+ <view class="u-column-item" v-for="(item1, index1) in item" :key="index1">
130
+ <view class="u-line-1">{{ getItemValue(item1, 'multiSelector') }}</view>
131
+ </view>
132
+ </picker-view-column>
133
+ </picker-view>
134
+ </template>
133
135
  </view>
134
136
  </view>
135
137
  </u-popup>
@@ -166,7 +168,7 @@ import { PickerProps } from './types';
166
168
  * @property {Boolean} safe-area-inset-bottom 是否开启底部安全区适配(默认false)
167
169
  * @property {Boolean} show-time-tag 时间模式时,是否显示后面的年月日中文提示
168
170
  * @property {String} cancel-color 取消按钮的颜色(默认#606266)
169
- * @property {String} confirm-color 确认按钮的颜色(默认#2979ff
171
+ * @property {String} confirm-color 确认按钮的颜色(默认主题色primary
170
172
  * @property {String} default-time 默认选中的时间,mode=time时有效
171
173
  * @property {String} confirm-text 确认按钮的文字
172
174
  * @property {String} cancel-text 取消按钮的文字
@@ -203,7 +205,6 @@ const day = ref<number>(0);
203
205
  const hour = ref<number>(0);
204
206
  const minute = ref<number>(0);
205
207
  const second = ref<number>(0);
206
- const reset = ref(false);
207
208
  const startDate = ref('');
208
209
  const endDate = ref('');
209
210
  const valueArr = ref<number[]>([]);
@@ -216,6 +217,51 @@ const area = ref<number>(0);
216
217
  // 列是否还在滑动中,微信小程序如果在滑动中就点确定,结果可能不准确
217
218
  const moving = ref(false);
218
219
  const multiSelectorValue = ref<number[]>([]);
220
+ // 控制 picker-view 是否渲染(等待 init 完成以避免 APP-PLUS 首次渲染时获取不到默认值)
221
+ const readyToRender = ref(false);
222
+
223
+ // 保存用户上次确认的值(如果用户从未确认过,则为 null)
224
+ const savedDefaultSelector = ref<number[] | null>(
225
+ props.defaultSelector && (props.defaultSelector as any[]).length ? (props.defaultSelector as any[]).slice() : null
226
+ );
227
+ const savedDefaultTime = ref<string | null>(props.defaultTime ? props.defaultTime : null);
228
+ const savedDefaultRegion = ref<any[] | null>(
229
+ props.defaultRegion && props.defaultRegion.length ? props.defaultRegion.slice() : null
230
+ );
231
+
232
+ // Helper: get effective defaults according to preserveSelection
233
+ function getEffectiveDefaultSelector(): number[] {
234
+ // 计算生效的 selector 默认值,并打印调试信息
235
+ let res: number[] = [];
236
+ if (props.preserveSelection) {
237
+ if (savedDefaultSelector && savedDefaultSelector.value && savedDefaultSelector.value.length)
238
+ res = savedDefaultSelector.value.slice();
239
+ else res = (props.defaultSelector as number[]) || [0];
240
+ } else {
241
+ if (props.defaultSelector && (props.defaultSelector as any[]).length) res = props.defaultSelector as number[];
242
+ else res = savedDefaultSelector.value ?? [0];
243
+ }
244
+ return res;
245
+ }
246
+
247
+ function getEffectiveDefaultTime(): string {
248
+ let res: string;
249
+ if (props.preserveSelection) res = savedDefaultTime.value ?? props.defaultTime ?? '';
250
+ else res = props.defaultTime ?? savedDefaultTime.value ?? '';
251
+ return res;
252
+ }
253
+
254
+ function getEffectiveDefaultRegion(): any[] {
255
+ let res: any[] = [];
256
+ if (props.preserveSelection) {
257
+ if (savedDefaultRegion.value && savedDefaultRegion.value.length) res = savedDefaultRegion.value.slice();
258
+ else res = props.defaultRegion || [];
259
+ } else {
260
+ if (props.defaultRegion && props.defaultRegion.length) res = props.defaultRegion.slice();
261
+ else res = savedDefaultRegion.value ?? [];
262
+ }
263
+ return res;
264
+ }
219
265
 
220
266
  // 计算属性
221
267
  // 引用这几个变量,是为了监听其变化
@@ -230,11 +276,63 @@ const yearAndMonth = computed(() => `${year.value}-${month.value}`);
230
276
  // 如果用户有传递z-index值,优先使用
231
277
  const uZIndex = computed(() => (props.zIndex ? props.zIndex : 1075));
232
278
 
233
- // 监听
234
- watch(propsChange, () => {
235
- reset.value = true;
236
- setTimeout(() => init(), 10);
237
- });
279
+ // 当外部的默认值被动态修改时,如果 preserveSelection 为 false,应把外部值视为新的 saved 值并在打开时生效
280
+ watch(
281
+ () => props.defaultSelector,
282
+ async n => {
283
+ if (!props.preserveSelection) {
284
+ savedDefaultSelector.value = n && (n as any[]).length ? (n as any[]).slice() : null;
285
+ if (props.modelValue) {
286
+ // reinit while open
287
+ readyToRender.value = false;
288
+ await nextTick();
289
+ // #ifdef APP-PLUS
290
+ await new Promise(resolve => setTimeout(resolve, 20));
291
+ // #endif
292
+ await init();
293
+ readyToRender.value = true;
294
+ }
295
+ }
296
+ },
297
+ { deep: true }
298
+ );
299
+
300
+ watch(
301
+ () => props.defaultTime,
302
+ async n => {
303
+ if (!props.preserveSelection) {
304
+ savedDefaultTime.value = n || null;
305
+ if (props.modelValue) {
306
+ readyToRender.value = false;
307
+ await nextTick();
308
+ // #ifdef APP-PLUS
309
+ await new Promise(resolve => setTimeout(resolve, 20));
310
+ // #endif
311
+ await init();
312
+ readyToRender.value = true;
313
+ }
314
+ }
315
+ }
316
+ );
317
+
318
+ watch(
319
+ () => props.defaultRegion,
320
+ async n => {
321
+ if (!props.preserveSelection) {
322
+ savedDefaultRegion.value = n && (n as any[]).length ? (n as any[]).slice() : null;
323
+ if (props.modelValue) {
324
+ readyToRender.value = false;
325
+ await nextTick();
326
+ // #ifdef APP-PLUS
327
+ await new Promise(resolve => setTimeout(resolve, 20));
328
+ // #endif
329
+ await init();
330
+ readyToRender.value = true;
331
+ }
332
+ }
333
+ },
334
+ { deep: true }
335
+ );
238
336
 
239
337
  // 如果地区发生变化,为了让picker联动起来,必须重置this.citys和this.areas
240
338
  watch(regionChange, () => {
@@ -249,10 +347,20 @@ watch(yearAndMonth, () => {
249
347
  });
250
348
  watch(
251
349
  () => props.modelValue,
252
- n => {
350
+ async n => {
253
351
  if (n) {
254
- reset.value = true;
255
- setTimeout(() => init(), 10);
352
+ // 等待一次 DOM 更新
353
+ await nextTick();
354
+ // APP-PLUS 原生控件可能需要更长的原生初始化时间,先短延迟以提高稳定性
355
+ // #ifdef APP-PLUS
356
+ await new Promise(resolve => setTimeout(resolve, 20));
357
+ // #endif
358
+ // 初始化数据并在完成后再渲染 picker-view
359
+ await init();
360
+ readyToRender.value = true;
361
+ } else {
362
+ // 关闭时隐藏 picker,保留已保存的值
363
+ readyToRender.value = false;
256
364
  }
257
365
  }
258
366
  );
@@ -316,7 +424,8 @@ function getIndex(arr: any[], val: any) {
316
424
  */
317
425
  function initTimeValue() {
318
426
  // 格式化时间,在IE浏览器(uni不存在此情况),无法识别日期间的"-"间隔符号
319
- let fdate = props.defaultTime.replace(/\-/g, '/');
427
+ const effectiveTime = getEffectiveDefaultTime() || '';
428
+ let fdate = effectiveTime.replace(/\-/g, '/');
320
429
  fdate = fdate && fdate.indexOf('/') == -1 ? `2020/01/01 ${fdate}` : fdate;
321
430
  let time: Date;
322
431
  if (fdate) time = new Date(fdate);
@@ -332,9 +441,8 @@ function initTimeValue() {
332
441
  /**
333
442
  * 初始化picker各列数据
334
443
  */
335
- function init() {
444
+ async function init() {
336
445
  valueArr.value = [];
337
- reset.value = false;
338
446
  if (props.mode == 'time') {
339
447
  initTimeValue();
340
448
  if (props.params.year) {
@@ -375,12 +483,14 @@ function init() {
375
483
  setAreas();
376
484
  }
377
485
  } else if (props.mode == 'selector') {
378
- valueArr.value = props.defaultSelector as number[];
486
+ // use effective default selector according to preserveSelection
487
+ valueArr.value = getEffectiveDefaultSelector();
379
488
  } else if (props.mode == 'multiSelector') {
380
- valueArr.value = props.defaultSelector as number[];
381
- multiSelectorValue.value = props.defaultSelector as number[];
489
+ valueArr.value = getEffectiveDefaultSelector();
490
+ multiSelectorValue.value = getEffectiveDefaultSelector();
382
491
  }
383
- nextTick(() => {});
492
+ // 等待 DOM 与 Vue 响应式更新完成,确保在原生组件挂载时数据已就绪
493
+ await nextTick();
384
494
  }
385
495
  /**
386
496
  * 设置年份列
@@ -443,14 +553,16 @@ function setSeconds() {
443
553
  function setProvinces() {
444
554
  // 判断是否需要province参数
445
555
  if (!props.params.province) return;
446
- let tmp: any = '';
556
+ let tmp: any = 0;
447
557
  let useCode = false;
448
558
  // 如果同时配置了defaultRegion和areaCode,优先使用areaCode参数
449
559
  if (props.areaCode.length) {
450
560
  tmp = props.areaCode[0];
451
561
  useCode = true;
452
- } else if (props.defaultRegion.length) tmp = props.defaultRegion[0];
453
- else tmp = 0;
562
+ } else {
563
+ const effRegion = getEffectiveDefaultRegion();
564
+ if (effRegion && effRegion.length) tmp = effRegion[0];
565
+ }
454
566
  // 历遍省份数组匹配
455
567
  provinces.map((v: any, k: number) => {
456
568
  if (useCode ? v.value == tmp : v.label == tmp) {
@@ -467,13 +579,15 @@ function setProvinces() {
467
579
  */
468
580
  function setCitys() {
469
581
  if (!props.params.city) return;
470
- let tmp: any = '';
582
+ let tmp: any = 0;
471
583
  let useCode = false;
472
584
  if (props.areaCode.length) {
473
585
  tmp = props.areaCode[1];
474
586
  useCode = true;
475
- } else if (props.defaultRegion.length) tmp = props.defaultRegion[1];
476
- else tmp = 0;
587
+ } else {
588
+ const effRegion = getEffectiveDefaultRegion();
589
+ if (effRegion && effRegion.length) tmp = effRegion[1];
590
+ }
477
591
  // 历遍城市数组匹配
478
592
  citys[province.value].map((v: any, k: number) => {
479
593
  if (useCode ? v.value == tmp : v.label == tmp) {
@@ -490,13 +604,15 @@ function setCitys() {
490
604
  */
491
605
  function setAreas() {
492
606
  if (!props.params.area) return;
493
- let tmp: any = '';
607
+ let tmp: any = 0;
494
608
  let useCode = false;
495
609
  if (props.areaCode.length) {
496
610
  tmp = props.areaCode[2];
497
611
  useCode = true;
498
- } else if (props.defaultRegion.length) tmp = props.defaultRegion[2];
499
- else tmp = 0;
612
+ } else {
613
+ const effRegion = getEffectiveDefaultRegion();
614
+ if (effRegion && effRegion.length) tmp = effRegion[2];
615
+ }
500
616
  // 历遍区县数组匹配
501
617
  areas[province.value][city.value].map((v: any, k: number) => {
502
618
  if (useCode ? v.value == tmp : v.label == tmp) {
@@ -581,6 +697,40 @@ function getResult(event: string | null = null) {
581
697
  result = valueArr.value;
582
698
  }
583
699
  // 只允许 emit 已声明的事件类型
700
+ // 保存用户确认的选择为下次默认(如果用户点了确认)
701
+ if (event === 'confirm') {
702
+ // time 模式保存字符串
703
+ if (props.mode == 'time') {
704
+ // 构造时间字符串,按 year-month-day [hour:minute:second]
705
+ const pad = (n: number) => (n < 10 ? '0' + n : '' + n);
706
+ let timeStr = `${year.value}-${pad(month.value)}-${pad(day.value)}`;
707
+ if (props.params.hour)
708
+ timeStr +=
709
+ ` ${pad(hour.value)}:${pad(minute.value)}` + (props.params.second ? `:${pad(second.value)}` : '');
710
+ savedDefaultTime.value = timeStr;
711
+ } else if (props.mode == 'region') {
712
+ // 保存为 label 数组,便于 later 使用 defaultRegion
713
+ const prov = provinces[province.value] ? provinces[province.value].label : undefined;
714
+ const cit =
715
+ citys[province.value] && citys[province.value][city.value]
716
+ ? citys[province.value][city.value].label
717
+ : undefined;
718
+ const are =
719
+ areas[province.value] &&
720
+ areas[province.value][city.value] &&
721
+ areas[province.value][city.value][area.value]
722
+ ? areas[province.value][city.value][area.value].label
723
+ : undefined;
724
+ const arr: any[] = [];
725
+ if (prov !== undefined) arr.push(prov);
726
+ if (cit !== undefined) arr.push(cit);
727
+ if (are !== undefined) arr.push(are);
728
+ savedDefaultRegion.value = arr;
729
+ } else if (props.mode == 'selector' || props.mode == 'multiSelector') {
730
+ savedDefaultSelector.value = valueArr.value ? valueArr.value.slice() : null;
731
+ }
732
+ }
733
+
584
734
  if (event && ['update:modelValue', 'confirm', 'cancel', 'columnchange'].includes(event))
585
735
  emit(event as 'update:modelValue' | 'confirm' | 'cancel' | 'columnchange', result);
586
736
  close();
@@ -618,7 +768,6 @@ onMounted(() => {
618
768
  .u-picker-header {
619
769
  width: 100%;
620
770
  height: 90rpx;
621
- padding: 0 40rpx;
622
771
  @include vue-flex;
623
772
  justify-content: space-between;
624
773
  align-items: center;
@@ -665,7 +814,8 @@ onMounted(() => {
665
814
  }
666
815
 
667
816
  .u-btn-picker {
668
- padding: 16rpx;
817
+ min-width: 150rpx;
818
+ padding: 20rpx 30rpx;
669
819
  box-sizing: border-box;
670
820
  text-align: center;
671
821
  text-decoration: none;
@@ -250,8 +250,8 @@ function setRadioCheckedStatus() {
250
250
 
251
251
  &--checked {
252
252
  color: #fff;
253
- background-color: #2979ff;
254
- border-color: #2979ff;
253
+ background-color: $u-type-primary;
254
+ border-color: $u-type-primary;
255
255
  }
256
256
 
257
257
  &--disabled {
@@ -1,6 +1,7 @@
1
1
  import type { ExtractPropTypes, PropType } from 'vue';
2
2
  import type { Shape } from '../../types/global';
3
3
  import { baseProps } from '../common/props';
4
+ import { $u } from '../../';
4
5
 
5
6
  /**
6
7
  * RadioGroupProps 单选框组 props 类型定义
@@ -13,7 +14,7 @@ export const RadioGroupProps = {
13
14
  /** 匹配某一个radio组件,如果某个radio的name值等于此值,那么这个radio就被会选中 */
14
15
  modelValue: { type: [String, Number] as PropType<string | number>, default: '' },
15
16
  /** 选中状态下的颜色 */
16
- activeColor: { type: String, default: '#2979ff' },
17
+ activeColor: { type: String, default: $u.color.primary },
17
18
  /** 组件的整体大小 */
18
19
  size: { type: [String, Number] as PropType<number | string>, default: 34 },
19
20
  /** 是否禁止点击提示语选中复选框 */
@@ -27,7 +27,7 @@ import { RadioGroupProps } from './types';
27
27
  * @tutorial https://uviewpro.cn/zh/components/radio.html
28
28
  * @property {Boolean} disabled 是否禁用所有radio(默认false)
29
29
  * @property {String|Number} size 组件整体的大小,单位rpx(默认40)
30
- * @property {String} active-color 选中时的颜色,应用到所有子Radio组件(默认#2979ff
30
+ * @property {String} active-color 选中时的颜色,应用到所有子Radio组件(默认主题色primary
31
31
  * @property {String|Number} icon-size 图标大小,单位rpx(默认20)
32
32
  * @property {String} shape 外观形状,shape-方形,circle-圆形(默认circle)
33
33
  * @property {Boolean} label-disabled 是否禁止点击文本操作checkbox(默认false)
@@ -1,5 +1,6 @@
1
1
  import type { ExtractPropTypes, PropType } from 'vue';
2
2
  import { baseProps } from '../common/props';
3
+ import { $u } from '../../';
3
4
 
4
5
  /**
5
6
  * ReadMoreProps 阅读更多 props 类型定义
@@ -16,7 +17,7 @@ export const ReadMoreProps = {
16
17
  /** 展开时的提示文字 */
17
18
  openText: { type: String, default: '收起' },
18
19
  /** 提示的文字颜色 */
19
- color: { type: String, default: '#2979ff' },
20
+ color: { type: String, default: $u.color.primary },
20
21
  /** 提示文字的大小 */
21
22
  fontSize: { type: [String, Number] as PropType<number | string>, default: 28 },
22
23
  /** 是否显示阴影 */
@@ -66,7 +66,7 @@ import { ReadMoreProps } from './types';
66
66
  * @property {String|Number} fontSize 提示文字的大小,单位rpx(默认28)
67
67
  * @property {String} textIndent 段落首行缩进的字符个数(默认2em)
68
68
  * @property {String} openText 展开时的提示文字(默认“收起”)
69
- * @property {String} color 提示文字的颜色(默认#2979ff
69
+ * @property {String} color 提示文字的颜色(默认主题色primary
70
70
  * @property {Object} shadowStyle 是否显示阴影,样式对象
71
71
  * @property {String|Number} index open和close事件时,将此参数返回在回调参数中
72
72
  * @event open 展开时触发
@@ -1,6 +1,7 @@
1
1
  import type { ExtractPropTypes, PropType } from 'vue';
2
2
  import type { SelectListItem, SelectMode } from '../../types/global';
3
3
  import { baseProps } from '../common/props';
4
+ import { $u } from '../../';
4
5
 
5
6
  /**
6
7
  * SelectProps 列选择器 props 类型定义
@@ -15,9 +16,9 @@ export const SelectProps = {
15
16
  /** 通过双向绑定控制组件的弹出与收起 */
16
17
  modelValue: { type: Boolean, default: false },
17
18
  /** "取消"按钮的颜色 */
18
- cancelColor: { type: String, default: '#606266' },
19
+ cancelColor: { type: String, default: $u.color.contentColor },
19
20
  /** "确定"按钮的颜色 */
20
- confirmColor: { type: String, default: '#2979ff' },
21
+ confirmColor: { type: String, default: $u.color.primary },
21
22
  /** 弹出的z-index值 */
22
23
  zIndex: { type: [String, Number] as PropType<string | number>, default: 0 },
23
24
  /** 是否开启底部安全区适配 */
@@ -26,6 +27,8 @@ export const SelectProps = {
26
27
  maskCloseAble: { type: Boolean, default: true },
27
28
  /** 提供的默认选中的下标 */
28
29
  defaultValue: { type: Array as PropType<number[]>, default: () => [0] },
30
+ /** 是否保留用户上次确认的选择(true:优先使用已保存的选择;false:优先使用外部传入的 defaultValue) */
31
+ preserveSelection: { type: Boolean, default: true },
29
32
  /** 模式选择,single-column-单列,mutil-column-多列,mutil-column-auto-多列联动 */
30
33
  mode: { type: String as PropType<SelectMode>, default: 'single-column' },
31
34
  /** 自定义value属性名 */