@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.
Files changed (62) hide show
  1. package/es/field-multi-picker/README.md +97 -0
  2. package/es/field-multi-picker/index-sfc.less +3 -0
  3. package/es/field-multi-picker/index.ts +139 -0
  4. package/es/field-single-picker/README.md +94 -0
  5. package/es/field-single-picker/index-sfc.less +3 -0
  6. package/es/field-single-picker/index.ts +158 -0
  7. package/es/index.js +12 -5
  8. package/es/multi-picker/README.md +183 -0
  9. package/es/multi-picker/index-sfc.less +20 -0
  10. package/es/multi-picker/index.ts +399 -0
  11. package/es/single-picker/README.md +239 -0
  12. package/es/single-picker/index-sfc.less +1 -1
  13. package/es/single-picker/index.ts +253 -0
  14. package/lib/field-multi-picker/README.md +97 -0
  15. package/lib/field-multi-picker/index-sfc.less +3 -0
  16. package/lib/field-multi-picker/index.ts +139 -0
  17. package/lib/field-single-picker/README.md +94 -0
  18. package/lib/field-single-picker/index-sfc.less +3 -0
  19. package/lib/field-single-picker/index.ts +158 -0
  20. package/lib/index.js +13 -46
  21. package/lib/multi-picker/README.md +183 -0
  22. package/lib/multi-picker/index-sfc.less +20 -0
  23. package/lib/multi-picker/index.ts +399 -0
  24. package/lib/single-picker/README.md +239 -0
  25. package/lib/single-picker/index-sfc.less +1 -1
  26. package/lib/single-picker/index.ts +253 -0
  27. package/package.json +3 -3
  28. package/es/demo-button/index-sfc.css +0 -9
  29. package/es/demo-button/index-sfc.less +0 -9
  30. package/es/demo-button/index.d.ts +0 -44
  31. package/es/demo-button/index.js +0 -52
  32. package/es/index.d.ts +0 -10
  33. package/es/single-picker/index-sfc.css +0 -4
  34. package/es/single-picker/index.d.ts +0 -623
  35. package/es/single-picker/index.js +0 -249
  36. package/lib/demo-button/index-sfc.css +0 -9
  37. package/lib/demo-button/index-sfc.less +0 -9
  38. package/lib/demo-button/index.d.ts +0 -44
  39. package/lib/demo-button/index.js +0 -76
  40. package/lib/ebfe-vant-kit.cjs.js +0 -301
  41. package/lib/ebfe-vant-kit.es.js +0 -312
  42. package/lib/ebfe-vant-kit.js +0 -18216
  43. package/lib/ebfe-vant-kit.min.js +0 -13064
  44. package/lib/index.d.ts +0 -10
  45. package/lib/single-picker/index-sfc.css +0 -4
  46. package/lib/single-picker/index.d.ts +0 -623
  47. package/lib/single-picker/index.js +0 -261
  48. package/lib/single-picker/style/less.d.ts +0 -0
  49. package/lib/style.css +0 -7107
  50. package/lib/web-types.json +0 -35
  51. /package/es/{demo-button → field-multi-picker}/style/index.js +0 -0
  52. /package/es/{demo-button → field-multi-picker}/style/less.js +0 -0
  53. /package/{lib/demo-button → es/field-single-picker}/style/index.js +0 -0
  54. /package/{lib/demo-button → es/field-single-picker}/style/less.js +0 -0
  55. /package/es/{demo-button/style/index.d.ts → multi-picker/style/index.js} +0 -0
  56. /package/es/{demo-button/style/less.d.ts → multi-picker/style/less.js} +0 -0
  57. /package/{es/single-picker/style/index.d.ts → lib/field-multi-picker/style/index.js} +0 -0
  58. /package/{es/single-picker/style/less.d.ts → lib/field-multi-picker/style/less.js} +0 -0
  59. /package/lib/{demo-button/style/index.d.ts → field-single-picker/style/index.js} +0 -0
  60. /package/lib/{demo-button/style/less.d.ts → field-single-picker/style/less.js} +0 -0
  61. /package/lib/{index.css → multi-picker/style/index.js} +0 -0
  62. /package/lib/{single-picker/style/index.d.ts → multi-picker/style/less.js} +0 -0
