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.
- package/changelog.md +22 -0
- package/components/u-calendar/types.ts +3 -2
- package/components/u-calendar/u-calendar.vue +2 -2
- package/components/u-checkbox-group/types.ts +2 -1
- package/components/u-checkbox-group/u-checkbox-group.vue +1 -1
- package/components/u-city-select/u-city-select.vue +2 -2
- package/components/u-dropdown/types.ts +3 -2
- package/components/u-dropdown/u-dropdown.vue +1 -1
- package/components/u-index-anchor/u-index-anchor.vue +1 -1
- package/components/u-index-list/types.ts +2 -1
- package/components/u-index-list/u-index-list.vue +1 -1
- package/components/u-link/types.ts +2 -1
- package/components/u-message-input/types.ts +3 -2
- package/components/u-message-input/u-message-input.vue +1 -1
- package/components/u-modal/types.ts +3 -2
- package/components/u-modal/u-modal.vue +1 -1
- package/components/u-picker/types.ts +8 -2
- package/components/u-picker/u-picker.vue +276 -126
- package/components/u-radio/u-radio.vue +2 -2
- package/components/u-radio-group/types.ts +2 -1
- package/components/u-radio-group/u-radio-group.vue +1 -1
- package/components/u-read-more/types.ts +2 -1
- package/components/u-read-more/u-read-more.vue +1 -1
- package/components/u-select/types.ts +5 -2
- package/components/u-select/u-select.vue +56 -18
- package/components/u-slider/types.ts +3 -2
- package/components/u-slider/u-slider.vue +2 -2
- package/components/u-step/types.ts +29 -0
- package/components/u-step/u-step.vue +264 -0
- package/components/u-steps/types.ts +3 -2
- package/components/u-steps/u-steps.vue +17 -106
- package/components/u-switch/types.ts +2 -1
- package/components/u-switch/u-switch.vue +2 -2
- package/components/u-tabs/types.ts +3 -2
- package/components/u-tabs/u-tabs.vue +1 -1
- package/components/u-tabs-swiper/types.ts +3 -2
- package/components/u-tabs-swiper/u-tabs-swiper.vue +1 -1
- package/package.json +1 -1
- package/types/components.d.ts +1 -0
- 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
|
-
<
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
<view
|
|
46
|
-
<view class="u-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
<view
|
|
51
|
-
<view class="u-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
<view
|
|
56
|
-
<view class="u-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
<view
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
<view
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
<view
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
<view
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
<view
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
<view
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
<view
|
|
115
|
-
<view class="u-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
<view
|
|
129
|
-
<view class="u-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
|
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(
|
|
235
|
-
|
|
236
|
-
|
|
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
|
-
|
|
255
|
-
|
|
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
|
-
|
|
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
|
-
|
|
486
|
+
// use effective default selector according to preserveSelection
|
|
487
|
+
valueArr.value = getEffectiveDefaultSelector();
|
|
379
488
|
} else if (props.mode == 'multiSelector') {
|
|
380
|
-
valueArr.value =
|
|
381
|
-
multiSelectorValue.value =
|
|
489
|
+
valueArr.value = getEffectiveDefaultSelector();
|
|
490
|
+
multiSelectorValue.value = getEffectiveDefaultSelector();
|
|
382
491
|
}
|
|
383
|
-
|
|
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
|
|
453
|
-
|
|
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
|
|
476
|
-
|
|
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
|
|
499
|
-
|
|
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
|
-
|
|
817
|
+
min-width: 150rpx;
|
|
818
|
+
padding: 20rpx 30rpx;
|
|
669
819
|
box-sizing: border-box;
|
|
670
820
|
text-align: center;
|
|
671
821
|
text-decoration: none;
|
|
@@ -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:
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
19
|
+
cancelColor: { type: String, default: $u.color.contentColor },
|
|
19
20
|
/** "确定"按钮的颜色 */
|
|
20
|
-
confirmColor: { type: String, default:
|
|
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属性名 */
|