@neatui/vue 1.0.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 (100) hide show
  1. package/README.md +139 -0
  2. package/package.json +26 -0
  3. package/src/components/basic/IDraggable.vue +84 -0
  4. package/src/components/basic/IDraggable@b.vue +80 -0
  5. package/src/components/basic/IFollowView.vue +172 -0
  6. package/src/components/basic/IFollowView@v2.vue +188 -0
  7. package/src/components/basic/IPickerView.vue +351 -0
  8. package/src/components/basic/IRouterView@v2.vue.backup +119 -0
  9. package/src/components/basic/IRouterView@v3.vue.backup +252 -0
  10. package/src/components/basic/IRouterView@v4.vue +362 -0
  11. package/src/components/basic/IScrollView.vue +127 -0
  12. package/src/components/basic/Icon.vue +54 -0
  13. package/src/components/basic/LayerView/Layer.vue +333 -0
  14. package/src/components/basic/LayerView/index.ts +5 -0
  15. package/src/components/basic/follow.ts +119 -0
  16. package/src/components/basic/index.ts +7 -0
  17. package/src/components/display/Avatar.vue +1 -0
  18. package/src/components/display/Badge.vue +1 -0
  19. package/src/components/display/Calendar.vue +245 -0
  20. package/src/components/display/CalendarReg.vue +245 -0
  21. package/src/components/display/Card.vue +1 -0
  22. package/src/components/display/Carousel.vue +1 -0
  23. package/src/components/display/Collapse.vue +1 -0
  24. package/src/components/display/Desriptions.vue +1 -0
  25. package/src/components/display/Empty.vue +1 -0
  26. package/src/components/display/Image.vue +112 -0
  27. package/src/components/display/List.vue +1 -0
  28. package/src/components/display/PhotoEditor.vue +181 -0
  29. package/src/components/display/PhotoViewer.vue +50 -0
  30. package/src/components/display/Popover.vue +1 -0
  31. package/src/components/display/QRCode.vue +1 -0
  32. package/src/components/display/Segmented.vue +1 -0
  33. package/src/components/display/Statistic.vue +1 -0
  34. package/src/components/display/Table.vue +1 -0
  35. package/src/components/display/Tabs.vue +1 -0
  36. package/src/components/display/Tag.vue +1 -0
  37. package/src/components/display/Timeline.vue +1 -0
  38. package/src/components/display/Tooltip.vue +1 -0
  39. package/src/components/display/Tour.vue +1 -0
  40. package/src/components/display/Tree.vue +431 -0
  41. package/src/components/display/TreeView.vue +222 -0
  42. package/src/components/display/index.ts +7 -0
  43. package/src/components/form/Cascader.vue +435 -0
  44. package/src/components/form/DatePicker.vue +124 -0
  45. package/src/components/form/DateRangePicker@v2.vue.backup +224 -0
  46. package/src/components/form/DateRangePicker@v3.vue +116 -0
  47. package/src/components/form/DateRangeView@v3.vue +386 -0
  48. package/src/components/form/DateView.vue +231 -0
  49. package/src/components/form/DateView@v2.vue +386 -0
  50. package/src/components/form/DateView@v3.vue +471 -0
  51. package/src/components/form/EditUpload.vue +4 -0
  52. package/src/components/form/ImgUpload.vue +174 -0
  53. package/src/components/form/Input.vue.backup +230 -0
  54. package/src/components/form/Input@v3.vue +267 -0
  55. package/src/components/form/InputNumber.vue +200 -0
  56. package/src/components/form/InputRange.vue +235 -0
  57. package/src/components/form/MoreSelect.vue.backup +144 -0
  58. package/src/components/form/MoreSelect@v3.vue +190 -0
  59. package/src/components/form/MoreSelectList.vue +120 -0
  60. package/src/components/form/MoreSelectPanel@v3.vue +190 -0
  61. package/src/components/form/MoreSelectPicker.vue +119 -0
  62. package/src/components/form/MoreSelectTags.vue +119 -0
  63. package/src/components/form/PageMoreSelect.vue +187 -0
  64. package/src/components/form/PageSelect.vue +189 -0
  65. package/src/components/form/SearchMoreSelect.vue +168 -0
  66. package/src/components/form/SearchSelect.vue.backup +194 -0
  67. package/src/components/form/SearchSelect@v3.vue +202 -0
  68. package/src/components/form/Select@v3.vue +201 -0
  69. package/src/components/form/SelectList.vue +58 -0
  70. package/src/components/form/SelectPicker.vue +97 -0
  71. package/src/components/form/SelectTags.vue +52 -0
  72. package/src/components/form/SelectTree/SelectTree@v1.vue +227 -0
  73. package/src/components/form/Switch.vue +135 -0
  74. package/src/components/form/TextArea.vue +171 -0
  75. package/src/components/form/TimePicker.vue +11 -0
  76. package/src/components/form/TimeView.vue +244 -0
  77. package/src/components/form/Upload.vue +349 -0
  78. package/src/components/form/index.ts +82 -0
  79. package/src/components/loader/FormLoader/FormLoader@v2.vue +422 -0
  80. package/src/components/loader/FormLoader/FormLoader@v3.vue.backup +318 -0
  81. package/src/components/loader/FormLoader/index.ts +2 -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 +356 -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 +308 -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 +5 -0
  100. package/tsconfig.json +24 -0
