uview-pro 0.5.1 → 0.5.3
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 +56 -4
- package/components/u-alert-tips/u-alert-tips.vue +15 -15
- package/components/u-checkbox/types.ts +5 -1
- package/components/u-checkbox/u-checkbox.vue +41 -18
- package/components/u-checkbox-group/types.ts +2 -0
- package/components/u-checkbox-group/u-checkbox-group.vue +56 -15
- package/components/u-field/u-field.vue +18 -2
- package/components/u-form/u-form.vue +1 -1
- package/components/u-gap/u-gap.vue +3 -3
- package/components/u-navbar/u-navbar.vue +8 -2
- package/components/u-picker/u-picker.vue +13 -5
- package/components/u-radio/types.ts +2 -0
- package/components/u-radio/u-radio.vue +16 -7
- package/components/u-radio-group/u-radio-group.vue +1 -1
- package/components/u-search/types.ts +3 -1
- package/components/u-search/u-search.vue +1 -0
- package/components/u-select/u-select.vue +17 -3
- package/components/u-tabbar/u-tabbar.vue +1 -1
- package/components/u-text/u-text.vue +7 -2
- package/components/u-toast/u-toast.vue +14 -11
- package/components/u-transition/types.ts +35 -0
- package/components/u-transition/u-transition.vue +437 -0
- package/index.ts +2 -0
- package/libs/css/style.theme.scss +23 -0
- package/libs/hooks/index.ts +2 -0
- package/libs/hooks/useDebounce.ts +15 -0
- package/libs/hooks/useThrottle.ts +16 -0
- package/libs/util/config-provider.ts +10 -1
- package/package.json +6 -6
- package/types/components.d.ts +1 -0
- package/types/global.d.ts +14 -0
package/changelog.md
CHANGED
|
@@ -1,14 +1,66 @@
|
|
|
1
|
-
## 0.5.
|
|
1
|
+
## 0.5.3(2026-01-26)
|
|
2
2
|
|
|
3
|
-
###
|
|
3
|
+
### ♻️ Code Refactoring | 代码重构
|
|
4
4
|
|
|
5
|
-
- **
|
|
6
|
-
|
|
5
|
+
- **demo-page:** 移除标签栏外层sticky组件 ([ed49275](https://github.com/anyup/uView-Pro/commit/ed49275bc2962426dc4f9185b4b35f6a994cf383))
|
|
6
|
+
|
|
7
|
+
### 👷 Continuous Integration | CI 配置
|
|
8
|
+
|
|
9
|
+
- 添加 npm 包测试脚本 ([78c5524](https://github.com/anyup/uView-Pro/commit/78c5524abbbc368949ec58437361c995f5146234))
|
|
10
|
+
|
|
11
|
+
### 🐛 Bug Fixes | Bug 修复
|
|
12
|
+
|
|
13
|
+
- **locale:** 修复本地运行时locale国际化字段未加载成功的问题 ([10c017a](https://github.com/anyup/uView-Pro/commit/10c017a401232224ca1642274d65f031f74f12f0))
|
|
14
|
+
- **u-picker:** 修复u-picker/u-select选择器在亮色/暗黑模式下背景色显示问题 ([072a6cc](https://github.com/anyup/uView-Pro/commit/072a6cc1095b5f17b0c15c3cd2a3d6a75d8a9f08))
|
|
7
15
|
|
|
8
16
|
### 👥 Contributors
|
|
9
17
|
|
|
10
18
|
<a href="https://github.com/anyup"><img src="https://github.com/anyup.png?size=40" width="40" height="40" alt="anyup" title="anyup"/></a>
|
|
11
19
|
|
|
20
|
+
## 0.5.2(2026-01-23)
|
|
21
|
+
|
|
22
|
+
### ✨ Features | 新功能
|
|
23
|
+
|
|
24
|
+
- **u-checkbox-group:** 重构u-checkbox多选框组件,group支持v-model双向绑定,标准化使用api ([e4a12f1](https://github.com/anyup/uView-Pro/commit/e4a12f1af6a4d8cae18823b42a918052df36b62d))
|
|
25
|
+
- **hooks:** 新增防抖和节流hook ([4b09373](https://github.com/anyup/uView-Pro/commit/4b09373c31dc3ab7ded01c6ea0cfdf902642b857))
|
|
26
|
+
- **u-search:** 新增adjust-position属性控制键盘弹出时的高度调节 ([3443e7c](https://github.com/anyup/uView-Pro/commit/3443e7cc0d754c10df03134e8bc2c6c977758610))
|
|
27
|
+
- **u-tabbar:** 调整u-tabbar凸起图标上边距以优化显示效果 ([d0963be](https://github.com/anyup/uView-Pro/commit/d0963be197079733779719aae43694ae5b47e6bc))
|
|
28
|
+
- **u-transition:** 新增transition过渡动画组件 ([28ee2c8](https://github.com/anyup/uView-Pro/commit/28ee2c8b0f74bae722f0fe50e498e3407907d2f6))
|
|
29
|
+
- **u-transition:** 添加动画模式切换时的时序控制 ([af4bf0a](https://github.com/anyup/uView-Pro/commit/af4bf0a690128ba16e7660d2ae54c5b93644cfdf))
|
|
30
|
+
- **u-text:** 优化按钮模式在block模式下的样式 ([afda81d](https://github.com/anyup/uView-Pro/commit/afda81d0c8fa7b628b81f8368e6bd2983779b7c9))
|
|
31
|
+
- **u-radio:** 添加label和value属性支持 ([1b824d7](https://github.com/anyup/uView-Pro/commit/1b824d7867dc7fcc3793d7b5d84cbbbcb512dab0))
|
|
32
|
+
|
|
33
|
+
### 🐛 Bug Fixes | Bug 修复
|
|
34
|
+
|
|
35
|
+
- **u-checkbox-group:** 修复全选时,u-checkbox-group多次触发change的问题 ([9f813df](https://github.com/anyup/uView-Pro/commit/9f813dfb8a2b8e178b7347223281e09b039f74b0))
|
|
36
|
+
- **u-gap:** 修复 gap 间隔槽传递带单位尺寸无法正确解析的问题 ([cc24efd](https://github.com/anyup/uView-Pro/commit/cc24efd658e510fb9655a189ceaee2647db81528))
|
|
37
|
+
- **u-alert-tips:** 修复微信小程序下组件样式和图标配置不生效的问题 ([d74900e](https://github.com/anyup/uView-Pro/commit/d74900e9e8a61a68b8971abc81e440e8449d3576))
|
|
38
|
+
- **u-navbar:** 修复获取状态栏高度在某些平台失败的问题 ([b8b288e](https://github.com/anyup/uView-Pro/commit/b8b288e33348b78e03be349c6c123e36511342af))
|
|
39
|
+
- **u-toast:** 修复toast提示组件设置prop无效的问题 ([ecd3a0a](https://github.com/anyup/uView-Pro/commit/ecd3a0a23a0ca039fa0abe3a946bfdf1024dd10a))
|
|
40
|
+
- **locale:** 修复注册uview-pro组件库时,未传递locale导致初始化语言包失败的问题 ([d716100](https://github.com/anyup/uView-Pro/commit/d7161000fe9e3d222453603d8fa31d29a1b9a9bb))
|
|
41
|
+
- **u-field:** 修复u-field在禁用状态下,点击输入框无法触发click事件的问题 ([f47761d](https://github.com/anyup/uView-Pro/commit/f47761d00fe2913f0e611577651a3f4108e060b6))
|
|
42
|
+
|
|
43
|
+
### ♻️ Code Refactoring | 代码重构
|
|
44
|
+
|
|
45
|
+
- **demo:** 重构u-checkbox复选框演示示例 ([77fc19b](https://github.com/anyup/uView-Pro/commit/77fc19b6f23f8d776b7a56ef9ac27726da7405a1))
|
|
46
|
+
- **demo:** 同步鸿蒙应用功能 ([2ac7050](https://github.com/anyup/uView-Pro/commit/2ac70500004e04bd22442d696e3e869ba33ac355))
|
|
47
|
+
- update release scripts ([818f8b9](https://github.com/anyup/uView-Pro/commit/818f8b9cf6a0a22893305f76e4af2b71409cbc12))
|
|
48
|
+
|
|
49
|
+
### 👥 Contributors
|
|
50
|
+
|
|
51
|
+
<a href="https://github.com/anyup"><img src="https://github.com/anyup.png?size=40" width="40" height="40" alt="anyup" title="anyup"/></a>
|
|
52
|
+
|
|
53
|
+
## 0.5.1(2026-01-15)
|
|
54
|
+
|
|
55
|
+
### ✨ Features | 新功能
|
|
56
|
+
|
|
57
|
+
- **locale:** 统一组件国际化命名空间,以保持命名的一致性并避免与自定义字段时冲突 ([8bd3cc3](https://github.com/anyup/uView-Pro/commit/8bd3cc32b26349da63f5005cb3c29e575c831142))
|
|
58
|
+
- **u-form:** 支持label插槽功能 ([f82994f](https://github.com/anyup/uView-Pro/commit/f82994f5500ec4509dff64c05e115afb0465d4a2))
|
|
59
|
+
|
|
60
|
+
### 👥 Contributors
|
|
61
|
+
|
|
62
|
+
<a href="https://github.com/anyup"><img src="https://github.com/anyup.png?size=40" width="40" height="40" alt="anyup" title="anyup"/></a>
|
|
63
|
+
|
|
12
64
|
## 0.5.0(2026-01-14)
|
|
13
65
|
|
|
14
66
|
### ✨ Features | 新功能
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
v-if="showIcon"
|
|
24
24
|
:name="uIconName"
|
|
25
25
|
:size="description ? 40 : 32"
|
|
26
|
-
class="u-icon"
|
|
27
26
|
:color="uIconType"
|
|
28
27
|
:custom-style="iconStyle"
|
|
28
|
+
custom-class="u-tips-icon"
|
|
29
29
|
></u-icon>
|
|
30
30
|
</view>
|
|
31
31
|
<view class="u-alert-content" @tap.stop="onClick">
|
|
@@ -44,10 +44,10 @@
|
|
|
44
44
|
name="close"
|
|
45
45
|
color="var(--u-light-color)"
|
|
46
46
|
:size="22"
|
|
47
|
-
|
|
48
|
-
:style="{
|
|
47
|
+
:custom-style="{
|
|
49
48
|
top: description ? '18rpx' : '24rpx'
|
|
50
49
|
}"
|
|
50
|
+
custom-class="u-close-icon"
|
|
51
51
|
></u-icon>
|
|
52
52
|
</view>
|
|
53
53
|
<text
|
|
@@ -56,8 +56,9 @@
|
|
|
56
56
|
:style="{
|
|
57
57
|
top: description ? '18rpx' : '24rpx'
|
|
58
58
|
}"
|
|
59
|
-
>{{ closeText }}</text
|
|
60
59
|
>
|
|
60
|
+
{{ closeText }}
|
|
61
|
+
</text>
|
|
61
62
|
</view>
|
|
62
63
|
</template>
|
|
63
64
|
|
|
@@ -75,7 +76,6 @@ export default {
|
|
|
75
76
|
</script>
|
|
76
77
|
|
|
77
78
|
<script setup lang="ts">
|
|
78
|
-
import uIcon from '../u-icon/u-icon.vue';
|
|
79
79
|
import { computed } from 'vue';
|
|
80
80
|
import { $u } from '../..';
|
|
81
81
|
import { AlertTipsProps } from './types';
|
|
@@ -195,6 +195,16 @@ function onClose() {
|
|
|
195
195
|
&--border--info-disabled {
|
|
196
196
|
border-color: $u-type-info-disabled;
|
|
197
197
|
}
|
|
198
|
+
|
|
199
|
+
:deep(.u-tips-icon) {
|
|
200
|
+
margin-right: 16rpx;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
:deep(.u-close-icon) {
|
|
204
|
+
position: absolute;
|
|
205
|
+
right: 20rpx;
|
|
206
|
+
cursor: pointer;
|
|
207
|
+
}
|
|
198
208
|
}
|
|
199
209
|
|
|
200
210
|
.u-close-alert-tips {
|
|
@@ -202,10 +212,6 @@ function onClose() {
|
|
|
202
212
|
visibility: hidden;
|
|
203
213
|
}
|
|
204
214
|
|
|
205
|
-
.u-icon {
|
|
206
|
-
margin-right: 16rpx;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
215
|
.u-alert-title {
|
|
210
216
|
font-size: 28rpx;
|
|
211
217
|
color: $u-main-color;
|
|
@@ -217,12 +223,6 @@ function onClose() {
|
|
|
217
223
|
color: $u-content-color;
|
|
218
224
|
}
|
|
219
225
|
|
|
220
|
-
.u-close-icon {
|
|
221
|
-
position: absolute;
|
|
222
|
-
top: 20rpx;
|
|
223
|
-
right: 20rpx;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
226
|
.u-close-hover {
|
|
227
227
|
color: red;
|
|
228
228
|
}
|
|
@@ -10,8 +10,12 @@ export type CheckboxValue = string | number | boolean;
|
|
|
10
10
|
|
|
11
11
|
export const CheckboxProps = {
|
|
12
12
|
...baseProps,
|
|
13
|
-
/** checkbox
|
|
13
|
+
/** checkbox的标签 */
|
|
14
|
+
label: { type: String, default: '' },
|
|
15
|
+
/** checkbox的值 */
|
|
14
16
|
name: { type: [String, Number], default: '' },
|
|
17
|
+
/** checkbox的值,不传递时为name的属性 */
|
|
18
|
+
value: { type: [String, Number], default: '' },
|
|
15
19
|
/** 形状,square为方形,circle为原型 */
|
|
16
20
|
shape: { type: String as PropType<Shape>, default: '' },
|
|
17
21
|
/** 是否为选中状态 */
|
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
fontSize: $u.addUnit(labelSize)
|
|
16
16
|
}"
|
|
17
17
|
>
|
|
18
|
-
<slot
|
|
18
|
+
<slot>
|
|
19
|
+
{{ label }}
|
|
20
|
+
</slot>
|
|
19
21
|
</view>
|
|
20
22
|
</view>
|
|
21
23
|
</template>
|
|
@@ -34,7 +36,7 @@ export default {
|
|
|
34
36
|
</script>
|
|
35
37
|
|
|
36
38
|
<script setup lang="ts">
|
|
37
|
-
import { computed } from 'vue';
|
|
39
|
+
import { computed, ref, watch } from 'vue';
|
|
38
40
|
import { $u, useChildren } from '../..';
|
|
39
41
|
import { CheckboxProps } from './types';
|
|
40
42
|
|
|
@@ -55,6 +57,29 @@ import { CheckboxProps } from './types';
|
|
|
55
57
|
|
|
56
58
|
const props = defineProps(CheckboxProps);
|
|
57
59
|
const emit = defineEmits(['change', 'update:modelValue']);
|
|
60
|
+
// checkbox 是否选中,true/false
|
|
61
|
+
const checkedValue = ref(props.modelValue);
|
|
62
|
+
|
|
63
|
+
// checkbox 的value值,id
|
|
64
|
+
const checkboxValue = computed(() => {
|
|
65
|
+
if (props.value !== '') return props.value;
|
|
66
|
+
return props.name;
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
watch(
|
|
70
|
+
() => props.modelValue,
|
|
71
|
+
(newVal: boolean) => {
|
|
72
|
+
checkedValue.value = newVal;
|
|
73
|
+
}
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
watch(
|
|
77
|
+
() => checkedValue.value,
|
|
78
|
+
(newVal: boolean) => {
|
|
79
|
+
emit('update:modelValue', newVal);
|
|
80
|
+
},
|
|
81
|
+
{ immediate: true }
|
|
82
|
+
);
|
|
58
83
|
|
|
59
84
|
// 使用子组件Hook
|
|
60
85
|
const { parentExposed } = useChildren('u-checkbox', 'u-checkbox-group');
|
|
@@ -92,7 +117,7 @@ const elShape = computed(() => {
|
|
|
92
117
|
// 图标样式
|
|
93
118
|
const iconStyle = computed(() => {
|
|
94
119
|
let style: Record<string, string> = {};
|
|
95
|
-
if (elActiveColor.value &&
|
|
120
|
+
if (elActiveColor.value && checkedValue.value && !isDisabled.value) {
|
|
96
121
|
style.borderColor = elActiveColor.value;
|
|
97
122
|
style.backgroundColor = elActiveColor.value;
|
|
98
123
|
}
|
|
@@ -103,15 +128,15 @@ const iconStyle = computed(() => {
|
|
|
103
128
|
|
|
104
129
|
// checkbox内部的勾选图标,如果选中状态,为白色,否则为透明色即可
|
|
105
130
|
const iconColor = computed(() => {
|
|
106
|
-
return
|
|
131
|
+
return checkedValue.value ? 'var(--u-white-color)' : 'transparent';
|
|
107
132
|
});
|
|
108
133
|
|
|
109
134
|
const iconClass = computed(() => {
|
|
110
135
|
let classes: string[] = [];
|
|
111
136
|
classes.push('u-checkbox__icon-wrap--' + elShape.value);
|
|
112
|
-
if (
|
|
137
|
+
if (checkedValue.value == true) classes.push('u-checkbox__icon-wrap--checked');
|
|
113
138
|
if (isDisabled.value) classes.push('u-checkbox__icon-wrap--disabled');
|
|
114
|
-
if (
|
|
139
|
+
if (checkedValue.value && isDisabled.value) classes.push('u-checkbox__icon-wrap--disabled--checked');
|
|
115
140
|
return classes.join(' ');
|
|
116
141
|
});
|
|
117
142
|
|
|
@@ -157,12 +182,7 @@ function toggle() {
|
|
|
157
182
|
* 触发change事件
|
|
158
183
|
*/
|
|
159
184
|
function emitEvent() {
|
|
160
|
-
|
|
161
|
-
value: !props.modelValue,
|
|
162
|
-
name: props.name
|
|
163
|
-
};
|
|
164
|
-
emit('change', changeValue);
|
|
165
|
-
|
|
185
|
+
emit('change', !checkedValue.value);
|
|
166
186
|
// 通知父组件状态变化
|
|
167
187
|
setTimeout(() => {
|
|
168
188
|
if (parentExposed.value?.emitEvent) {
|
|
@@ -176,31 +196,34 @@ function emitEvent() {
|
|
|
176
196
|
*/
|
|
177
197
|
function setValue() {
|
|
178
198
|
// 判断是否超过了可选的最大数量
|
|
179
|
-
if (
|
|
199
|
+
if (checkedValue.value == true) {
|
|
180
200
|
emitEvent();
|
|
181
|
-
|
|
201
|
+
checkedValue.value = false;
|
|
182
202
|
} else {
|
|
183
203
|
if (parentExposed?.value?.validateSelection && !parentExposed?.value?.validateSelection()) {
|
|
184
204
|
return;
|
|
185
205
|
}
|
|
186
206
|
emitEvent();
|
|
187
|
-
|
|
207
|
+
checkedValue.value = true;
|
|
188
208
|
}
|
|
189
209
|
}
|
|
190
210
|
|
|
191
211
|
// 设置组件的modelValue值
|
|
192
212
|
function setChecked(data: any) {
|
|
193
213
|
if (!isDisabled.value) {
|
|
194
|
-
|
|
195
|
-
|
|
214
|
+
const needEmit = checkedValue.value !== data.checked;
|
|
215
|
+
checkedValue.value = data.checked;
|
|
216
|
+
if (needEmit) {
|
|
196
217
|
emitEvent();
|
|
197
218
|
}
|
|
198
219
|
}
|
|
199
220
|
}
|
|
200
221
|
|
|
201
222
|
defineExpose({
|
|
202
|
-
isChecked: computed(() =>
|
|
223
|
+
isChecked: computed(() => checkedValue.value),
|
|
224
|
+
label: props.label,
|
|
203
225
|
name: props.name,
|
|
226
|
+
value: checkboxValue.value,
|
|
204
227
|
setValue,
|
|
205
228
|
emitEvent,
|
|
206
229
|
props,
|
|
@@ -10,6 +10,8 @@ import { getColor } from '../../';
|
|
|
10
10
|
|
|
11
11
|
export const CheckboxGroupProps = {
|
|
12
12
|
...baseProps,
|
|
13
|
+
/** 绑定值,选中的复选框name组成的数组 */
|
|
14
|
+
modelValue: { type: Array as PropType<(string | number)[]>, default: undefined },
|
|
13
15
|
/** 最多能选中多少个checkbox */
|
|
14
16
|
max: { type: Number, default: 999 },
|
|
15
17
|
/** 是否禁用所有复选框 */
|
|
@@ -18,14 +18,15 @@ export default {
|
|
|
18
18
|
</script>
|
|
19
19
|
|
|
20
20
|
<script setup lang="ts">
|
|
21
|
-
import { getCurrentInstance, computed } from 'vue';
|
|
22
|
-
import { $u, useParent, useChildren } from '../..';
|
|
21
|
+
import { getCurrentInstance, computed, watch, nextTick, onMounted } from 'vue';
|
|
22
|
+
import { $u, useParent, useChildren, useDebounce } from '../..';
|
|
23
23
|
import { CheckboxGroupProps } from './types';
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
26
|
* checkboxGroup 开关选择器父组件Group
|
|
27
27
|
* @description 复选框组件一般用于需要多个选择的场景,该组件功能完整,使用方便
|
|
28
28
|
* @tutorial https://uviewpro.cn/zh/components/checkbox.html
|
|
29
|
+
* @property {Array} modelValue 绑定值,选中的复选框name组成的数组(支持v-model双向绑定)
|
|
29
30
|
* @property {String Number} max 最多能选中多少个checkbox(默认999)
|
|
30
31
|
* @property {String Number} size 组件整体的大小,单位rpx(默认40)
|
|
31
32
|
* @property {Boolean} disabled 是否禁用所有checkbox(默认false)
|
|
@@ -35,32 +36,65 @@ import { CheckboxGroupProps } from './types';
|
|
|
35
36
|
* @property {String} shape 外观形状,shape-方形,circle-圆形(默认circle)
|
|
36
37
|
* @property {Boolean} wrap 是否每个checkbox都换行(默认false)
|
|
37
38
|
* @property {String} active-color 选中时的颜色,应用到所有子Checkbox组件(默认主题色primary)
|
|
38
|
-
* @event {Function} change 任一个checkbox
|
|
39
|
-
* @example <u-checkbox-group
|
|
39
|
+
* @event {Function} change 任一个checkbox状态发生变化时触发,回调为选中的name数组
|
|
40
|
+
* @example <u-checkbox-group v-model="selectedValues">
|
|
41
|
+
* <u-checkbox name="apple">苹果</u-checkbox>
|
|
42
|
+
* <u-checkbox name="banana">香蕉</u-checkbox>
|
|
43
|
+
* </u-checkbox-group>
|
|
40
44
|
*/
|
|
41
|
-
const instance = getCurrentInstance();
|
|
42
45
|
const props = defineProps(CheckboxGroupProps);
|
|
43
46
|
const emit = defineEmits(['update:modelValue', 'change']);
|
|
44
47
|
|
|
45
48
|
// 使用父组件Hook
|
|
46
49
|
const { children, broadcast } = useParent('u-checkbox-group');
|
|
47
50
|
const { emitToParent } = useChildren('u-checkbox-group', 'u-form-item');
|
|
51
|
+
const { debounce } = useDebounce(1);
|
|
48
52
|
|
|
49
53
|
/**
|
|
50
|
-
*
|
|
54
|
+
* 根据modelValue设置子组件状态
|
|
51
55
|
*/
|
|
52
|
-
function
|
|
53
|
-
|
|
54
|
-
|
|
56
|
+
function syncChildrenSelection() {
|
|
57
|
+
if (!children || children.length === 0 || !props.modelValue) return;
|
|
58
|
+
const modelValueSet = new Set(props.modelValue);
|
|
55
59
|
children.forEach((child: any) => {
|
|
56
|
-
|
|
57
|
-
|
|
60
|
+
const childValue = child.getExposed?.()?.value;
|
|
61
|
+
const shouldBeChecked = modelValueSet.has(childValue);
|
|
62
|
+
const isCurrentlyChecked = child.getExposed?.()?.isChecked.value;
|
|
63
|
+
|
|
64
|
+
if (shouldBeChecked !== isCurrentlyChecked) {
|
|
65
|
+
child.getExposed?.()?.setChecked({ checked: shouldBeChecked });
|
|
58
66
|
}
|
|
59
67
|
});
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* 监听modelValue变化,同步子组件状态
|
|
72
|
+
*/
|
|
73
|
+
watch(
|
|
74
|
+
() => props.modelValue,
|
|
75
|
+
() => {
|
|
76
|
+
syncChildrenSelection();
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* 派发 change 事件和表单校验
|
|
82
|
+
*/
|
|
83
|
+
function emitEvent() {
|
|
84
|
+
debounce(() => {
|
|
85
|
+
// 收集所有选中的 name
|
|
86
|
+
let values: any[] = [];
|
|
87
|
+
children.forEach((child: any) => {
|
|
88
|
+
if (child.getExposed?.()?.isChecked.value) {
|
|
89
|
+
values.push(child.getExposed?.()?.value);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
emit('change', values);
|
|
93
|
+
emit('update:modelValue', values);
|
|
94
|
+
setTimeout(() => {
|
|
95
|
+
emitToParent('onFormChange', values);
|
|
96
|
+
}, 60);
|
|
97
|
+
});
|
|
64
98
|
}
|
|
65
99
|
|
|
66
100
|
/**
|
|
@@ -96,6 +130,12 @@ function validateSelection() {
|
|
|
96
130
|
return true;
|
|
97
131
|
}
|
|
98
132
|
|
|
133
|
+
onMounted(() => {
|
|
134
|
+
nextTick(() => {
|
|
135
|
+
syncChildrenSelection();
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
|
|
99
139
|
// 使用defineExpose暴露给外部
|
|
100
140
|
defineExpose({
|
|
101
141
|
// props
|
|
@@ -106,6 +146,7 @@ defineExpose({
|
|
|
106
146
|
setAllChecked,
|
|
107
147
|
getSelectedValues,
|
|
108
148
|
validateSelection,
|
|
149
|
+
syncChildrenSelection,
|
|
109
150
|
|
|
110
151
|
// 计算属性
|
|
111
152
|
selectedCount: computed(() => children.filter(child => child.getExposed?.()?.isChecked.value).length),
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
</text>
|
|
32
32
|
</view>
|
|
33
33
|
<view class="fild-body">
|
|
34
|
-
<view class="u-flex-1 u-flex" :style="[inputWrapStyle]">
|
|
34
|
+
<view class="u-flex-1 u-flex u-field-input-wrap" :style="[inputWrapStyle]">
|
|
35
35
|
<textarea
|
|
36
36
|
v-if="props.type === 'textarea'"
|
|
37
37
|
class="u-flex-1 u-textarea-class"
|
|
@@ -69,10 +69,12 @@
|
|
|
69
69
|
@confirm="onConfirm"
|
|
70
70
|
@tap="fieldClick"
|
|
71
71
|
/>
|
|
72
|
+
<!-- 透明遮罩,只在disabled时显示,用于响应点击事件 -->
|
|
73
|
+
<view v-if="props.disabled" class="u-field-disabled-overlay" @tap="fieldClick"></view>
|
|
72
74
|
</view>
|
|
73
75
|
<u-icon
|
|
76
|
+
v-if="props.clearable && props.modelValue != '' && focused && !props.disabled"
|
|
74
77
|
:size="props.clearSize"
|
|
75
|
-
v-if="props.clearable && props.modelValue != '' && focused"
|
|
76
78
|
name="close-circle-fill"
|
|
77
79
|
color="var(--u-light-color)"
|
|
78
80
|
class="u-clear-icon"
|
|
@@ -385,4 +387,18 @@ function fieldClick() {
|
|
|
385
387
|
.u-button-wrap {
|
|
386
388
|
margin-left: 8rpx;
|
|
387
389
|
}
|
|
390
|
+
|
|
391
|
+
.u-field-input-wrap {
|
|
392
|
+
position: relative;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
.u-field-disabled-overlay {
|
|
396
|
+
position: absolute;
|
|
397
|
+
top: 0;
|
|
398
|
+
left: 0;
|
|
399
|
+
right: 0;
|
|
400
|
+
bottom: 0;
|
|
401
|
+
background-color: transparent;
|
|
402
|
+
z-index: 1;
|
|
403
|
+
}
|
|
388
404
|
</style>
|
|
@@ -121,7 +121,7 @@ defineExpose({
|
|
|
121
121
|
if (!fields.value.includes(field)) fields.value.push(field);
|
|
122
122
|
},
|
|
123
123
|
removeField(field: any) {
|
|
124
|
-
fields.value = fields.value.filter(f => f.prop !== field.prop)
|
|
124
|
+
fields.value = fields.value.filter(f => f.prop !== field.prop);
|
|
125
125
|
},
|
|
126
126
|
fields,
|
|
127
127
|
rules,
|
|
@@ -38,9 +38,9 @@ const props = defineProps(GapProps);
|
|
|
38
38
|
const gapStyle = computed(() => {
|
|
39
39
|
return {
|
|
40
40
|
backgroundColor: props.bgColor,
|
|
41
|
-
height: props.height
|
|
42
|
-
marginTop: props.marginTop
|
|
43
|
-
marginBottom: props.marginBottom
|
|
41
|
+
height: $u.addUnit(props.height),
|
|
42
|
+
marginTop: $u.addUnit(props.marginTop),
|
|
43
|
+
marginBottom: $u.addUnit(props.marginBottom)
|
|
44
44
|
};
|
|
45
45
|
});
|
|
46
46
|
</script>
|
|
@@ -95,7 +95,6 @@ import { NavbarProps } from './types';
|
|
|
95
95
|
const props = defineProps(NavbarProps);
|
|
96
96
|
// 获取系统状态栏的高度
|
|
97
97
|
const systemInfo = uni.getSystemInfoSync();
|
|
98
|
-
const windowInfo = uni.getWindowInfo();
|
|
99
98
|
|
|
100
99
|
let menuButtonInfo: any = {};
|
|
101
100
|
// 如果是小程序,获取右上角胶囊的尺寸信息,避免导航栏右侧内容与胶囊重叠(支付宝小程序非本API,尚未兼容)
|
|
@@ -104,7 +103,14 @@ menuButtonInfo = uni.getMenuButtonBoundingClientRect();
|
|
|
104
103
|
// #endif
|
|
105
104
|
|
|
106
105
|
// 状态栏高度
|
|
107
|
-
const statusBarHeight = ref(
|
|
106
|
+
const statusBarHeight = ref(0);
|
|
107
|
+
// #ifdef APP || H5 || MP-ALIPAY || MP-WEIXIN
|
|
108
|
+
const windowInfo = uni.getWindowInfo();
|
|
109
|
+
statusBarHeight.value = windowInfo.statusBarHeight;
|
|
110
|
+
// #endif
|
|
111
|
+
// #ifndef APP || H5 || MP-ALIPAY || MP-WEIXIN
|
|
112
|
+
statusBarHeight.value = systemInfo.statusBarHeight;
|
|
113
|
+
// #endif
|
|
108
114
|
|
|
109
115
|
// 转换字符数值为真正的数值
|
|
110
116
|
const navbarHeight = computed(() => {
|
|
@@ -38,10 +38,12 @@
|
|
|
38
38
|
<picker-view
|
|
39
39
|
v-if="mode == 'region'"
|
|
40
40
|
:value="valueArr"
|
|
41
|
-
@change="change"
|
|
42
41
|
class="u-picker-view"
|
|
42
|
+
mask-class="u-picker-view-mask"
|
|
43
|
+
indicator-class="u-picker-view-indicator"
|
|
43
44
|
@pickstart="pickstart"
|
|
44
45
|
@pickend="pickend"
|
|
46
|
+
@change="change"
|
|
45
47
|
>
|
|
46
48
|
<picker-view-column v-if="params.province">
|
|
47
49
|
<view class="u-column-item" v-for="(item, index) in provinces" :key="index">
|
|
@@ -62,10 +64,12 @@
|
|
|
62
64
|
<picker-view
|
|
63
65
|
v-else-if="mode == 'time'"
|
|
64
66
|
:value="valueArr"
|
|
65
|
-
@change="change"
|
|
66
67
|
class="u-picker-view"
|
|
68
|
+
mask-class="u-picker-view-mask"
|
|
69
|
+
indicator-class="u-picker-view-indicator"
|
|
67
70
|
@pickstart="pickstart"
|
|
68
71
|
@pickend="pickend"
|
|
72
|
+
@change="change"
|
|
69
73
|
>
|
|
70
74
|
<picker-view-column v-if="params.year">
|
|
71
75
|
<view class="u-column-item" v-for="(item, index) in years" :key="index">
|
|
@@ -107,10 +111,12 @@
|
|
|
107
111
|
<picker-view
|
|
108
112
|
v-else-if="mode == 'selector'"
|
|
109
113
|
:value="valueArr"
|
|
110
|
-
@change="change"
|
|
111
114
|
class="u-picker-view"
|
|
115
|
+
mask-class="u-picker-view-mask"
|
|
116
|
+
indicator-class="u-picker-view-indicator"
|
|
112
117
|
@pickstart="pickstart"
|
|
113
118
|
@pickend="pickend"
|
|
119
|
+
@change="change"
|
|
114
120
|
>
|
|
115
121
|
<picker-view-column>
|
|
116
122
|
<view class="u-column-item" v-for="(item, index) in range" :key="index">
|
|
@@ -121,10 +127,12 @@
|
|
|
121
127
|
<picker-view
|
|
122
128
|
v-else-if="mode == 'multiSelector'"
|
|
123
129
|
:value="valueArr"
|
|
124
|
-
@change="change"
|
|
125
130
|
class="u-picker-view"
|
|
131
|
+
mask-class="u-picker-view-mask"
|
|
132
|
+
indicator-class="u-picker-view-indicator"
|
|
126
133
|
@pickstart="pickstart"
|
|
127
134
|
@pickend="pickend"
|
|
135
|
+
@change="change"
|
|
128
136
|
>
|
|
129
137
|
<picker-view-column v-for="(item, index) in range" :key="index">
|
|
130
138
|
<view class="u-column-item" v-for="(item1, index1) in item" :key="index1">
|
|
@@ -782,7 +790,7 @@ onMounted(() => {
|
|
|
782
790
|
.u-picker-header::after {
|
|
783
791
|
content: '';
|
|
784
792
|
position: absolute;
|
|
785
|
-
border-bottom: 1rpx solid var(--u-
|
|
793
|
+
border-bottom: 1rpx solid var(--u-border-color);
|
|
786
794
|
-webkit-transform: scaleY(0.5);
|
|
787
795
|
transform: scaleY(0.5);
|
|
788
796
|
bottom: 0;
|
|
@@ -8,6 +8,8 @@ import { baseProps } from '../common/props';
|
|
|
8
8
|
*/
|
|
9
9
|
export const RadioProps = {
|
|
10
10
|
...baseProps,
|
|
11
|
+
label: { type: String, default: '' },
|
|
12
|
+
value: { type: [String, Number] as PropType<string | number>, default: '' },
|
|
11
13
|
/** radio的名称 */
|
|
12
14
|
name: { type: [String, Number] as PropType<string | number>, default: '' },
|
|
13
15
|
/** 形状,square为方形,circle为圆形 */
|
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
fontSize: $u.addUnit(labelSize)
|
|
11
11
|
}"
|
|
12
12
|
>
|
|
13
|
-
<slot
|
|
13
|
+
<slot>
|
|
14
|
+
{{ label }}
|
|
15
|
+
</slot>
|
|
14
16
|
</view>
|
|
15
17
|
</view>
|
|
16
18
|
</template>
|
|
@@ -55,6 +57,12 @@ const emit = defineEmits(['change']);
|
|
|
55
57
|
// 使用组件关系 hooks 获取父组件
|
|
56
58
|
const { parentExposed } = useChildren('u-radio', 'u-radio-group');
|
|
57
59
|
|
|
60
|
+
// radio 的value值,id
|
|
61
|
+
const radioValue = computed(() => {
|
|
62
|
+
if (props.value !== '') return props.value;
|
|
63
|
+
return props.name;
|
|
64
|
+
});
|
|
65
|
+
|
|
58
66
|
// 父组件的默认值(兼容没有父组件的场景)
|
|
59
67
|
const parentData = computed(() => {
|
|
60
68
|
return (
|
|
@@ -127,7 +135,7 @@ const elShape = computed(() =>
|
|
|
127
135
|
*/
|
|
128
136
|
const iconStyle = computed(() => {
|
|
129
137
|
let style: Record<string, string> = {};
|
|
130
|
-
if (elActiveColor.value && parentData.value.value ==
|
|
138
|
+
if (elActiveColor.value && parentData.value.value == radioValue.value && !elDisabled.value) {
|
|
131
139
|
style.borderColor = elActiveColor.value;
|
|
132
140
|
style.backgroundColor = elActiveColor.value;
|
|
133
141
|
}
|
|
@@ -136,14 +144,15 @@ const iconStyle = computed(() => {
|
|
|
136
144
|
return style;
|
|
137
145
|
});
|
|
138
146
|
|
|
139
|
-
const iconColor = computed(() => (
|
|
147
|
+
const iconColor = computed(() => (radioValue.value == parentData.value.value ? 'var(--u-white-color)' : 'transparent'));
|
|
140
148
|
|
|
141
149
|
const iconClass = computed(() => {
|
|
142
150
|
let classes: string[] = [];
|
|
143
151
|
classes.push('u-radio__icon-wrap--' + elShape.value);
|
|
144
|
-
if (
|
|
152
|
+
if (radioValue.value == parentData.value.value) classes.push('u-radio__icon-wrap--checked');
|
|
145
153
|
if (elDisabled.value) classes.push('u-radio__icon-wrap--disabled');
|
|
146
|
-
if (
|
|
154
|
+
if (radioValue.value == parentData.value.value && elDisabled.value)
|
|
155
|
+
classes.push('u-radio__icon-wrap--disabled--checked');
|
|
147
156
|
// 支付宝小程序无法动态绑定一个数组类名,否则解析出来的结果会带有",",而导致失效
|
|
148
157
|
return classes.join(' ');
|
|
149
158
|
});
|
|
@@ -192,7 +201,7 @@ function toggle() {
|
|
|
192
201
|
*/
|
|
193
202
|
function emitEvent() {
|
|
194
203
|
// u-radio的name不等于父组件的v-model的值时(意味着未选中),才发出事件,避免多次点击触发事件
|
|
195
|
-
if (parentData.value.value !=
|
|
204
|
+
if (parentData.value.value != radioValue.value) emit('change', radioValue.value);
|
|
196
205
|
}
|
|
197
206
|
/**
|
|
198
207
|
* 改变组件选中状态
|
|
@@ -201,7 +210,7 @@ function emitEvent() {
|
|
|
201
210
|
*/
|
|
202
211
|
function setRadioCheckedStatus() {
|
|
203
212
|
emitEvent();
|
|
204
|
-
parentExposed?.value?.setValue(
|
|
213
|
+
parentExposed?.value?.setValue(radioValue.value);
|
|
205
214
|
}
|
|
206
215
|
</script>
|
|
207
216
|
|