@ebfe/vant-kit 0.0.1 → 0.0.2
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/es/field-multi-picker/README.md +97 -0
- package/es/field-multi-picker/index-sfc.less +3 -0
- package/es/field-multi-picker/index.ts +139 -0
- package/es/field-single-picker/README.md +94 -0
- package/es/field-single-picker/index-sfc.less +3 -0
- package/es/field-single-picker/index.ts +158 -0
- package/es/index.js +12 -5
- package/es/multi-picker/README.md +183 -0
- package/es/multi-picker/index-sfc.less +20 -0
- package/es/multi-picker/index.ts +399 -0
- package/es/single-picker/README.md +239 -0
- package/es/single-picker/index-sfc.less +1 -1
- package/es/single-picker/index.ts +253 -0
- package/lib/field-multi-picker/README.md +97 -0
- package/lib/field-multi-picker/index-sfc.less +3 -0
- package/lib/field-multi-picker/index.ts +139 -0
- package/lib/field-single-picker/README.md +94 -0
- package/lib/field-single-picker/index-sfc.less +3 -0
- package/lib/field-single-picker/index.ts +158 -0
- package/lib/index.js +13 -46
- package/lib/multi-picker/README.md +183 -0
- package/lib/multi-picker/index-sfc.less +20 -0
- package/lib/multi-picker/index.ts +399 -0
- package/lib/single-picker/README.md +239 -0
- package/lib/single-picker/index-sfc.less +1 -1
- package/lib/single-picker/index.ts +253 -0
- package/package.json +3 -3
- package/es/demo-button/index-sfc.css +0 -9
- package/es/demo-button/index-sfc.less +0 -9
- package/es/demo-button/index.d.ts +0 -44
- package/es/demo-button/index.js +0 -52
- package/es/index.d.ts +0 -10
- package/es/single-picker/index-sfc.css +0 -4
- package/es/single-picker/index.d.ts +0 -623
- package/es/single-picker/index.js +0 -249
- package/lib/demo-button/index-sfc.css +0 -9
- package/lib/demo-button/index-sfc.less +0 -9
- package/lib/demo-button/index.d.ts +0 -44
- package/lib/demo-button/index.js +0 -76
- package/lib/ebfe-vant-kit.cjs.js +0 -301
- package/lib/ebfe-vant-kit.es.js +0 -312
- package/lib/ebfe-vant-kit.js +0 -18216
- package/lib/ebfe-vant-kit.min.js +0 -13064
- package/lib/index.d.ts +0 -10
- package/lib/single-picker/index-sfc.css +0 -4
- package/lib/single-picker/index.d.ts +0 -623
- package/lib/single-picker/index.js +0 -261
- package/lib/single-picker/style/less.d.ts +0 -0
- package/lib/style.css +0 -7107
- package/lib/web-types.json +0 -35
- /package/es/{demo-button → field-multi-picker}/style/index.js +0 -0
- /package/es/{demo-button → field-multi-picker}/style/less.js +0 -0
- /package/{lib/demo-button → es/field-single-picker}/style/index.js +0 -0
- /package/{lib/demo-button → es/field-single-picker}/style/less.js +0 -0
- /package/es/{demo-button/style/index.d.ts → multi-picker/style/index.js} +0 -0
- /package/es/{demo-button/style/less.d.ts → multi-picker/style/less.js} +0 -0
- /package/{es/single-picker/style/index.d.ts → lib/field-multi-picker/style/index.js} +0 -0
- /package/{es/single-picker/style/less.d.ts → lib/field-multi-picker/style/less.js} +0 -0
- /package/lib/{demo-button/style/index.d.ts → field-single-picker/style/index.js} +0 -0
- /package/lib/{demo-button/style/less.d.ts → field-single-picker/style/less.js} +0 -0
- /package/lib/{index.css → multi-picker/style/index.js} +0 -0
- /package/lib/{single-picker/style/index.d.ts → multi-picker/style/less.js} +0 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# SinglePicker
|
|
2
|
+
|
|
3
|
+
### 介绍
|
|
4
|
+
|
|
5
|
+
主要基于 vant 的 popup、picker 组件进行二次封装,方便处理单项选择的需求场景。
|
|
6
|
+
|
|
7
|
+
- 支持传入所有 [picker props](https://vant-ui.github.io/vant/#/zh-CN/picker#props)
|
|
8
|
+
- 支持暴露所有 [picker slots](https://vant-ui.github.io/vant/#/zh-CN/picker#slots)
|
|
9
|
+
|
|
10
|
+
**主要功能描述**
|
|
11
|
+
|
|
12
|
+
- 支持自定义触发器
|
|
13
|
+
- 支持开启搜索功能
|
|
14
|
+
- 禁用选项逻辑增强
|
|
15
|
+
|
|
16
|
+
**对开发者的解脱**
|
|
17
|
+
|
|
18
|
+
- 符合 ui 设计
|
|
19
|
+
- 打开收起逻辑的编写
|
|
20
|
+
- 对所选项的 `真实值`、`展示值` 的处理
|
|
21
|
+
|
|
22
|
+
## 代码演示
|
|
23
|
+
|
|
24
|
+
### 基础用法
|
|
25
|
+
|
|
26
|
+
```html
|
|
27
|
+
<template>
|
|
28
|
+
<SinglePicker
|
|
29
|
+
v-model="pickerValue"
|
|
30
|
+
:picker-props="{
|
|
31
|
+
title: '基础用法',
|
|
32
|
+
columns: columns,
|
|
33
|
+
columnsFieldNames: columnsFieldNames,
|
|
34
|
+
}"
|
|
35
|
+
>
|
|
36
|
+
<template #trigger="{ triggerPopupShow, showValue }">
|
|
37
|
+
<div class="trigger-box">
|
|
38
|
+
<van-button type="primary" @click="triggerPopupShow"> 点击打开选择器🤪 </van-button>
|
|
39
|
+
<p>show value: {{ showValue }}</p>
|
|
40
|
+
<p>modelValue: {{ pickerValue }}</p>
|
|
41
|
+
</div>
|
|
42
|
+
</template>
|
|
43
|
+
</SinglePicker>
|
|
44
|
+
</template>
|
|
45
|
+
|
|
46
|
+
<script setup lang="ts">
|
|
47
|
+
import { useWrapperRef } from '@ebfe/vhooks';
|
|
48
|
+
import SinglePicker from '../index.vue';
|
|
49
|
+
import { Button as VanButton } from 'vant';
|
|
50
|
+
|
|
51
|
+
const columns = [
|
|
52
|
+
{ name: '选项1', value: '1' },
|
|
53
|
+
{ name: '选项2', value: '2' },
|
|
54
|
+
];
|
|
55
|
+
const columnsFieldNames = {
|
|
56
|
+
text: 'name',
|
|
57
|
+
value: 'value',
|
|
58
|
+
};
|
|
59
|
+
const [pickerValue, _setPickerValue] = useWrapperRef<string | undefined>(undefined);
|
|
60
|
+
</script>
|
|
61
|
+
|
|
62
|
+
<style scoped lang="less">
|
|
63
|
+
.trigger-box {
|
|
64
|
+
display: flex;
|
|
65
|
+
flex-direction: column;
|
|
66
|
+
justify-content: center;
|
|
67
|
+
align-items: center;
|
|
68
|
+
}
|
|
69
|
+
</style>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 开启搜索功能
|
|
73
|
+
|
|
74
|
+
- 传入 show-earch 展示搜索框
|
|
75
|
+
- 侦听 search 事件处理搜索逻辑
|
|
76
|
+
|
|
77
|
+
> 💫 对交互细节的优化:如果在输入关键字进行搜索后,新的数据源为空,此时点击确定,更新的值依旧为最近一次选中的选项。
|
|
78
|
+
|
|
79
|
+
```html
|
|
80
|
+
<template>
|
|
81
|
+
<SinglePicker
|
|
82
|
+
v-model="pickerValue"
|
|
83
|
+
:picker-props="{
|
|
84
|
+
columns: columns,
|
|
85
|
+
columnsFieldNames: columnsFieldNames,
|
|
86
|
+
}"
|
|
87
|
+
show-search
|
|
88
|
+
@search="onSearch"
|
|
89
|
+
>
|
|
90
|
+
<template #trigger="{ triggerPopupShow, showValue }">
|
|
91
|
+
<div class="trigger-box">
|
|
92
|
+
<van-button type="primary" @click="triggerPopupShow"> 带搜索框🔍 </van-button>
|
|
93
|
+
<p>show value: {{ showValue }}</p>
|
|
94
|
+
<p>modelValue: {{ pickerValue }}</p>
|
|
95
|
+
</div>
|
|
96
|
+
</template>
|
|
97
|
+
|
|
98
|
+
<template #title>Ashun</template>
|
|
99
|
+
</SinglePicker>
|
|
100
|
+
</template>
|
|
101
|
+
|
|
102
|
+
<script setup lang="ts">
|
|
103
|
+
import { useWrapperRef } from '@ebfe/vhooks';
|
|
104
|
+
import SinglePicker from '../index.vue';
|
|
105
|
+
import { Button as VanButton } from 'vant';
|
|
106
|
+
import { checkStrIsEmpty } from '@ebfe/utils';
|
|
107
|
+
|
|
108
|
+
const columnsDataSource = [
|
|
109
|
+
{ name: '选项1', value: '1' },
|
|
110
|
+
{ name: '选项2', value: '2' },
|
|
111
|
+
];
|
|
112
|
+
const [columns, setColumns] = useWrapperRef(columnsDataSource);
|
|
113
|
+
const columnsFieldNames = {
|
|
114
|
+
text: 'name',
|
|
115
|
+
value: 'value',
|
|
116
|
+
};
|
|
117
|
+
const [pickerValue, _setPickerValue] = useWrapperRef<string | undefined>(undefined);
|
|
118
|
+
|
|
119
|
+
const onSearch = (keywords: string) => {
|
|
120
|
+
if (checkStrIsEmpty(keywords)) {
|
|
121
|
+
setColumns(columnsDataSource);
|
|
122
|
+
} else {
|
|
123
|
+
setColumns(
|
|
124
|
+
columnsDataSource.filter((item) => item.name.toLocaleLowerCase().includes(keywords.toLocaleLowerCase()))
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
</script>
|
|
129
|
+
|
|
130
|
+
<style scoped lang="less">
|
|
131
|
+
.trigger-box {
|
|
132
|
+
display: flex;
|
|
133
|
+
flex-direction: column;
|
|
134
|
+
justify-content: center;
|
|
135
|
+
align-items: center;
|
|
136
|
+
}
|
|
137
|
+
</style>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 禁用选项逻辑增强
|
|
141
|
+
|
|
142
|
+
```html
|
|
143
|
+
<template>
|
|
144
|
+
<SinglePicker
|
|
145
|
+
v-model="pickerValue"
|
|
146
|
+
:picker-props="{
|
|
147
|
+
title,
|
|
148
|
+
columns: columns,
|
|
149
|
+
columnsFieldNames: columnsFieldNames,
|
|
150
|
+
}"
|
|
151
|
+
@confirm-disabled-option="
|
|
152
|
+
({}) =>
|
|
153
|
+
showToast(
|
|
154
|
+
'你可以自定义后续操作,回调函数参数类型 TConfirmDisabledOptionPayload',
|
|
155
|
+
)
|
|
156
|
+
"
|
|
157
|
+
>
|
|
158
|
+
<template #trigger="{ triggerPopupShow, showValue }">
|
|
159
|
+
<div class="trigger-box">
|
|
160
|
+
<span>
|
|
161
|
+
<van-button @click="showPartialDisableOptions(triggerPopupShow)"> 部分选项禁用 </van-button>
|
|
162
|
+
<van-button @click="showAllDisableOptions(triggerPopupShow)"> 全部选项禁用 </van-button>
|
|
163
|
+
</span>
|
|
164
|
+
<p>show value: {{ showValue }}</p>
|
|
165
|
+
<p>modelValue: {{ pickerValue }}</p>
|
|
166
|
+
</div>
|
|
167
|
+
</template>
|
|
168
|
+
</SinglePicker>
|
|
169
|
+
</template>
|
|
170
|
+
|
|
171
|
+
<script setup lang="ts">
|
|
172
|
+
import { useWrapperRef } from '@ebfe/vhooks';
|
|
173
|
+
import SinglePicker from '../index.vue';
|
|
174
|
+
import { showToast, Button as VanButton } from 'vant';
|
|
175
|
+
|
|
176
|
+
const partialDisableCols = [
|
|
177
|
+
{ name: '选项1', value: '1' },
|
|
178
|
+
{ name: '选项2(禁用)', value: '2', disabled: true },
|
|
179
|
+
{ name: '选项3', value: '3' },
|
|
180
|
+
];
|
|
181
|
+
const allDisableCols = [
|
|
182
|
+
{ name: '选项1(禁用)', value: '1(禁用)', disabled: true },
|
|
183
|
+
{ name: '选项2(禁用)', value: '2(禁用)', disabled: true },
|
|
184
|
+
{ name: '选项3(禁用)', value: '3(禁用)', disabled: true },
|
|
185
|
+
];
|
|
186
|
+
const [columns, setColumns] = useWrapperRef(partialDisableCols);
|
|
187
|
+
const columnsFieldNames = {
|
|
188
|
+
text: 'name',
|
|
189
|
+
value: 'value',
|
|
190
|
+
};
|
|
191
|
+
const [pickerValue, _setPickerValue] = useWrapperRef<string | undefined>(undefined);
|
|
192
|
+
|
|
193
|
+
const [title, setTitle] = useWrapperRef<string>('');
|
|
194
|
+
const showPartialDisableOptions = (triggerPopupShow) => {
|
|
195
|
+
setTitle('部分选项禁用');
|
|
196
|
+
setColumns(partialDisableCols);
|
|
197
|
+
triggerPopupShow();
|
|
198
|
+
};
|
|
199
|
+
const showAllDisableOptions = (triggerPopupShow) => {
|
|
200
|
+
setTitle('全部选项禁用');
|
|
201
|
+
setColumns(allDisableCols);
|
|
202
|
+
triggerPopupShow();
|
|
203
|
+
};
|
|
204
|
+
</script>
|
|
205
|
+
|
|
206
|
+
<style scoped lang="less">
|
|
207
|
+
.trigger-box {
|
|
208
|
+
display: flex;
|
|
209
|
+
flex-direction: column;
|
|
210
|
+
justify-content: center;
|
|
211
|
+
align-items: center;
|
|
212
|
+
}
|
|
213
|
+
</style>
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## API
|
|
217
|
+
|
|
218
|
+
### Props
|
|
219
|
+
|
|
220
|
+
| 参数 | 说明 | 类型 | 默认值 |
|
|
221
|
+
| ------------ | ------------------------------------------------------------------------------- | -------------------- | ------ |
|
|
222
|
+
| v-model | 当前选中项对应的值 | string \| undefinerd | - |
|
|
223
|
+
| picker-props | [vant Picker 组件的 props](https://vant-ui.github.io/vant/#/zh-CN/picker#props) | | |
|
|
224
|
+
| show-search | 是否显示搜索框 | boolean | false |
|
|
225
|
+
| search-delay | 搜索防抖时间(ms) | number | 300 |
|
|
226
|
+
|
|
227
|
+
### Events
|
|
228
|
+
|
|
229
|
+
| 事件名 | 说明 | 回调参数 |
|
|
230
|
+
| :-------------------- | :----------------------------- | :---------------------------------------------------------------------------- |
|
|
231
|
+
| confirm | 点击 picker 确认后触发的事件 | option (选中项的全部数据) |
|
|
232
|
+
| search | 在搜索框输入时,触发的搜索事件 | keywords |
|
|
233
|
+
| confirmDisabledOption | 选中禁用项时,触发的事件 | type TConfirmDisabledOptionPayload = { option: any; closePopup: () => void; } |
|
|
234
|
+
|
|
235
|
+
### Slots
|
|
236
|
+
|
|
237
|
+
| 名称 | 说明 | 参数 |
|
|
238
|
+
| :------ | :----- | :----------------------------------------------------------------------------- |
|
|
239
|
+
| trigger | 触发器 | `{ trigger-popup-show: () => void; show-value: string; selected-option: any }` |
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import './index-sfc.css';
|
|
3
|
+
import { defineComponent as _defineComponent } from 'vue';
|
|
4
|
+
import type { PickerColumn, PickerOption, PickerProps } from 'vant';
|
|
5
|
+
import { computed, watch } from 'vue';
|
|
6
|
+
import { debounce } from 'lodash';
|
|
7
|
+
import { Popup as VanPopup, Picker as VanPicker, Search as VanSearch } from 'vant';
|
|
8
|
+
import { useWrapperRef } from '@ebfe/vhooks';
|
|
9
|
+
import { array2Single } from '@ebfe/utils';
|
|
10
|
+
|
|
11
|
+
const __default__ = {
|
|
12
|
+
name: 'SinglePicker',
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export type TSinglePickerProps = {
|
|
16
|
+
showSearch?: boolean;
|
|
17
|
+
searchDelay?: number;
|
|
18
|
+
modelValue: any;
|
|
19
|
+
pickerProps: Partial<PickerProps>;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export type TConfirmDisabledOptionPayload = {
|
|
23
|
+
option: any;
|
|
24
|
+
closePopup: () => void;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const __vue_sfc__ = /*@__PURE__*/ _defineComponent({
|
|
28
|
+
...__default__,
|
|
29
|
+
props: {
|
|
30
|
+
showSearch: { type: Boolean, required: false, default: false },
|
|
31
|
+
searchDelay: { type: Number, required: false, default: 300 },
|
|
32
|
+
modelValue: { type: null, required: true },
|
|
33
|
+
pickerProps: { type: Object, required: true },
|
|
34
|
+
},
|
|
35
|
+
emits: ['search', 'confirm', 'confirmDisabledOption', 'update:modelValue'],
|
|
36
|
+
setup(__props: any, { expose: __expose, emit: __emit }) {
|
|
37
|
+
const Props = __props;
|
|
38
|
+
|
|
39
|
+
const columnsFieldNames = computed(() =>
|
|
40
|
+
Object.assign({ text: 'label', value: 'value' }, Props?.pickerProps?.columnsFieldNames ?? {})
|
|
41
|
+
);
|
|
42
|
+
const computedPickerProps = computed(() =>
|
|
43
|
+
Object.assign(Props?.pickerProps ?? {}, {
|
|
44
|
+
columnsFieldNames: columnsFieldNames.value,
|
|
45
|
+
})
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const Emitter = __emit;
|
|
49
|
+
|
|
50
|
+
const [popupShow, setPopupShow] = useWrapperRef<boolean>(false);
|
|
51
|
+
const triggerPopupShow = () => {
|
|
52
|
+
setPopupShow(true);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const [modelFieldValue, setModelFieldValue] = useWrapperRef<any>(Props.modelValue);
|
|
56
|
+
watch(() => Props.modelValue, setModelFieldValue, { immediate: true });
|
|
57
|
+
const updateModelFieldValue = (newValue) => {
|
|
58
|
+
setModelFieldValue(newValue);
|
|
59
|
+
// console.log('updateModelFieldValue');
|
|
60
|
+
Emitter('update:modelValue', newValue);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* idMapData 缓存
|
|
65
|
+
*/
|
|
66
|
+
const [columnsIdMapDataCache, setColumnsIdMapDataCache] = useWrapperRef<{
|
|
67
|
+
string: (PickerOption | PickerColumn)[];
|
|
68
|
+
}>({} as any);
|
|
69
|
+
const patchColumnsIdMapDataCache = (columns: (PickerOption | PickerColumn)[]) => {
|
|
70
|
+
const newColumns = { ...(columnsIdMapDataCache.value ?? {}) };
|
|
71
|
+
columns.forEach((item) => {
|
|
72
|
+
const id = item[columnsFieldNames.value.value];
|
|
73
|
+
newColumns[id] = item;
|
|
74
|
+
});
|
|
75
|
+
setColumnsIdMapDataCache({ ...newColumns });
|
|
76
|
+
};
|
|
77
|
+
watch(
|
|
78
|
+
() => computedPickerProps.value?.columns,
|
|
79
|
+
(columns) => {
|
|
80
|
+
patchColumnsIdMapDataCache(columns! ?? []);
|
|
81
|
+
},
|
|
82
|
+
{ immediate: true }
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* selectedOption
|
|
87
|
+
*/
|
|
88
|
+
const [selectedOption, setSelectedOption] = useWrapperRef<string>('');
|
|
89
|
+
watch(
|
|
90
|
+
[modelFieldValue, columnsIdMapDataCache],
|
|
91
|
+
([newValue, columnsIdMapData]) => {
|
|
92
|
+
setSelectedOption(columnsIdMapData?.[newValue]);
|
|
93
|
+
},
|
|
94
|
+
{ immediate: true }
|
|
95
|
+
);
|
|
96
|
+
const showValue = computed(() => {
|
|
97
|
+
return selectedOption.value?.[columnsFieldNames.value.text];
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* 兼容搜索模式
|
|
102
|
+
* 如果触发筛选后 columns 不存在,直接点击确认,则依旧选中上次选择的值(selectedValues 能够正确取到,而 selectedOptions 不行)
|
|
103
|
+
*/
|
|
104
|
+
const onConfirmPicker = (confirmInfo) => {
|
|
105
|
+
const { selectedOptions, selectedValues } = confirmInfo;
|
|
106
|
+
let option;
|
|
107
|
+
if (computedPickerProps.value?.columns?.length) {
|
|
108
|
+
option = array2Single(selectedOptions);
|
|
109
|
+
} else {
|
|
110
|
+
const selectedValue = array2Single(selectedValues);
|
|
111
|
+
option = columnsIdMapDataCache.value?.[selectedValue];
|
|
112
|
+
}
|
|
113
|
+
if (option.disabled) {
|
|
114
|
+
Emitter('confirmDisabledOption', {
|
|
115
|
+
option,
|
|
116
|
+
closePopup: () => setPopupShow(false),
|
|
117
|
+
});
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
Emitter('confirm', option);
|
|
121
|
+
const newValue = option?.[columnsFieldNames.value.value];
|
|
122
|
+
updateModelFieldValue(newValue);
|
|
123
|
+
setPopupShow(false);
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const [keywords, _] = useWrapperRef<string | undefined>(undefined);
|
|
127
|
+
|
|
128
|
+
const onSearch = debounce((keywords: string) => {
|
|
129
|
+
Emitter('search', keywords);
|
|
130
|
+
}, Props.searchDelay);
|
|
131
|
+
|
|
132
|
+
__expose({});
|
|
133
|
+
|
|
134
|
+
const __returned__ = {
|
|
135
|
+
Props,
|
|
136
|
+
columnsFieldNames,
|
|
137
|
+
computedPickerProps,
|
|
138
|
+
Emitter,
|
|
139
|
+
popupShow,
|
|
140
|
+
setPopupShow,
|
|
141
|
+
triggerPopupShow,
|
|
142
|
+
modelFieldValue,
|
|
143
|
+
setModelFieldValue,
|
|
144
|
+
updateModelFieldValue,
|
|
145
|
+
columnsIdMapDataCache,
|
|
146
|
+
setColumnsIdMapDataCache,
|
|
147
|
+
patchColumnsIdMapDataCache,
|
|
148
|
+
selectedOption,
|
|
149
|
+
setSelectedOption,
|
|
150
|
+
showValue,
|
|
151
|
+
onConfirmPicker,
|
|
152
|
+
keywords,
|
|
153
|
+
_,
|
|
154
|
+
onSearch,
|
|
155
|
+
get VanPopup() {
|
|
156
|
+
return VanPopup;
|
|
157
|
+
},
|
|
158
|
+
get VanPicker() {
|
|
159
|
+
return VanPicker;
|
|
160
|
+
},
|
|
161
|
+
get VanSearch() {
|
|
162
|
+
return VanSearch;
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
Object.defineProperty(__returned__, '__isScriptSetup', { enumerable: false, value: true });
|
|
166
|
+
return __returned__;
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
import {
|
|
170
|
+
renderSlot as _renderSlot,
|
|
171
|
+
createCommentVNode as _createCommentVNode,
|
|
172
|
+
mergeProps as _mergeProps,
|
|
173
|
+
createVNode as _createVNode,
|
|
174
|
+
withCtx as _withCtx,
|
|
175
|
+
renderList as _renderList,
|
|
176
|
+
createSlots as _createSlots,
|
|
177
|
+
openBlock as _openBlock,
|
|
178
|
+
createElementBlock as _createElementBlock,
|
|
179
|
+
} from 'vue';
|
|
180
|
+
|
|
181
|
+
const _hoisted_1 = { class: 'single-picker' };
|
|
182
|
+
|
|
183
|
+
function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
184
|
+
return (
|
|
185
|
+
_openBlock(),
|
|
186
|
+
_createElementBlock('div', _hoisted_1, [
|
|
187
|
+
_renderSlot(_ctx.$slots, 'trigger', {
|
|
188
|
+
triggerPopupShow: $setup.triggerPopupShow,
|
|
189
|
+
showValue: $setup.showValue,
|
|
190
|
+
selectedOption: $setup.selectedOption,
|
|
191
|
+
}),
|
|
192
|
+
_createVNode(
|
|
193
|
+
$setup['VanPopup'],
|
|
194
|
+
{
|
|
195
|
+
show: $setup.popupShow,
|
|
196
|
+
'onUpdate:show': _cache[3] || (_cache[3] = ($event) => ($setup.popupShow = $event)),
|
|
197
|
+
position: 'bottom',
|
|
198
|
+
round: '',
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
default: _withCtx(() => [
|
|
202
|
+
_createVNode(
|
|
203
|
+
$setup['VanPicker'],
|
|
204
|
+
_mergeProps($setup.computedPickerProps, {
|
|
205
|
+
onConfirm: _cache[1] || (_cache[1] = (value) => $setup.onConfirmPicker(value)),
|
|
206
|
+
onCancel: _cache[2] || (_cache[2] = ($event) => $setup.setPopupShow(false)),
|
|
207
|
+
}),
|
|
208
|
+
_createSlots({ _: 2 /* DYNAMIC */ }, [
|
|
209
|
+
_renderList(_ctx.$slots, (_slot, name) => {
|
|
210
|
+
return {
|
|
211
|
+
name: name,
|
|
212
|
+
fn: _withCtx((slotData) => [_renderSlot(_ctx.$slots, name, _mergeProps(slotData, { key: name }))]),
|
|
213
|
+
};
|
|
214
|
+
}),
|
|
215
|
+
$props.showSearch
|
|
216
|
+
? {
|
|
217
|
+
name: 'title',
|
|
218
|
+
fn: _withCtx(() => [
|
|
219
|
+
_createVNode(
|
|
220
|
+
$setup['VanSearch'],
|
|
221
|
+
{
|
|
222
|
+
shape: 'round',
|
|
223
|
+
placeholder: '请输入搜索关键词',
|
|
224
|
+
modelValue: $setup.keywords,
|
|
225
|
+
'onUpdate:modelValue': [
|
|
226
|
+
_cache[0] || (_cache[0] = ($event) => ($setup.keywords = $event)),
|
|
227
|
+
$setup.onSearch,
|
|
228
|
+
],
|
|
229
|
+
},
|
|
230
|
+
null,
|
|
231
|
+
8 /* PROPS */,
|
|
232
|
+
['modelValue', 'onUpdate:modelValue']
|
|
233
|
+
),
|
|
234
|
+
]),
|
|
235
|
+
key: '0',
|
|
236
|
+
}
|
|
237
|
+
: undefined,
|
|
238
|
+
]),
|
|
239
|
+
1040 /* FULL_PROPS, DYNAMIC_SLOTS */
|
|
240
|
+
),
|
|
241
|
+
]),
|
|
242
|
+
_: 3 /* FORWARDED */,
|
|
243
|
+
},
|
|
244
|
+
8 /* PROPS */,
|
|
245
|
+
['show']
|
|
246
|
+
),
|
|
247
|
+
])
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
__vue_sfc__.render = __vue_render__;
|
|
251
|
+
|
|
252
|
+
__vue_sfc__.__scopeId = 'data-v-03e3b57e';
|
|
253
|
+
export default __vue_sfc__;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# FieldMultiPicker
|
|
2
|
+
|
|
3
|
+
### 介绍
|
|
4
|
+
|
|
5
|
+
基于 MultiPicker 以及 vant 的 field 组件进行二次封装,方便处理表单中的单项选择需求场景。
|
|
6
|
+
|
|
7
|
+
- 支持传入所有 MultiPicker props(类型 TMultiPickerProps)
|
|
8
|
+
- 支持传入所有的 [vant field props](https://vant-ui.github.io/vant/#/zh-CN/field#props)
|
|
9
|
+
|
|
10
|
+
**主要功能描述**
|
|
11
|
+
|
|
12
|
+
- 集成 MultiPicker 所有功能
|
|
13
|
+
|
|
14
|
+
**对开发者的解脱**
|
|
15
|
+
|
|
16
|
+
- 符合 ui 设计
|
|
17
|
+
- 默认场景下 van-field 绑定值就是展示值,FieldMultiPicker 内部将绑定值与展示值表单真正需要收集的值分隔开。
|
|
18
|
+
|
|
19
|
+
## 代码演示
|
|
20
|
+
|
|
21
|
+
### 基础用法
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<template>
|
|
25
|
+
<span @click="getIdMapData">modelValue: {{ pickerValue }}</span>
|
|
26
|
+
<FieldMultiPicker
|
|
27
|
+
ref="FieldMultiPickerRef"
|
|
28
|
+
v-model="pickerValue"
|
|
29
|
+
:options="options"
|
|
30
|
+
:field-names="fieldNames"
|
|
31
|
+
title="基础用法"
|
|
32
|
+
tip-txt="这就是基础组件 - MultiPicke"
|
|
33
|
+
:field-props="{
|
|
34
|
+
name: 'fieldName',
|
|
35
|
+
label: '多选',
|
|
36
|
+
placeholder: '请选择',
|
|
37
|
+
required: true,
|
|
38
|
+
rules: [{ required: true, message: '请选择' }],
|
|
39
|
+
}"
|
|
40
|
+
/>
|
|
41
|
+
</template>
|
|
42
|
+
|
|
43
|
+
<script setup lang="ts">
|
|
44
|
+
import { useWrapperRef } from '@ebfe/vhooks';
|
|
45
|
+
import FieldMultiPicker from '../index.vue';
|
|
46
|
+
import { ref } from 'vue';
|
|
47
|
+
|
|
48
|
+
const options = [
|
|
49
|
+
{ name: '选项1', value: '1' },
|
|
50
|
+
{ name: '选项2', value: '2', disabled: true },
|
|
51
|
+
{ name: '选项3', value: '3' },
|
|
52
|
+
];
|
|
53
|
+
const fieldNames = {
|
|
54
|
+
label: 'name',
|
|
55
|
+
value: 'value',
|
|
56
|
+
};
|
|
57
|
+
const [pickerValue, _setPickerValue] = useWrapperRef<string[]>([]);
|
|
58
|
+
|
|
59
|
+
const FieldMultiPickerRef = ref<InstanceType<typeof FieldMultiPicker>>();
|
|
60
|
+
const getIdMapData = () => {
|
|
61
|
+
console.log('getIdMapData', FieldMultiPickerRef.value?.getOptionsIdMapData?.());
|
|
62
|
+
};
|
|
63
|
+
</script>
|
|
64
|
+
|
|
65
|
+
<style scoped lang="less">
|
|
66
|
+
.desc {
|
|
67
|
+
font-size: 12px;
|
|
68
|
+
text-align: center;
|
|
69
|
+
}
|
|
70
|
+
</style>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## API
|
|
74
|
+
|
|
75
|
+
### Props
|
|
76
|
+
|
|
77
|
+
继承 TMultiPickerProps 的同时
|
|
78
|
+
|
|
79
|
+
| 参数 | 说明 | 类型 | 默认值 |
|
|
80
|
+
| ---------- | ------------------ | ---------------- | ------ |
|
|
81
|
+
| fieldProps | 当前选中项对应的值 | vant field props | - |
|
|
82
|
+
|
|
83
|
+
### Events
|
|
84
|
+
|
|
85
|
+
继承 MultiPicker
|
|
86
|
+
|
|
87
|
+
| 事件名 | 说明 | 回调参数 |
|
|
88
|
+
| :----- | :--- | :------- |
|
|
89
|
+
| - | - | - |
|
|
90
|
+
|
|
91
|
+
### Slots
|
|
92
|
+
|
|
93
|
+
继承 MultiPicker
|
|
94
|
+
|
|
95
|
+
| 名称 | 说明 | 参数 |
|
|
96
|
+
| :--- | :--- | :--- |
|
|
97
|
+
| - | - | - |
|