@neatui/nuxt 0.1.0

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 (102) hide show
  1. package/README.md +3 -0
  2. package/package.json +43 -0
  3. package/rollup.config.js +35 -0
  4. package/src/components/basic/IDraggable.vue +84 -0
  5. package/src/components/basic/IDraggable@b.vue +80 -0
  6. package/src/components/basic/IFollowView.vue +211 -0
  7. package/src/components/basic/IPickerView.vue +351 -0
  8. package/src/components/basic/IRouterView.vue +360 -0
  9. package/src/components/basic/IScrollView.vue +127 -0
  10. package/src/components/basic/Icon.vue +54 -0
  11. package/src/components/basic/LayerView/Layer.vue +339 -0
  12. package/src/components/basic/LayerView/index.ts +5 -0
  13. package/src/components/basic/index.ts +7 -0
  14. package/src/components/display/Avatar.vue +1 -0
  15. package/src/components/display/Badge.vue +1 -0
  16. package/src/components/display/Calendar.vue +245 -0
  17. package/src/components/display/CalendarReg.vue +245 -0
  18. package/src/components/display/Card.vue +1 -0
  19. package/src/components/display/Carousel.vue +1 -0
  20. package/src/components/display/ChartView.vue +123 -0
  21. package/src/components/display/Collapse.vue +1 -0
  22. package/src/components/display/Desriptions.vue +1 -0
  23. package/src/components/display/Empty.vue +1 -0
  24. package/src/components/display/Image.vue +112 -0
  25. package/src/components/display/List.vue +1 -0
  26. package/src/components/display/PhotoEditor.vue +181 -0
  27. package/src/components/display/PhotoViewer.vue +50 -0
  28. package/src/components/display/Popover.vue +1 -0
  29. package/src/components/display/QRCode.vue +1 -0
  30. package/src/components/display/Segmented.vue +1 -0
  31. package/src/components/display/Statistic.vue +1 -0
  32. package/src/components/display/Table.vue +1 -0
  33. package/src/components/display/Tabs.vue +1 -0
  34. package/src/components/display/Tag.vue +1 -0
  35. package/src/components/display/Timeline.vue +1 -0
  36. package/src/components/display/Tooltip.vue +1 -0
  37. package/src/components/display/Tour.vue +1 -0
  38. package/src/components/display/Tree.vue +431 -0
  39. package/src/components/display/TreeView.vue +225 -0
  40. package/src/components/display/index.ts +8 -0
  41. package/src/components/form/Cascader.vue +435 -0
  42. package/src/components/form/DatePicker.vue +124 -0
  43. package/src/components/form/DateRangePicker@v2.vue.backup +224 -0
  44. package/src/components/form/DateRangePicker@v3.vue +116 -0
  45. package/src/components/form/DateRangeView@v3.vue +386 -0
  46. package/src/components/form/DateView.vue +229 -0
  47. package/src/components/form/DateView@v2.vue +386 -0
  48. package/src/components/form/DateView@v3.vue +471 -0
  49. package/src/components/form/EditUpload.vue +4 -0
  50. package/src/components/form/ImgUpload.vue +174 -0
  51. package/src/components/form/Input.vue.backup +230 -0
  52. package/src/components/form/Input@v3.vue +267 -0
  53. package/src/components/form/InputNumber.vue +200 -0
  54. package/src/components/form/InputRange.vue +235 -0
  55. package/src/components/form/MoreSelect.vue.backup +144 -0
  56. package/src/components/form/MoreSelect@v3.vue +195 -0
  57. package/src/components/form/MoreSelectList.vue +125 -0
  58. package/src/components/form/MoreSelectPanel@v3.vue +190 -0
  59. package/src/components/form/MoreSelectPicker.vue +124 -0
  60. package/src/components/form/MoreSelectTags.vue +124 -0
  61. package/src/components/form/PageMoreSelect.vue +187 -0
  62. package/src/components/form/PageSelect.vue +189 -0
  63. package/src/components/form/SearchMoreSelect.vue +173 -0
  64. package/src/components/form/SearchSelect.vue.backup +194 -0
  65. package/src/components/form/SearchSelect@v3.vue +202 -0
  66. package/src/components/form/Select@v3.vue +201 -0
  67. package/src/components/form/SelectList.vue +58 -0
  68. package/src/components/form/SelectPicker.vue +97 -0
  69. package/src/components/form/SelectTags.vue +52 -0
  70. package/src/components/form/SelectTree/SelectTree@v1.vue +227 -0
  71. package/src/components/form/Switch.vue +135 -0
  72. package/src/components/form/TextArea.vue +193 -0
  73. package/src/components/form/TimePicker.vue +11 -0
  74. package/src/components/form/TimeView.vue +244 -0
  75. package/src/components/form/Upload.vue +346 -0
  76. package/src/components/form/index.ts +82 -0
  77. package/src/components/loader/FormLoader/FormLoader@v2.vue +422 -0
  78. package/src/components/loader/FormLoader/FormLoader@v3.vue.backup +318 -0
  79. package/src/components/loader/FormLoader/index.ts +2 -0
  80. package/src/components/loader/FormLoader@v1/FormLoader.vue +506 -0
  81. package/src/components/loader/FormLoader@v1/FormRender.vue +277 -0
  82. package/src/components/loader/LimitLoader/LimitLoader.vue.backup +131 -0
  83. package/src/components/loader/LimitLoader/LimitLoader@v2.vue.backup +174 -0
  84. package/src/components/loader/LimitLoader/LimitLoader@v3.vue +183 -0
  85. package/src/components/loader/LimitLoader/index.ts +2 -0
  86. package/src/components/loader/TableLoader/TableColView.vue +115 -0
  87. package/src/components/loader/TableLoader/TableLoader.vue +360 -0
  88. package/src/components/loader/TableLoader/index.ts +2 -0
  89. package/src/components/loader/ViewLoader/ViewLoader@v1.vue +256 -0
  90. package/src/components/loader/ViewLoader/index.ts +2 -0
  91. package/src/components/loader/index.ts +5 -0
  92. package/src/components/tools/FormDraftsView.vue +330 -0
  93. package/src/components/tools/FormVerifyView.vue +206 -0
  94. package/src/components/tools/MoreTools.vue +74 -0
  95. package/src/components/tools/MoreTools@v2.vue +74 -0
  96. package/src/components/tools/Pagination@a.vue +222 -0
  97. package/src/components/tools/Pagination@b.vue +221 -0
  98. package/src/components/tools/index.ts +5 -0
  99. package/src/index.ts +9 -0
  100. package/src/shims-vue.d.ts +5 -0
  101. package/src/store/myui.ts +50 -0
  102. package/tsconfig.json +24 -0