@@ -0,0 +1,82 @@
1
+ import Input from './Input@v3.vue';
2
+ import InputRange from './InputRange.vue';
3
+ import Switch from './Switch.vue';
4
+ import TextArea from './TextArea.vue';
5
+
6
+ import Select from './Select@v3.vue';
7
+ import SelectList from './SelectList.vue';
8
+ import SelectTags from './SelectTags.vue';
9
+ import SelectPicker from './SelectPicker.vue';
10
+ import SearchSelect from './SearchSelect@v3.vue';
11
+ import MoreSelect from './MoreSelect@v3.vue';
12
+ import MoreSelectList from './MoreSelectList.vue';
13
+ import MoreSelectTags from './MoreSelectTags.vue';
14
+ import MoreSelectPicker from './MoreSelectPicker.vue';
15
+ import SearchMoreSelect from './SearchMoreSelect.vue';
16
+ import PageSelect from './PageSelect.vue';
17
+ import SelectTree from './SelectTree/SelectTree@v1.vue';
18
+
19
+ // import DateView from './DateView.vue';
20
+ import DateView from './DateView@v2.vue';
21
+ // import DateView from './DateView@v3.vue';
22
+ import DateRangeView from './DateRangeView@v3.vue';
23
+ import DatePicker from './DatePicker.vue';
24
+ import TimePicker from './TimePicker.vue';
25
+ import DateRangePicker from './DateRangePicker@v3.vue';
26
+ import ImgUpload from './ImgUpload.vue';
27
+ import Upload from './Upload.vue';
28
+ import Cascader from './Cascader.vue';
29
+
30
+ export {
31
+ Input,
32
+ InputRange,
33
+ Switch,
34
+ TextArea,
35
+ Select,
36
+ SelectList,
37
+ SelectTags,
38
+ SelectPicker,
39
+ SearchSelect,
40
+ PageSelect,
41
+ SelectTree,
42
+ MoreSelect,
43
+ MoreSelectList,
44
+ MoreSelectTags,
45
+ MoreSelectPicker,
46
+ SearchMoreSelect,
47
+ // 日期&时间
48
+ DateView,
49
+ DateRangeView,
50
+ DatePicker,
51
+ TimePicker,
52
+ DateRangePicker,
53
+ ImgUpload,
54
+ Upload,
55
+ Cascader
56
+ };
57
+
58
+ // 单选
59
+ // Select 下拉选择 (默认)
60
+ // SelectDrape 下拉选择 等同 Select
61
+ // SelectPanel 面板选择
62
+ // SelectLayer 弹层选择
63
+ // SelectCards 卡片选择
64
+ // SelectWheel 滚轮选择
65
+ // SelectTags 标签选择
66
+
67
+ // 多选
68
+ // MultiSelectDrape 下拉选择 (默认)
69
+ // MultiSelectPanel 面板选择
70
+ // MultiSelectLayer 弹层选择
71
+ // MultiSelectCards 卡片选择
72
+ // MultiSelectWheel 滚轮选择
73
+ // MultiSelectTags 标签选择
74
+
75
+ // 日期
76
+ // Date 日期选择核心
77
+ // DateDrape 日期下拉选择
78
+ // DatePanel 日期面板选择
79
+ // DateLayer 日期弹层选择
80
+ // DateWheel 日期滚轮选择
81
+
82
+ // MultiDateView 多选日期
@@ -0,0 +1,422 @@
1
+ <template>
2
+ <slot>
3
+ <div :ui-row="rows" class="n-sl-sub">
4
+ <template v-for="(col, idx) in state.form" :key="idx">
5
+ <div v-if="!col.clear" :id="col._fid" :ui-col="col.media" :ui-flex="`${vertical ? 'col xm' : 'row lt'}`">
6
+ <template v-if="col.label">
7
+ <h5 v-if="vertical" :style="`${col.rules?.some((validator: any) => validator.required) ? 'text-indent: -1em' : ''}`" class="o-ls">
8
+ <template v-if="col.label == '*'"></template>
9
+ <template v-else>
10
+ <b v-if="col.rules?.some((validator: any) => validator.required)" class="co-risk pr" style="left: 0.1em">﹡</b>
11
+ <span>{{ col.label ? col.label + ':' : '' }}</span>
12
+ </template>
13
+ </h5>
14
+ <p v-else :class="`${clh({ ...(col.model[1] || {}) })}`" :style="`width:${state._lw + 'em'}; max-width:50%;`" class="ar nr-sm flex-fixed o-ls">
15
+ <template v-if="col.label == '*'"></template>
16
+ <template v-else>
17
+ <b v-if="col.rules?.some((validator: any) => validator.required)" class="co-risk">﹡</b>
18
+ <span>{{ col.label ? col.label + ':' : '' }}</span>
19
+ </template>
20
+ </p>
21
+ </template>
22
+ <Input v-if="col.model[0] === 'Input'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" class="full-w" v-bind="{ ...(col.model[1] || {}) }" />
23
+ <Select
24
+ v-else-if="col.model[0] === 'Select'"
25
+ v-model="col._data[col.field]"
26
+ :interacted="interacted"
27
+ :options="col.enums"
28
+ :rules="col?.rules"
29
+ class="full-w"
30
+ v-bind="{ ...(col.model[1] || {}) }"
31
+ ></Select>
32
+ <SelectList
33
+ v-else-if="col.model[0] === 'SelectList'"
34
+ v-model="col._data[col.field]"
35
+ :interacted="interacted"
36
+ :options="col.enums"
37
+ :rules="col?.rules"
38
+ class="full-w"
39
+ v-bind="{ ...(col.model[1] || {}) }"
40
+ />
41
+ <SelectTags
42
+ v-else-if="col.model[0] === 'SelectTags'"
43
+ v-model="col._data[col.field]"
44
+ :interacted="interacted"
45
+ :options="col.enums"
46
+ :rules="col?.rules"
47
+ class="full-w"
48
+ v-bind="{ ...(col.model[1] || {}) }"
49
+ />
50
+ <SelectPicker
51
+ v-else-if="col.model[0] === 'SelectPicker'"
52
+ v-model="col._data[col.field]"
53
+ :interacted="interacted"
54
+ :options="col.enums"
55
+ :rules="col?.rules"
56
+ class="full-w"
57
+ v-bind="{ ...(col.model[1] || {}) }"
58
+ />
59
+ <SearchSelect
60
+ v-else-if="col.model[0] === 'SearchSelect'"
61
+ v-model="col._data[col.field]"
62
+ :interacted="interacted"
63
+ :options="col.enums"
64
+ :rules="col.rules"
65
+ class="full-w"
66
+ v-bind="{ ...(col.model[1] || {}) }"
67
+ />
68
+ <MoreSelect
69
+ v-else-if="col.model[0] === 'MoreSelect'"
70
+ v-model="col._data[col.field]"
71
+ :interacted="interacted"
72
+ :options="col.enums"
73
+ :rules="col.rules"
74
+ class="full-w"
75
+ v-bind="{ ...(col.model[1] || {}) }"
76
+ />
77
+ <MoreSelectList
78
+ v-else-if="col.model[0] === 'MoreSelectList'"
79
+ v-model="col._data[col.field]"
80
+ :interacted="interacted"
81
+ :options="col.enums"
82
+ :rules="col.rules"
83
+ class="full-w"
84
+ v-bind="{ ...(col.model[1] || {}) }"
85
+ />
86
+ <MoreSelectTags
87
+ v-else-if="col.model[0] === 'MoreSelectTags'"
88
+ v-model="col._data[col.field]"
89
+ :interacted="interacted"
90
+ :options="col.enums"
91
+ :rules="col.rules"
92
+ class="full-w"
93
+ v-bind="{ ...(col.model[1] || {}) }"
94
+ />
95
+ <MoreSelectPicker
96
+ v-else-if="col.model[0] === 'MoreSelectPicker'"
97
+ v-model="col._data[col.field]"
98
+ :interacted="interacted"
99
+ :options="col.enums"
100
+ :rules="col.rules"
101
+ class="full-w"
102
+ v-bind="{ ...(col.model[1] || {}) }"
103
+ />
104
+ <SearchMoreSelect
105
+ v-else-if="col.model[0] === 'SearchMoreSelect'"
106
+ v-model="col._data[col.field]"
107
+ :interacted="interacted"
108
+ :options="col.enums"
109
+ :rules="col.rules"
110
+ class="full-w"
111
+ v-bind="{ ...(col.model[1] || {}) }"
112
+ />
113
+ <PageSelect
114
+ v-else-if="col.model[0] === 'PageSelect'"
115
+ v-model="col._data[col.field]"
116
+ :interacted="interacted"
117
+ :options="col.enums"
118
+ :rules="col.rules"
119
+ class="full-w"
120
+ v-bind="{ ...(col.model[1] || {}) }"
121
+ />
122
+ <SelectTree
123
+ v-else-if="col.model[0] === 'SelectTree'"
124
+ v-model="col._data[col.field]"
125
+ :interacted="interacted"
126
+ :options="col.enums"
127
+ :rules="col.rules"
128
+ class="full-w"
129
+ v-bind="{ ...(col.model[1] || {}) }"
130
+ />
131
+ <DatePicker
132
+ v-else-if="col.model[0] === 'DatePicker'"
133
+ v-model="col._data[col.field]"
134
+ :interacted="interacted"
135
+ :rules="col.rules"
136
+ class="full-w"
137
+ v-bind="{ ...(col.model[1] || {}) }"
138
+ />
139
+ <DateRangePicker
140
+ v-else-if="col.model[0] === 'DateRangePicker'"
141
+ v-model="col._data[col.field]"
142
+ :interacted="interacted"
143
+ :rules="col.rules"
144
+ class="full-w"
145
+ v-bind="{ ...(col.model[1] || {}) }"
146
+ />
147
+ <ImgUpload v-else-if="col.model[0] === 'ImgUpload'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" v-bind="{ ...(col.model[1] || {}) }" />
148
+ <Upload v-else-if="col.model[0] === 'Upload'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" v-bind="{ ...(col.model[1] || {}) }" />
149
+ <TextArea
150
+ v-else-if="col.model[0] === 'TextArea'"
151
+ v-model="col._data[col.field]"
152
+ :interacted="interacted"
153
+ :rules="col.rules"
154
+ v-bind="{ ...(col.model[1] || {}) }"
155
+ ></TextArea>
156
+ <Switch v-else-if="col.model[0] === 'Switch'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" v-bind="{ ...(col.model[1] || {}) }" />
157
+ <Tree v-else-if="col.model[0] === 'Tree'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" class="mt-sm" v-bind="{ ...(col.model[1] || {}) }" />
158
+ <Cascader
159
+ v-else-if="col.model[0] === 'Cascader'"
160
+ v-model="col._data[col.field]"
161
+ :interacted="interacted"
162
+ :options="col.enums"
163
+ :rules="col.rules"
164
+ class="full-w"
165
+ v-bind="{ ...(col.model[1] || {}) }"
166
+ />
167
+ <template v-else>
168
+ <slot v-if="col.slot" :name="col.slot" :col="col"></slot>
169
+ <slot v-else-if="col.model[0]" :name="col.model[0]" :col="col"></slot>
170
+ <slot v-else :name="col.field" :col="col"></slot>
171
+ </template>
172
+ </div>
173
+ </template>
174
+ <div :ui-flex="`${vertical ? 'col xm' : 'row xt'}`">
175
+ <div v-if="vertical">
176
+ <slot name="submit"></slot>
177
+ </div>
178
+ <div v-else :style="`padding-left:${state._lw + 'em'};`">
179
+ <slot name="submit"></slot>
180
+ </div>
181
+ </div>
182
+ </div>
183
+ </slot>
184
+ </template>
185
+ <script lang="ts" setup>
186
+ import { watch, reactive, onBeforeUnmount, nextTick } from 'vue';
187
+ import { useRoute, useRouter } from 'vue-router';
188
+ import { isString, isObject, isFunction, deepcopy, isArray } from '@fekit/utils';
189
+ import {
190
+ Input,
191
+ Switch,
192
+ TextArea,
193
+ Select,
194
+ SelectList,
195
+ SelectTags,
196
+ SelectPicker,
197
+ SearchSelect,
198
+ PageSelect,
199
+ SelectTree,
200
+ MoreSelect,
201
+ MoreSelectList,
202
+ MoreSelectTags,
203
+ MoreSelectPicker,
204
+ DatePicker,
205
+ DateRangePicker,
206
+ SearchMoreSelect,
207
+ ImgUpload,
208
+ Upload,
209
+ Cascader
210
+ } from '../../form';
211
+ import { Tree } from '../../display';
212
+
213
+ const route = useRoute();
214
+ const router = useRouter();
215
+
216
+ // 计算Label行高
217
+ const clh = ({ sz = '' }: any = {}) => {
218
+ const lhs: any = { xs: 'lh-sm', s: 'lh-mm', m: 'lh-ls', l: 'lh-ll', xl: 'lh-xl' };
219
+ return lhs[sz] || 'lh-ls';
220
+ };
221
+
222
+ // 计算Label宽度
223
+ function clw(label: any = '') {
224
+ let emWidth = 0;
225
+ if (isString(label)) {
226
+ for (let i = 0; i < label.length; i++) {
227
+ const char = label[i];
228
+ if (/^[\u4e00-\u9fa5]+$/.test(char)) {
229
+ emWidth += 1;
230
+ } else {
231
+ emWidth += 0.5;
232
+ }
233
+ }
234
+ }
235
+ return emWidth;
236
+ }
237
+
238
+ // 入参
239
+ const props: any = defineProps({
240
+ // 用户是否交互
241
+ interacted: {
242
+ type: Boolean,
243
+ default: false
244
+ },
245
+ // JSON规则
246
+ form: {
247
+ type: Object,
248
+ default: () => ({})
249
+ },
250
+ // 表单数据
251
+ data: {
252
+ type: Object as any,
253
+ default: () => ({})
254
+ },
255
+ // 栅格系统
256
+ rows: {
257
+ type: String,
258
+ default: 'mob-24 pad-12 dpc-8'
259
+ },
260
+ // 如果表单是数组的话这里传入下标
261
+ idx: {
262
+ type: [String, Number],
263
+ default: ''
264
+ },
265
+ // 是否垂直排列
266
+ vertical: {
267
+ type: Boolean,
268
+ default: false
269
+ }
270
+ });
271
+
272
+ // 数据
273
+ const state: any = reactive({
274
+ form: [],
275
+ _lw: 6
276
+ });
277
+
278
+ // 监听结构
279
+ const unwatchs: any = [];
280
+ watch(
281
+ [() => props.form, () => props.data, () => props.idx],
282
+ ([form = []]) => {
283
+ const wkeys: any = {};
284
+ const onces: any = [];
285
+ state.form = deepcopy(form)?.map((item: any = {}, idx: number) => {
286
+ // 计算Label宽度
287
+ const _w = clw(item.label) + 2;
288
+ if (_w > state._lw) {
289
+ state._lw = _w;
290
+ }
291
+
292
+ if (isObject(item)) {
293
+ for (const key in item) {
294
+ let val = item[key] || {};
295
+ // 处理函数
296
+ if (isFunction(val)) {
297
+ val = val(deepcopy(props.data), props.form, route, router);
298
+ if (isObject(val)) {
299
+ if (!isFunction(val.setup)) {
300
+ val.setup = item[key];
301
+ }
302
+ if (!isArray(val.watch)) {
303
+ val.watch = deepcopy(form).map(({ field = '' }: any = {}) => field);
304
+ }
305
+ } else {
306
+ val = { value: val, setup: item[key], watch: deepcopy(form).map(({ field = '' }: any = {}) => field) };
307
+ }
308
+ }
309
+ // 对象处理
310
+ if (isObject(val)) {
311
+ const { value = null, setup = () => {}, watch: _watch = [] } = val || {};
312
+ // 监听字段为空
313
+ if (_watch.length) {
314
+ _watch?.forEach((k: any) => {
315
+ if (wkeys[k]) {
316
+ wkeys[k].push({ idx, key, value, setup });
317
+ } else {
318
+ wkeys[k] = [{ idx, key, value, setup }];
319
+ }
320
+ });
321
+ } else {
322
+ onces.push({ idx, key, value, setup });
323
+ }
324
+ item[key] = value;
325
+ } else {
326
+ item[key] = val;
327
+ }
328
+ }
329
+ }
330
+
331
+ // 模型处理
332
+ if (item.model) {
333
+ if (isString(item.model)) {
334
+ item.model = [item.model, { verify: false }];
335
+ }
336
+ } else {
337
+ item.model = ['', { verify: false }];
338
+ }
339
+ if (item.model[1] && !Object.prototype.hasOwnProperty.call(item.model[1], 'verify')) {
340
+ item.model[1].verify = false;
341
+ }
342
+
343
+ // 添加ID
344
+ item._fid = `form-${props.idx !== '' ? props.idx + '-' : ''}field-${item.field}`;
345
+
346
+ // 数据路径处理
347
+ item._data = props.data;
348
+ (item.paths?.split('.') || [])?.forEach((i: any) => {
349
+ if (item._data[i]) {
350
+ item._data = item._data[i];
351
+ }
352
+ });
353
+ return item;
354
+ });
355
+ const runsetup = (item: any = {}) => {
356
+ const { idx = null, key = null, value = null, setup = null }: any = item || {};
357
+ if (state.form[idx] && isFunction(setup)) {
358
+ const v = setup(deepcopy(props.data), state.form[idx], route, router);
359
+ nextTick(() => {
360
+ if (v instanceof Promise) {
361
+ state.form[idx][key] = value;
362
+ v.then((res: any) => {
363
+ state.form[idx][key] = res;
364
+ });
365
+ } else {
366
+ state.form[idx][key] = v;
367
+ }
368
+ });
369
+ }
370
+ };
371
+ // 执行一次
372
+ onces?.forEach((item: any = {}) => {
373
+ runsetup(item);
374
+ });
375
+ // 监听列表
376
+ for (const key in wkeys) {
377
+ unwatchs.push(
378
+ watch(
379
+ () => props.data[key],
380
+ () => {
381
+ wkeys[key]?.forEach((item: any = {}) => {
382
+ runsetup(item);
383
+ });
384
+ },
385
+ {
386
+ deep: true,
387
+ immediate: true
388
+ }
389
+ )
390
+ );
391
+ }
392
+ },
393
+ { deep: true, immediate: true }
394
+ );
395
+
396
+ // 处理
397
+ watch(
398
+ [() => state.form, () => props.data],
399
+ () => {
400
+ state.form.forEach((item: any = {}) => {
401
+ const { clear = false, field = '', paths = '' }: any = item;
402
+ if (clear) {
403
+ // 数据路径处理
404
+ let _data = props.data;
405
+ (paths?.split('.') || [])?.forEach((i: any) => {
406
+ if (_data[i]) {
407
+ _data = item._data[i];
408
+ }
409
+ });
410
+ _data[field] = isArray(_data[field]) ? [] : '';
411
+ }
412
+ });
413
+ },
414
+ { deep: true }
415
+ );
416
+
417
+ onBeforeUnmount(() => {
418
+ unwatchs?.forEach((unwatch: any) => {
419
+ unwatch();
420
+ });
421
+ });
422
+ </script>