@@ -0,0 +1,139 @@
1
+ // @ts-nocheck
2
+ import './index-sfc.css';
3
+ import { defineComponent as _defineComponent } from 'vue';
4
+ import MultiPicker, { TConfirmEventPayload, TMultiPickerProps } from '../multi-picker/index.vue';
5
+ import { Field as VanField } from 'vant';
6
+ import { isNullOrUndefined } from '@ebfe/utils';
7
+ import { useWrapperRef } from '@ebfe/vhooks';
8
+ import type { FieldProps } from 'vant';
9
+ import { computed, ref, watch } from 'vue';
10
+
11
+ const __default__ = {
12
+ name: 'FieldMultiPicker',
13
+ };
14
+
15
+ const __vue_sfc__ = /*@__PURE__*/ _defineComponent({
16
+ ...__default__,
17
+ props: {
18
+ modelValue: { type: Array, required: true },
19
+ options: { type: Array, required: true },
20
+ fieldNames: { type: Object, required: false },
21
+ title: { type: String, required: false },
22
+ tipTxt: { type: String, required: false },
23
+ showSearch: { type: Boolean, required: false },
24
+ searchDelay: { type: Number, required: false },
25
+ fieldProps: { type: Object, required: true },
26
+ },
27
+ emits: ['search', 'toggleCheckbox', 'confirm', 'update:modelValue'],
28
+ setup(__props: any, { expose: __expose, emit: __emit }) {
29
+ const Props = __props;
30
+
31
+ const computedFieldProps = computed(() => {
32
+ const defaultProps: typeof Props.fieldProps = {
33
+ inputAlign: 'right',
34
+ errorMessageAlign: 'right',
35
+ };
36
+ return Object.assign(Props?.fieldProps ?? {}, defaultProps);
37
+ });
38
+
39
+ const isViewMode = computed(
40
+ () => computedFieldProps.value?.readonly || computedFieldProps.value?.disabled || false
41
+ );
42
+ const isLink = computed(() => {
43
+ if (isNullOrUndefined(computedFieldProps.value?.isLink)) {
44
+ return !isViewMode.value;
45
+ } else {
46
+ return computedFieldProps.value?.isLink;
47
+ }
48
+ });
49
+
50
+ const Emitter = __emit;
51
+
52
+ const [modelFieldValue, setModelFieldValue] = useWrapperRef<any>(Props.modelValue ?? []);
53
+ watch(() => Props.modelValue, setModelFieldValue, { immediate: true });
54
+ const updateModelFieldValue = (newValue: any[] = []) => {
55
+ setModelFieldValue(newValue);
56
+ // console.log('updateModelFieldValue');
57
+ Emitter('update:modelValue', newValue);
58
+ };
59
+
60
+ const MultiPickerRef = ref<InstanceType<typeof MultiPicker>>();
61
+ __expose({
62
+ getOptionsIdMapData() {
63
+ return MultiPickerRef.value?.getOptionsIdMapData?.();
64
+ },
65
+ });
66
+
67
+ const __returned__ = {
68
+ Props,
69
+ computedFieldProps,
70
+ isViewMode,
71
+ isLink,
72
+ Emitter,
73
+ modelFieldValue,
74
+ setModelFieldValue,
75
+ updateModelFieldValue,
76
+ MultiPickerRef,
77
+ MultiPicker,
78
+ get VanField() {
79
+ return VanField;
80
+ },
81
+ };
82
+ Object.defineProperty(__returned__, '__isScriptSetup', { enumerable: false, value: true });
83
+ return __returned__;
84
+ },
85
+ });
86
+ import {
87
+ mergeProps as _mergeProps,
88
+ createVNode as _createVNode,
89
+ withCtx as _withCtx,
90
+ openBlock as _openBlock,
91
+ createBlock as _createBlock,
92
+ } from 'vue';
93
+
94
+ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
95
+ return (
96
+ _openBlock(),
97
+ _createBlock(
98
+ $setup['MultiPicker'],
99
+ _mergeProps({ ref: 'MultiPickerRef' }, $setup.Props, {
100
+ 'show-search': $props.showSearch,
101
+ modelValue: $setup.modelFieldValue,
102
+ 'onUpdate:modelValue': [
103
+ _cache[0] || (_cache[0] = ($event) => ($setup.modelFieldValue = $event)),
104
+ _cache[1] || (_cache[1] = (...args) => $setup.updateModelFieldValue(...args)),
105
+ ],
106
+ onSearch: _cache[2] || (_cache[2] = (...args) => $setup.Emitter('search', ...args)),
107
+ onToggleCheckbox: _cache[3] || (_cache[3] = (...args) => $setup.Emitter('toggleCheckbox', ...args)),
108
+ onConfirm: _cache[4] || (_cache[4] = (...args) => $setup.Emitter('confirm', ...args)),
109
+ }),
110
+ {
111
+ trigger: _withCtx(({ triggerPopupShow, showValue }) => [
112
+ _createVNode(
113
+ $setup['VanField'],
114
+ _mergeProps($setup.computedFieldProps, {
115
+ 'is-link': $setup.isLink,
116
+ readonly: '',
117
+ modelValue: showValue!,
118
+ 'onUpdate:modelValue': ($event) => (showValue! = $event),
119
+ onClick: () => {
120
+ if ($setup.isViewMode) return;
121
+ triggerPopupShow();
122
+ },
123
+ }),
124
+ null,
125
+ 16 /* FULL_PROPS */,
126
+ ['is-link', 'modelValue', 'onUpdate:modelValue', 'onClick']
127
+ ),
128
+ ]),
129
+ _: 1 /* STABLE */,
130
+ },
131
+ 16 /* FULL_PROPS */,
132
+ ['show-search', 'modelValue']
133
+ )
134
+ );
135
+ }
136
+ __vue_sfc__.render = __vue_render__;
137
+
138
+ __vue_sfc__.__scopeId = 'data-v-780fee58';
139
+ export default __vue_sfc__;
@@ -0,0 +1,94 @@
1
+ # FieldSinglePicker
2
+
3
+ ### 介绍
4
+
5
+ 基于 SinglePicker 以及 vant 的 field 组件进行二次封装,方便处理表单中的单项选择需求场景。
6
+
7
+ - 支持传入所有 SinglePicker props(类型 TSinglePickerProps)
8
+ - 支持传入所有的 [vant field props](https://vant-ui.github.io/vant/#/zh-CN/field#props)
9
+
10
+ **主要功能描述**
11
+
12
+ - 集成 SinglePicker 所有功能
13
+
14
+ **对开发者的解脱**
15
+
16
+ - 符合 ui 设计
17
+ - 默认场景下 van-field 绑定值就是展示值,FieldSinglePicker 内部将绑定值与展示值表单真正需要收集的值分隔开。
18
+
19
+ ## 代码演示
20
+
21
+ ### 基础用法
22
+
23
+ ```html
24
+ <template>
25
+ modelValue: {{ pickerValue }}
26
+ <FieldSinglePicker
27
+ v-model="pickerValue"
28
+ :field-props="{
29
+ name: 'declarationType',
30
+ label: '单选',
31
+ placeholder: '请选择',
32
+ required: true,
33
+ rules: [{ required: true, message: '请选择' }],
34
+ }"
35
+ :picker-props="{
36
+ title: '基础用法',
37
+ columns: columns,
38
+ columnsFieldNames: columnsFieldNames,
39
+ }"
40
+ >
41
+ <template #columns-top>
42
+ <div class="desc">这就是基础组件 - SinglePicker</div>
43
+ </template>
44
+ </FieldSinglePicker>
45
+ </template>
46
+
47
+ <script setup lang="ts">
48
+ import { useWrapperRef } from '@ebfe/vhooks';
49
+ import FieldSinglePicker from '../index.vue';
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
+ .desc {
64
+ font-size: 12px;
65
+ text-align: center;
66
+ }
67
+ </style>
68
+ ```
69
+
70
+ ## API
71
+
72
+ ### Props
73
+
74
+ 继承 TSinglePickerProps 的同时
75
+
76
+ | 参数 | 说明 | 类型 | 默认值 |
77
+ | ---------- | ------------------ | ---------------- | ------ |
78
+ | fieldProps | 当前选中项对应的值 | vant field props | - |
79
+
80
+ ### Events
81
+
82
+ 继承 SinglePicker
83
+
84
+ | 事件名 | 说明 | 回调参数 |
85
+ | :----- | :--- | :------- |
86
+ | - | - | - |
87
+
88
+ ### Slots
89
+
90
+ 继承 SinglePicker
91
+
92
+ | 名称 | 说明 | 参数 |
93
+ | :--- | :--- | :--- |
94
+ | - | - | - |
@@ -0,0 +1,3 @@
1
+ .hidden[data-v-308c2b1b] {
2
+ display: none;
3
+ }
@@ -0,0 +1,158 @@
1
+ // @ts-nocheck
2
+ import './index-sfc.css';
3
+ import { defineComponent as _defineComponent } from 'vue';
4
+ import SinglePicker, { TSinglePickerProps, TConfirmDisabledOptionPayload } from '../single-picker/index.vue';
5
+ import { Field as VanField } from 'vant';
6
+ import { isNullOrUndefined } from '@ebfe/utils';
7
+ import { useWrapperRef } from '@ebfe/vhooks';
8
+ import type { FieldProps } from 'vant';
9
+ import { computed, watch } from 'vue';
10
+
11
+ const __default__ = {
12
+ name: 'FieldSinglePicker',
13
+ };
14
+
15
+ const __vue_sfc__ = /*@__PURE__*/ _defineComponent({
16
+ ...__default__,
17
+ props: {
18
+ showSearch: { type: Boolean, required: false, default: false },
19
+ searchDelay: { type: Number, required: false },
20
+ modelValue: { type: null, required: true },
21
+ pickerProps: { type: Object, required: true },
22
+ fieldProps: { type: Object, required: true },
23
+ },
24
+ emits: ['search', 'confirm', 'confirmDisabledOption', 'update:modelValue'],
25
+ setup(__props: any, { expose: __expose, emit: __emit }) {
26
+ const Props = __props;
27
+
28
+ const computedFieldProps = computed(() => {
29
+ const defaultProps: typeof Props.fieldProps = {
30
+ inputAlign: 'right',
31
+ errorMessageAlign: 'right',
32
+ };
33
+ return Object.assign(Props?.fieldProps ?? {}, defaultProps);
34
+ });
35
+
36
+ const isViewMode = computed(
37
+ () => computedFieldProps.value?.readonly || computedFieldProps.value?.disabled || false
38
+ );
39
+ const isLink = computed(() => {
40
+ if (isNullOrUndefined(computedFieldProps.value?.isLink)) {
41
+ return !isViewMode.value;
42
+ } else {
43
+ return computedFieldProps.value?.isLink;
44
+ }
45
+ });
46
+
47
+ const Emitter = __emit;
48
+
49
+ const [modelFieldValue, setModelFieldValue] = useWrapperRef<any>(Props.modelValue);
50
+ watch(() => Props.modelValue, setModelFieldValue, { immediate: true });
51
+ const updateModelFieldValue = (newValue) => {
52
+ setModelFieldValue(newValue);
53
+ // console.log('updateModelFieldValue');
54
+ Emitter('update:modelValue', newValue);
55
+ };
56
+
57
+ __expose({});
58
+
59
+ const __returned__ = {
60
+ Props,
61
+ computedFieldProps,
62
+ isViewMode,
63
+ isLink,
64
+ Emitter,
65
+ modelFieldValue,
66
+ setModelFieldValue,
67
+ updateModelFieldValue,
68
+ SinglePicker,
69
+ get VanField() {
70
+ return VanField;
71
+ },
72
+ };
73
+ Object.defineProperty(__returned__, '__isScriptSetup', { enumerable: false, value: true });
74
+ return __returned__;
75
+ },
76
+ });
77
+ import {
78
+ createCommentVNode as _createCommentVNode,
79
+ mergeProps as _mergeProps,
80
+ renderSlot as _renderSlot,
81
+ createVNode as _createVNode,
82
+ withCtx as _withCtx,
83
+ renderList as _renderList,
84
+ createSlots as _createSlots,
85
+ openBlock as _openBlock,
86
+ createBlock as _createBlock,
87
+ } from 'vue';
88
+
89
+ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
90
+ return (
91
+ _openBlock(),
92
+ _createBlock(
93
+ $setup['SinglePicker'],
94
+ {
95
+ modelValue: $setup.modelFieldValue,
96
+ 'onUpdate:modelValue': [
97
+ _cache[1] || (_cache[1] = ($event) => ($setup.modelFieldValue = $event)),
98
+ _cache[2] || (_cache[2] = (...args) => $setup.updateModelFieldValue(...args)),
99
+ ],
100
+ 'picker-props': $props.pickerProps,
101
+ 'show-search': $props.showSearch,
102
+ onSearch: _cache[3] || (_cache[3] = (...args) => $setup.Emitter('search', ...args)),
103
+ onConfirm: _cache[4] || (_cache[4] = (...args) => $setup.Emitter('confirm', ...args)),
104
+ onConfirmDisabledOption:
105
+ _cache[5] || (_cache[5] = (...args) => $setup.Emitter('confirmDisabledOption', ...args)),
106
+ },
107
+ _createSlots(
108
+ {
109
+ trigger: _withCtx(({ triggerPopupShow, showValue }) => [
110
+ _createVNode(
111
+ $setup['VanField'],
112
+ _mergeProps({ class: 'hidden' }, $setup.computedFieldProps, {
113
+ modelValue: $setup.modelFieldValue,
114
+ 'onUpdate:modelValue': _cache[0] || (_cache[0] = ($event) => ($setup.modelFieldValue = $event)),
115
+ 'is-link': $setup.isLink,
116
+ }),
117
+ null,
118
+ 16 /* FULL_PROPS */,
119
+ ['modelValue', 'is-link']
120
+ ),
121
+ _createVNode(
122
+ $setup['VanField'],
123
+ _mergeProps($setup.computedFieldProps, {
124
+ 'is-link': $setup.isLink,
125
+ readonly: '',
126
+ name: undefined,
127
+ modelValue: showValue!,
128
+ 'onUpdate:modelValue': ($event) => (showValue! = $event),
129
+ onClick: () => {
130
+ if ($setup.isViewMode) return;
131
+ triggerPopupShow();
132
+ },
133
+ }),
134
+ null,
135
+ 16 /* FULL_PROPS */,
136
+ ['is-link', 'modelValue', 'onUpdate:modelValue', 'onClick']
137
+ ),
138
+ ]),
139
+ _: 2 /* DYNAMIC */,
140
+ },
141
+ [
142
+ _renderList(_ctx.$slots, (_slot, name) => {
143
+ return {
144
+ name: name,
145
+ fn: _withCtx((slotData) => [_renderSlot(_ctx.$slots, name, _mergeProps(slotData, { key: name }))]),
146
+ };
147
+ }),
148
+ ]
149
+ ),
150
+ 1032 /* PROPS, DYNAMIC_SLOTS */,
151
+ ['modelValue', 'picker-props', 'show-search']
152
+ )
153
+ );
154
+ }
155
+ __vue_sfc__.render = __vue_render__;
156
+
157
+ __vue_sfc__.__scopeId = 'data-v-308c2b1b';
158
+ export default __vue_sfc__;
package/lib/index.js CHANGED
@@ -1,49 +1,13 @@
1
- var __create = Object.create;
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __export = (target, all) => {
8
- for (var name in all) __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if ((from && typeof from === 'object') || typeof from === 'function') {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, {
15
- get: () => from[key],
16
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable,
17
- });
18
- }
19
- return to;
20
- };
21
- var __toESM = (mod, isNodeMode, target) => (
22
- (target = mod != null ? __create(__getProtoOf(mod)) : {}),
23
- __copyProps(
24
- // If the importer is in node compatibility mode or this is not an ESM
25
- // file that has been converted to a CommonJS file using a Babel-
26
- // compatible transform (i.e. "__esModule" has not been set), then set
27
- // "default" to the CommonJS "module.exports" for node compatibility.
28
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, 'default', { value: mod, enumerable: true }) : target,
29
- mod
30
- )
31
- );
32
- var __toCommonJS = (mod) => __copyProps(__defProp({}, '__esModule', { value: true }), mod);
33
- var stdin_exports = {};
34
- __export(stdin_exports, {
35
- DemoButton: () => import_demo_button.default,
36
- SinglePicker: () => import_single_picker.default,
37
- default: () => stdin_default,
38
- install: () => install,
39
- version: () => version,
40
- });
41
- module.exports = __toCommonJS(stdin_exports);
42
- var import_demo_button = __toESM(require('./demo-button'));
43
- var import_single_picker = __toESM(require('./single-picker'));
44
- const version = '0.0.0';
1
+ import FieldMultiPicker from './field-multi-picker';
2
+ import FieldSinglePicker from './field-single-picker';
3
+ import MultiPicker from './multi-picker';
4
+ import SinglePicker from './single-picker';
5
+
6
+ const version = '0.0.1';
7
+
45
8
  function install(app) {
46
- const components = [import_demo_button.default, import_single_picker.default];
9
+ const components = [FieldMultiPicker, FieldSinglePicker, MultiPicker, SinglePicker];
10
+
47
11
  components.forEach((item) => {
48
12
  if (item.install) {
49
13
  app.use(item);
@@ -52,7 +16,10 @@ function install(app) {
52
16
  }
53
17
  });
54
18
  }
55
- var stdin_default = {
19
+
20
+ export { install, version, FieldMultiPicker, FieldSinglePicker, MultiPicker, SinglePicker };
21
+
22
+ export default {
56
23
  install,
57
24
  version,
58
25
  };
@@ -0,0 +1,183 @@
1
+ # MultiPicker
2
+
3
+ ### 介绍
4
+
5
+ 主要基于 vant 的 Popup、CheckboxGroup 等组件进行二次封装,方便处理多项选择的需求场景。
6
+
7
+ **主要功能描述**
8
+
9
+ - 支持自定义触发器
10
+ - 支持开启搜索功能
11
+ - 自定义文本提示信息
12
+
13
+ **对开发者的解脱**
14
+
15
+ - 符合 ui 设计
16
+ - 打开收起逻辑的编写
17
+ - 对所选项的 `真实值`、`展示值` 的处理
18
+ - 基于上次选中的结果进行编辑后,点击取消,回滚上次选中的状态
19
+
20
+ ## 代码演示
21
+
22
+ ### 基础用法
23
+
24
+ ```html
25
+ <template>
26
+ <MultiPicker
27
+ v-model="pickerValue"
28
+ :options="options"
29
+ :field-names="fieldNames"
30
+ title="基础用法"
31
+ tip-txt="💫这是一段提示文本: 你可以根据业务需要自行定制展示的内容"
32
+ >
33
+ <template #trigger="{ triggerPopupShow, showValue }">
34
+ <div class="trigger-box">
35
+ <van-button type="primary" @click="triggerPopupShow"> 点击打开多选-选择器🤪 </van-button>
36
+ <p>show value: {{ showValue }}</p>
37
+ <p>modelValue: {{ pickerValue }}</p>
38
+ </div>
39
+ </template>
40
+ </MultiPicker>
41
+ </template>
42
+
43
+ <script setup lang="ts">
44
+ import { useWrapperRef } from '@ebfe/vhooks';
45
+ import MultiPicker from '../index.vue';
46
+ import { Button as VanButton } from 'vant';
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
+ </script>
59
+
60
+ <style scoped lang="less">
61
+ .trigger-box {
62
+ display: flex;
63
+ flex-direction: column;
64
+ justify-content: center;
65
+ align-items: center;
66
+ }
67
+ </style>
68
+ ```
69
+
70
+ ### 开启搜索功能
71
+
72
+ - 传入 show-earch 展示搜索框
73
+ - 侦听 search 事件处理搜索逻辑
74
+
75
+ > 💫 对交互细节的优化:如果在输入关键字进行搜索后,新的数据源为空,此时点击确定,更新的值依旧为最近一次选中的选项。
76
+
77
+ ```html
78
+ <template>
79
+ <MultiPicker
80
+ v-model="pickerValue"
81
+ :options="options"
82
+ :field-names="fieldNames"
83
+ title="基础用法"
84
+ tip-txt="💫开启了搜索功能"
85
+ show-search
86
+ @search="onSearch"
87
+ >
88
+ <template #trigger="{ triggerPopupShow, showValue }">
89
+ <div class="trigger-box">
90
+ <van-button type="primary" @click="triggerPopupShow"> 带搜索框🔍 </van-button>
91
+ <p>show value: {{ showValue }}</p>
92
+ <p>modelValue: {{ pickerValue }}</p>
93
+ </div>
94
+ </template>
95
+ </MultiPicker>
96
+ </template>
97
+
98
+ <script setup lang="ts">
99
+ import { useWrapperRef } from '@ebfe/vhooks';
100
+ import MultiPicker from '../index.vue';
101
+ import { Button as VanButton } from 'vant';
102
+ import { checkStrIsEmpty } from '@ebfe/utils';
103
+
104
+ const optionsDataSource = [
105
+ { name: '选项1', value: '1' },
106
+ { name: '选项2', value: '2', disabled: true },
107
+ { name: '选项3', value: '3' },
108
+ { name: '选项4', value: '4', disabled: true },
109
+ { name: '选项5', value: '5' },
110
+ { name: '选项6', value: '6' },
111
+ { name: '选项7', value: '7', disabled: true },
112
+ { name: '选项8', value: '8' },
113
+ { name: '选项9', value: '9' },
114
+ { name: '选项10', value: '10' },
115
+ { name: '选项11', value: '11', disabled: true },
116
+ { name: '选项12', value: '12' },
117
+ { name: '选项13', value: '13', disabled: true },
118
+ { name: '选项14', value: '14' },
119
+ { name: '选项15', value: '15' },
120
+ { name: '选项16', value: '16', disabled: true },
121
+ { name: '选项17', value: '17' },
122
+ { name: '选项18', value: '18' },
123
+ { name: '选项19', value: '19' },
124
+ { name: '选项20', value: '20' },
125
+ ];
126
+ const [options, setOptions] = useWrapperRef(optionsDataSource);
127
+
128
+ const fieldNames = {
129
+ label: 'name',
130
+ value: 'value',
131
+ };
132
+ const [pickerValue, _setPickerValue] = useWrapperRef<string[]>([]);
133
+
134
+ const onSearch = (keywords: string) => {
135
+ if (checkStrIsEmpty(keywords)) {
136
+ setOptions(optionsDataSource);
137
+ } else {
138
+ setOptions(
139
+ optionsDataSource.filter((item) => item.name.toLocaleLowerCase().includes(keywords.toLocaleLowerCase()))
140
+ );
141
+ }
142
+ };
143
+ </script>
144
+
145
+ <style scoped lang="less">
146
+ .trigger-box {
147
+ display: flex;
148
+ flex-direction: column;
149
+ justify-content: center;
150
+ align-items: center;
151
+ }
152
+ </style>
153
+ ```
154
+
155
+ ## API
156
+
157
+ ### Props
158
+
159
+ TMultiPickerProps
160
+
161
+ | 参数 | 说明 | 类型 | 默认值 |
162
+ | ------------ | ------------------ | -------------------------------------------------------------------------------------- | ---------------------------------- |
163
+ | v-model | 当前选中项对应的值 | string[] | - |
164
+ | options | 选项 | Array<{ label: string; value: string; disabled?: boolean }> (label、value支持属性别名) | - |
165
+ | fieldNames | 字段别名 | { label?: string; value?: string; } | { label: 'label', value: 'value' } |
166
+ | title | 标题 | string | - |
167
+ | tipTxt | 文本提示信息 | string | - |
168
+ | show-search | 是否显示搜索框 | boolean | false |
169
+ | search-delay | 搜索防抖时间(ms) | number | 300 |
170
+
171
+ ### Events
172
+
173
+ | 事件名 | 说明 | 回调参数 |
174
+ | :------------- | :----------------------------- | :------------------------------------------------------- |
175
+ | confirm | 点击确认后触发的事件 | TConfirmEventPayload = { values: any[]; options: any[] } |
176
+ | search | 在搜索框输入时,触发的搜索事件 | keywords |
177
+ | toggleCheckbox | 触发选中、取消选中时的事件 | values |
178
+
179
+ ### Slots
180
+
181
+ | 名称 | 说明 | 参数 |
182
+ | :------ | :----- | :-------------------------------------------------------------------------------- |
183
+ | trigger | 触发器 | `{ trigger-popup-show: () => void; show-value: string; selected-options: any[] }` |
@@ -0,0 +1,20 @@
1
+ @import 'vant/lib/index.css';
2
+ [data-v-d088a892] .van-search {
3
+ width: 250px;
4
+ }
5
+ .multi-picker-main[data-v-d088a892] {
6
+ min-height: 200px;
7
+ max-height: 60vh;
8
+ overflow: hidden;
9
+ display: flex;
10
+ flex-direction: column;
11
+ }
12
+ .multi-picker-main .multi-picker-tip[data-v-d088a892] {
13
+ padding: 10px 16px;
14
+ text-align: center;
15
+ font-size: 13px;
16
+ color: #666666;
17
+ }
18
+ .multi-picker-main .multi-picker-cell-group[data-v-d088a892] {
19
+ overflow-y: auto;
20
+ }