@@ -0,0 +1,202 @@
1
+ <template>
2
+ <div :ui-form="`@a type:select sz:${sz}`" :ui-form-open="state.show ? 'show' : ''">
3
+ <IFollowView ref="ifollow" tipBoxClass="ny-sm nx-no" tipBoxStyle="min-width: 100%" @onshow="onshow" @onhide="onhide">
4
+ <Input
5
+ v-bind="{ placeholder, rules, theme, sz, co, block, ready, type, tips, disabled, readonly: true, clearable: false, verify, prefix, suffix, interacted }"
6
+ v-model="state.selectd.label"
7
+ :interacted="interacted"
8
+ >
9
+ <template #suffix><i ui-form-select=""></i></template>
10
+ </Input>
11
+ <template #tips v-if="!readonly || !disabled">
12
+ <div v-if="search" class="ny-sm nx-sl">
13
+ <Input v-model="state.search" sz="s">
14
+ <template #suffix>
15
+ <i ui-form-search="" class="co-note"></i>
16
+ </template>
17
+ </Input>
18
+ </div>
19
+ <ul v-if="props.options?.length" ui-scroll=":y s" class="nx-sm lh-sl" style="min-width: 100%; max-height: 16em">
20
+ <li
21
+ class="ux-hover nx-sm ny-ss r-ss nowrap"
22
+ :class="item.value === state.selectd?.value ? 'co-main' : ''"
23
+ v-for="(item, idx) of state.filter"
24
+ :key="idx"
25
+ @click="select(item)"
26
+ >
27
+ {{ item.label || item }}
28
+ </li>
29
+ </ul>
30
+ <div v-else class="w-full ny-ms" ui-flex="col cm" v-html="spare"></div>
31
+ <ul class="nx-sm lh-ml" v-if="tools">
32
+ <li class="my-ss"><div class="o-mm" ui-line="@a"></div></li>
33
+ <li ui-flex="row xm">
34
+ <div class="co-main">
35
+ <p class="nx-sm r-ss nowrap">
36
+ <span>{{ state.filter?.length || 0 }}个可选项</span>
37
+ </p>
38
+ </div>
39
+ <div>
40
+ <button v-show="state.selectd?.value" class="co-risk" ui-btn="@a none s" @click="remove">清空</button>
41
+ </div>
42
+ </li>
43
+ </ul>
44
+ </template>
45
+ </IFollowView>
46
+ </div>
47
+ </template>
48
+
49
+ <script setup lang="ts">
50
+ import { reactive, ref, computed } from 'vue';
51
+ import { Input } from '.';
52
+ import { IFollowView } from '../basic';
53
+ const ifollow: any = ref(null);
54
+ console.warn('「SearchSelect」 即将废弃,建议使用「Select」 设置参数search为true,示例:<Select v-model="value" :search="true" />');
55
+ const emits = defineEmits(['update:modelValue', 'change', 'onshow', 'onhide']);
56
+
57
+ /**
58
+ * 入参说明
59
+ * modelValue 值
60
+ * options 枚举列表
61
+ * tools 是否显示工具栏
62
+ * spare 空闲兜底内容
63
+ * search 是否启用搜索框
64
+ * pagination 是否启用分页
65
+ * refresh 是否显示刷新
66
+ *
67
+ * ---------------------------
68
+ * theme 主题
69
+ * sz 尺寸
70
+ * co 颜色
71
+ * block 撑满
72
+ * ready 准备就绪
73
+ * type 类型
74
+ * tips 提示文案
75
+ * placeholder 内容占位
76
+ * maxlength 最大长度
77
+ * minlength 最小长度
78
+ * disabled 是否禁用
79
+ * readonly 是否只读
80
+ * clearable 是否显示清除按钮
81
+ * rules 校验规则
82
+ * verify 是否是示校验图标
83
+ * prefix 前缀内容
84
+ * suffix 后缀内容
85
+ * interacted 用户是否交互
86
+ */
87
+
88
+ // 类型
89
+ interface Props {
90
+ modelValue?: string | number;
91
+ options: Array<object>;
92
+ tools?: boolean;
93
+ spare?: string;
94
+ search?: boolean;
95
+ pagination?: boolean;
96
+ refresh?: boolean;
97
+
98
+ // Input
99
+ placeholder?: string;
100
+ rules?: Array<object>;
101
+ theme?: string;
102
+ sz?: '' | 'xs' | 's' | 'm' | 'l' | 'xl';
103
+ co?: string;
104
+ block?: boolean;
105
+ ready?: boolean;
106
+ type?: string;
107
+ tips?: string;
108
+ maxlength?: null | number;
109
+ minlength?: null | number;
110
+ disabled?: boolean;
111
+ readonly?: boolean;
112
+ clearable?: boolean;
113
+ verify?: boolean;
114
+ prefix?: Array<any>;
115
+ suffix?: Array<any>;
116
+ interacted?: boolean;
117
+ }
118
+
119
+ // 入参
120
+ const props: any = withDefaults(defineProps<Props>(), {
121
+ modelValue: '',
122
+ options: () => [],
123
+ tools: true,
124
+ spare: '当前没有可选项',
125
+ search: true,
126
+ pagination: false,
127
+ refresh: false,
128
+
129
+ // INPUT
130
+ placeholder: '',
131
+ rules: () => [],
132
+ theme: '@a',
133
+ sz: '',
134
+ co: '',
135
+ block: true,
136
+ ready: false,
137
+ type: 'text',
138
+ tips: '',
139
+ maxlength: null,
140
+ minlength: null,
141
+ disabled: false,
142
+ readonly: false,
143
+ clearable: false,
144
+ verify: false,
145
+ prefix: () => [],
146
+ suffix: () => [],
147
+ interacted: false
148
+ });
149
+
150
+ const change = ({ value = '' }: any = {}) => {
151
+ emits('update:modelValue', value);
152
+ emits('change', value);
153
+ };
154
+
155
+ const state = reactive({
156
+ show: 0,
157
+ search: '',
158
+ selectd: computed(() => {
159
+ return props.options.find((option: any) => `${option.value}` === `${props.modelValue}`) || {};
160
+ }),
161
+ filter: computed(() => {
162
+ if (state.search) {
163
+ return props.options?.filter((item: any) => {
164
+ return item.label?.includes(state.search);
165
+ });
166
+ } else {
167
+ return props.options;
168
+ }
169
+ })
170
+ });
171
+ // 选择
172
+ const select = (item: any = {}) => {
173
+ change(item);
174
+ ifollow.value.cancel();
175
+ };
176
+ // 清空
177
+ const remove = () => {
178
+ change({});
179
+ ifollow.value.cancel();
180
+ };
181
+ // 取消
182
+ const cancel = () => {
183
+ ifollow.value.cancel();
184
+ };
185
+ // 显示
186
+ const onshow = () => {
187
+ emits('onshow', state.selectd);
188
+ };
189
+ // 折叠
190
+ const onhide = () => {
191
+ state.search = '';
192
+ emits('onhide', state.selectd);
193
+ };
194
+
195
+ defineExpose({
196
+ select,
197
+ remove,
198
+ change,
199
+ cancel
200
+ });
201
+ </script>
202
+ . .
@@ -0,0 +1,201 @@
1
+ <template>
2
+ <div :ui-form="`@a type:select sz:${sz}`" :ui-form-open="state.show ? 'show' : ''">
3
+ <IFollowView ref="ifollow" tipBoxClass="ny-sm nx-no" tipBoxStyle="min-width: 100%" @onshow="onshow" @onhide="onhide">
4
+ <Input
5
+ v-bind="{ placeholder, rules, theme, sz, co, block, ready, type, tips, disabled, readonly: true, clearable: false, verify, prefix, suffix, interacted }"
6
+ v-model="state.selectd.label"
7
+ :interacted="interacted"
8
+ >
9
+ <template #suffix><i ui-form-select=""></i></template>
10
+ </Input>
11
+ <template #tips v-if="!readonly && !disabled">
12
+ <div v-if="search" class="ny-sm nx-sl">
13
+ <Input v-model="state.search" sz="s">
14
+ <template #suffix>
15
+ <i ui-form-search="" class="co-note"></i>
16
+ </template>
17
+ </Input>
18
+ </div>
19
+ <ul v-if="props.options?.length" ui-scroll=":y s" class="nx-sm lh-sl" style="min-width: 100%; max-height: 16em">
20
+ <template v-for="(item, idx) of state.filter" :key="idx">
21
+ <li v-if="item.disabled" class="ux-hover nx-sm ny-ss r-ss o-ms nowrap" :class="item.value === state.selectd?.value ? 'co-main' : ''">
22
+ <del>{{ item.label || item }}</del>
23
+ </li>
24
+ <li v-else class="ux-hover nx-sm ny-ss r-ss nowrap" :class="item.value === state.selectd?.value ? 'co-main' : ''" @click="select(item)">
25
+ <span>{{ item.label || item }}</span>
26
+ </li>
27
+ </template>
28
+ </ul>
29
+ <div v-else class="w-full ny-ms" ui-flex="col cm" v-html="spare"></div>
30
+ <ul class="nx-sm lh-ml" v-if="tools">
31
+ <li class="my-ss"><div class="o-mm" ui-line="@a"></div></li>
32
+ <li ui-flex="row xm">
33
+ <div class="co-main">
34
+ <p class="nx-sm r-ss nowrap">
35
+ <span>{{ state.filter?.length || 0 }}个可选项</span>
36
+ </p>
37
+ </div>
38
+ <div>
39
+ <button v-show="state.selectd?.value" class="co-risk" ui-btn="@a none s" @click="remove">清空</button>
40
+ </div>
41
+ </li>
42
+ </ul>
43
+ </template>
44
+ </IFollowView>
45
+ </div>
46
+ </template>
47
+
48
+ <script setup lang="ts">
49
+ import { reactive, ref, computed } from 'vue';
50
+ import { Input } from '.';
51
+ import { IFollowView } from '../basic';
52
+ const ifollow: any = ref(null);
53
+
54
+ const emits = defineEmits(['update:modelValue', 'change', 'onshow', 'onhide']);
55
+
56
+ /**
57
+ * 入参说明
58
+ * modelValue 值
59
+ * options 枚举列表
60
+ * tools 是否显示工具栏
61
+ * spare 空闲兜底内容
62
+ * search 是否启用搜索框
63
+ * pagination 是否启用分页
64
+ * refresh 是否显示刷新
65
+ *
66
+ * ---------------------------
67
+ * theme 主题
68
+ * sz 尺寸
69
+ * co 颜色
70
+ * block 撑满
71
+ * ready 准备就绪
72
+ * type 类型
73
+ * tips 提示文案
74
+ * placeholder 内容占位
75
+ * maxlength 最大长度
76
+ * minlength 最小长度
77
+ * disabled 是否禁用
78
+ * readonly 是否只读
79
+ * clearable 是否显示清除按钮
80
+ * rules 校验规则
81
+ * verify 是否是示校验图标
82
+ * prefix 前缀内容
83
+ * suffix 后缀内容
84
+ * interacted 用户是否交互
85
+ */
86
+
87
+ // 类型
88
+ interface Props {
89
+ modelValue?: string | number;
90
+ options: Array<object>;
91
+ tools?: boolean;
92
+ spare?: string;
93
+ search?: boolean;
94
+ pagination?: boolean;
95
+ refresh?: boolean;
96
+
97
+ // Input
98
+ placeholder?: string;
99
+ rules?: Array<object>;
100
+ theme?: string;
101
+ sz?: '' | 'xs' | 's' | 'm' | 'l' | 'xl';
102
+ co?: string;
103
+ block?: boolean;
104
+ ready?: boolean;
105
+ type?: string;
106
+ tips?: string;
107
+ maxlength?: null | number;
108
+ minlength?: null | number;
109
+ disabled?: boolean;
110
+ readonly?: boolean;
111
+ clearable?: boolean;
112
+ verify?: boolean;
113
+ prefix?: Array<any>;
114
+ suffix?: Array<any>;
115
+ interacted?: boolean;
116
+ }
117
+
118
+ // 入参
119
+ const props: any = withDefaults(defineProps<Props>(), {
120
+ modelValue: '',
121
+ options: () => [],
122
+ tools: true,
123
+ spare: '当前没有可选项',
124
+ search: false,
125
+ pagination: false,
126
+ refresh: false,
127
+
128
+ // INPUT
129
+ placeholder: '',
130
+ rules: () => [],
131
+ theme: '@a',
132
+ sz: '',
133
+ co: '',
134
+ block: true,
135
+ ready: false,
136
+ type: 'text',
137
+ tips: '',
138
+ maxlength: null,
139
+ minlength: null,
140
+ disabled: false,
141
+ readonly: false,
142
+ clearable: false,
143
+ verify: false,
144
+ prefix: () => [],
145
+ suffix: () => [],
146
+ interacted: false
147
+ });
148
+
149
+ const change = ({ value = '' }: any = {}) => {
150
+ emits('update:modelValue', value);
151
+ emits('change', value);
152
+ };
153
+
154
+ const state = reactive({
155
+ show: 0,
156
+ search: '',
157
+ selectd: computed(() => {
158
+ return props?.options?.find((option: any) => `${option.value}` === `${props.modelValue}`) || {};
159
+ }),
160
+ filter: computed(() => {
161
+ if (state.search) {
162
+ return props.options?.filter((item: any) => {
163
+ return item.label?.includes(state.search);
164
+ });
165
+ } else {
166
+ return props.options;
167
+ }
168
+ })
169
+ });
170
+ // 选择
171
+ const select = (item: any = {}) => {
172
+ change(item);
173
+ ifollow.value.cancel();
174
+ };
175
+ // 清空
176
+ const remove = () => {
177
+ change({});
178
+ ifollow.value.cancel();
179
+ };
180
+ // 取消
181
+ const cancel = () => {
182
+ ifollow.value.cancel();
183
+ };
184
+ // 显示
185
+ const onshow = () => {
186
+ emits('onshow', state.selectd);
187
+ };
188
+ // 折叠
189
+ const onhide = () => {
190
+ state.search = '';
191
+ emits('onhide', state.selectd);
192
+ };
193
+
194
+ defineExpose({
195
+ select,
196
+ remove,
197
+ change,
198
+ cancel
199
+ });
200
+ </script>
201
+ . .
@@ -0,0 +1,58 @@
1
+ <template>
2
+ <ul v-if="props.options?.length" class="my-sm-sub lh-ss">
3
+ <li
4
+ class="hover:bg-main-ss n-sl r-ss b-solid b-xs"
5
+ :class="`${item.value === mv ? 'bk-main-ml bg-main-ss' : 'bk-case'}`"
6
+ v-for="(item, idx) of props.options"
7
+ :key="idx"
8
+ @click="mv = item.value === mv ? '' : item.value"
9
+ >
10
+ <label ui-form="@a type:radio" style="pointer-events: none">
11
+ <input type="radio" :name="field" :data-name="field" :checked="item.value === mv" /><span class="lh-ss">{{ item.label || item }}</span>
12
+ </label>
13
+ </li>
14
+ </ul>
15
+ </template>
16
+
17
+ <script setup lang="ts">
18
+ import { watch, ref } from 'vue';
19
+ const emits = defineEmits(['update:modelValue']);
20
+ const props = defineProps({
21
+ field: { type: String, default: '' },
22
+ theme: { type: String, default: '@a' },
23
+ sz: { type: String, default: 'm' },
24
+ co: { type: String, default: '' },
25
+ block: { type: Boolean, default: true },
26
+ tips: { type: String, default: '' },
27
+ placeholder: { type: String, default: '' },
28
+ options: {
29
+ type: Array as () => any[],
30
+ default: () => []
31
+ },
32
+ modelValue: {
33
+ type: [String, Number],
34
+ default: ''
35
+ },
36
+ rules: {
37
+ type: Array,
38
+ default: () => []
39
+ }
40
+ });
41
+
42
+ // eslint-disable-next-line vue/no-dupe-keys
43
+ const field: any = Math.random().toString(36).substring(2, 12);
44
+ // 内部数据
45
+ const mv: any = ref(props.modelValue);
46
+ watch(
47
+ () => props.modelValue,
48
+ (value: any) => {
49
+ mv.value = value;
50
+ }
51
+ );
52
+ watch(
53
+ () => mv.value,
54
+ (value: any) => {
55
+ emits('update:modelValue', value);
56
+ }
57
+ );
58
+ </script>
@@ -0,0 +1,97 @@
1
+ <template>
2
+ <div :ui-form="`@a type:select sz:${sz}`" ref="dom">
3
+ <IPickerView ref="ipicker">
4
+ <Input v-bind="$props" :clearable="false" readonly v-model="state.selectd.label">
5
+ <template #suffix><i ui-form-select=""></i></template>
6
+ </Input>
7
+ <template #options>
8
+ <div class="full n-xs" ui-flex="col xy">
9
+ <div class="flex-fixed n-ms b-solid bk-line bb-xs" ui-flex="row xm">
10
+ <div><button class="co-note" @click="cancel">取消</button></div>
11
+ <div><button class="co-main" @click="select">确定</button></div>
12
+ </div>
13
+ <div class="flex-block">
14
+ <IScrollView class="full n-ms" :pull="false" :load="false">
15
+ <ul v-if="props.options?.length" class="my-sm-sub">
16
+ <li class="ux-hover n-sm r-ss b-solid bk-case b-xs" v-for="(item, idx) of props.options" :key="idx" @click="mv = item.value">
17
+ <label ui-form="@a type:radio">
18
+ <input type="radio" :name="item.field" :checked="item.value === mv" /><span>{{ item.label || item }}</span>
19
+ </label>
20
+ </li>
21
+ </ul>
22
+ </IScrollView>
23
+ </div>
24
+ </div>
25
+ </template>
26
+ </IPickerView>
27
+ </div>
28
+ </template>
29
+
30
+ <script setup lang="ts">
31
+ import { reactive, ref, computed } from 'vue';
32
+ import { Input } from '.';
33
+ import { IPickerView, IScrollView } from '../basic';
34
+ import { watch } from 'vue';
35
+ const ipicker: any = ref(null);
36
+ const emits = defineEmits(['update:modelValue']);
37
+ const props = defineProps({
38
+ theme: { type: String, default: '@a' },
39
+ sz: { type: String, default: 'm' },
40
+ co: { type: String, default: '' },
41
+ block: { type: Boolean, default: true },
42
+ tips: { type: String, default: '' },
43
+ placeholder: { type: String, default: '' },
44
+ options: {
45
+ type: Array as () => any[],
46
+ default: () => []
47
+ },
48
+ modelValue: {
49
+ type: [String, Number],
50
+ default: ''
51
+ },
52
+ rules: {
53
+ type: Array,
54
+ default: () => []
55
+ }
56
+ });
57
+ // 内部数据
58
+ const mv: any = ref(props.modelValue);
59
+ watch(
60
+ () => props.modelValue,
61
+ (v: any) => {
62
+ mv.value = v;
63
+ },
64
+ { deep: true, immediate: true }
65
+ );
66
+ const state = reactive({
67
+ view: 0,
68
+ show: 0,
69
+ selectd: computed(() => {
70
+ let _value: any = {};
71
+ for (const key in props.options) {
72
+ if (`${props.options[key]?.value}` === `${props.modelValue}`) {
73
+ _value = props.options[key];
74
+ }
75
+ }
76
+ return _value;
77
+ })
78
+ });
79
+ // 更新
80
+ const change = ({ value = null }: any = {}) => {
81
+ emits('update:modelValue', value);
82
+ };
83
+ // 选定
84
+ const select = () => {
85
+ change(mv);
86
+ ipicker.value?.hide();
87
+ };
88
+ // 清空
89
+ const remove = () => {
90
+ mv.value = '';
91
+ };
92
+ // 取消
93
+ const cancel = () => {
94
+ ipicker.value?.hide();
95
+ };
96
+ </script>
97
+ . .
@@ -0,0 +1,52 @@
1
+ <template>
2
+ <div v-if="props.options?.length" class="mr-sm-sub mb-sm-sub">
3
+ <span
4
+ class="lh-ss ny-sm nx-ms r-xl dib"
5
+ :class="`${mv == item.value ? 'bg-main-sm co-main' : 'bg-weak'}`"
6
+ v-for="(item, idx) of props.options"
7
+ :key="idx"
8
+ @click="mv = item.value === mv ? '' : item.value"
9
+ >
10
+ {{ item.label || item }}
11
+ </span>
12
+ </div>
13
+ </template>
14
+
15
+ <script setup lang="ts">
16
+ import { watch, ref } from 'vue';
17
+ const emits = defineEmits(['update:modelValue']);
18
+ const props = defineProps({
19
+ theme: { type: String, default: '@a' },
20
+ sz: { type: String, default: 'm' },
21
+ co: { type: String, default: '' },
22
+ block: { type: Boolean, default: true },
23
+ tips: { type: String, default: '' },
24
+ placeholder: { type: String, default: '' },
25
+ options: {
26
+ type: Array as () => any[],
27
+ default: () => []
28
+ },
29
+ modelValue: {
30
+ type: [String, Number],
31
+ default: ''
32
+ },
33
+ rules: {
34
+ type: Array,
35
+ default: () => []
36
+ }
37
+ });
38
+ // 内部数据
39
+ const mv: any = ref(props.modelValue);
40
+ watch(
41
+ () => props.modelValue,
42
+ (value: any) => {
43
+ mv.value = value;
44
+ }
45
+ );
46
+ watch(
47
+ () => mv.value,
48
+ (value: any) => {
49
+ emits('update:modelValue', value);
50
+ }
51
+ );
52
+ </script>