@neatui/nuxt 0.1.0 → 1.0.1

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 (85) hide show
  1. package/BUILD.md +128 -0
  2. package/IMPORT_GUIDE.md +142 -0
  3. package/README.md +98 -1
  4. package/SSR_COMPATIBILITY.md +201 -0
  5. package/USAGE.md +291 -0
  6. package/nuxt.config.example.ts +37 -0
  7. package/package.json +34 -11
  8. package/src/components/basic/IDraggable.vue +87 -65
  9. package/src/components/basic/IFollowView.vue +32 -23
  10. package/src/components/basic/IRouterView.vue +38 -23
  11. package/src/components/basic/IScrollView.vue +11 -7
  12. package/src/components/basic/Icon.vue +17 -17
  13. package/src/components/basic/LayerView/Layer.vue +33 -106
  14. package/src/components/basic/follow.ts +133 -0
  15. package/src/components/display/Calendar.vue +14 -14
  16. package/src/components/display/CalendarReg.vue +14 -14
  17. package/src/components/display/Image.vue +8 -8
  18. package/src/components/display/PhotoEditor.vue +36 -36
  19. package/src/components/display/PhotoViewer.vue +8 -8
  20. package/src/components/display/Tree.vue +6 -6
  21. package/src/components/display/TreeView.vue +4 -4
  22. package/src/components/display/index.ts +2 -2
  23. package/src/components/form/Cascader.vue +19 -19
  24. package/src/components/form/Checkbox.vue +64 -0
  25. package/src/components/form/DatePicker.vue +6 -7
  26. package/src/components/form/DateRangePicker@v3.vue +4 -4
  27. package/src/components/form/DateRangeView@v3.vue +18 -19
  28. package/src/components/form/DateView.vue +14 -14
  29. package/src/components/form/DateView@v2.vue +14 -14
  30. package/src/components/form/DateView@v3.vue +331 -318
  31. package/src/components/form/ImgUpload.vue +7 -7
  32. package/src/components/form/Input@v3.vue +11 -11
  33. package/src/components/form/MoreSelect@v3.vue +87 -17
  34. package/src/components/form/MoreSelectList.vue +8 -8
  35. package/src/components/form/MoreSelectPanel@v3.vue +3 -3
  36. package/src/components/form/MoreSelectPicker.vue +7 -7
  37. package/src/components/form/MoreSelectTags.vue +8 -8
  38. package/src/components/form/PageMoreSelect.vue +14 -14
  39. package/src/components/form/PageSelect.vue +16 -16
  40. package/src/components/form/SearchMoreSelect.vue +12 -12
  41. package/src/components/form/SearchSelect@v3.vue +3 -3
  42. package/src/components/form/Select@v3.vue +229 -23
  43. package/src/components/form/SelectList.vue +8 -8
  44. package/src/components/form/SelectPicker.vue +6 -6
  45. package/src/components/form/SelectTags.vue +7 -7
  46. package/src/components/form/SelectTree/SelectTree@v1.vue +5 -5
  47. package/src/components/form/Switch.vue +38 -103
  48. package/src/components/form/TextArea.vue +18 -18
  49. package/src/components/form/Textarea@v2.vue +275 -0
  50. package/src/components/form/TimeView.vue +14 -14
  51. package/src/components/form/Upload.vue +806 -297
  52. package/src/components/form/date.ts +321 -0
  53. package/src/components/form/index.ts +7 -5
  54. package/src/components/form/number.ts +3 -0
  55. package/src/components/form/type.ts +224 -0
  56. package/src/components/icon/OrderIcon.vue +113 -0
  57. package/src/components/loader/FormLoader/FormLoader@v2.vue +193 -195
  58. package/src/components/loader/FormLoader/FormLoader@v3.vue.backup +372 -291
  59. package/src/components/loader/FormLoader/FormRender@v3.vue.backup +4 -0
  60. package/src/components/loader/FormLoader/NodeLoader.vue +85 -0
  61. package/src/components/loader/FormLoader@v1/FormLoader.vue +1 -1
  62. package/src/components/loader/FormLoader@v1/FormRender.vue +49 -24
  63. package/src/components/loader/LayerLoader/LayerLoader.vue +318 -0
  64. package/src/components/loader/LayerLoader/index.ts +2 -0
  65. package/src/components/loader/LayerLoader/style.scss +77 -0
  66. package/src/components/loader/LimitLoader/LimitLoader@v3.vue +39 -28
  67. package/src/components/loader/MoveLoader/MoveLoader.vue +628 -0
  68. package/src/components/loader/MoveLoader/index.ts +2 -0
  69. package/src/components/loader/MoveLoader/style.scss +77 -0
  70. package/src/components/loader/TableLoader/TableLoader.vue +227 -195
  71. package/src/components/loader/TableLoader/TableRender.vue +141 -0
  72. package/src/components/loader/TableLoader/index.ts +47 -0
  73. package/src/components/loader/index.ts +3 -2
  74. package/src/components/tools/Pagination@a.vue +17 -18
  75. package/src/components/tools/Pagination@b.vue +16 -16
  76. package/src/index.ts +2 -1
  77. package/src/module.ts +169 -0
  78. package/src/runtime/types.d.ts +36 -0
  79. package/src/store/{myui.ts → frame.ts} +4 -4
  80. package/src/utils/theme.ts +14 -0
  81. package/tsconfig.json +1 -1
  82. package/src/components/loader/FormLoader/index.ts +0 -2
  83. package/src/components/loader/LimitLoader/LimitLoader.vue.backup +0 -131
  84. package/src/components/loader/LimitLoader/LimitLoader@v2.vue.backup +0 -174
  85. package/src/components/loader/TableLoader/TableColView.vue +0 -115
package/tsconfig.json CHANGED
@@ -19,6 +19,6 @@
19
19
  },
20
20
  "lib": ["esnext", "dom", "dom.iterable", "scripthost"]
21
21
  },
22
- "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "src/shims-vue.d.ts"],
22
+ "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "src/shims-vue.d.ts", "src/components/loader/FormLoader/FormRender@v3.vue.backup", "src/components/loader/FormLoader/FormLoader@v3.vue.backup"],
23
23
  "exclude": ["node_modules"]
24
24
  }
@@ -1,2 +0,0 @@
1
- import FormLoader from './FormLoader@v2.vue';
2
- export default FormLoader;
@@ -1,131 +0,0 @@
1
- <template>
2
- <div class="full-x" ui-flex="row xt">
3
- <div ui-flex="row lm :wrap" class="mr-mm-sub my-sm-sub">
4
- <template v-for="(item, idx) in state.limit" :key="idx">
5
- <div v-if="item._view" ui-flex="row lm" v-bind="item.attrs">
6
- <span class="nr-sm flex-fixed o-ls">{{ item.label }}{{ item.label ? ':' : '' }}</span>
7
- <Select sz="s" v-if="item.model === 'Select'" class="w-mm" :options="item.enums" v-model="state.param[item.field]" />
8
- <Cascader sz="s" v-else-if="item.model === 'Cascader'" class="w-mm" :options="item.enums" v-model="state.param[item.field]" />
9
- <MoreSelect sz="s" v-else-if="item.model === 'MoreSelect'" class="w-mm" :options="item.enums" v-model="state.param[item.field]" />
10
- <SearchMoreSelect sz="s" v-else-if="item.model === 'SearchMoreSelect'" class="w-mm" :options="item.enums" v-model="state.param[item.field]" />
11
- <DatePicker v-else-if="item.model === 'DatePicker'" class="w-mm" sz="s" v-model="state.param[item.field]" @change="(val:any) => (state.param[item.field] = val)" />
12
- <DateRangePicker
13
- v-else-if="item.model === 'DateRangePicker'"
14
- class="w-ls"
15
- sz="s"
16
- v-model="state.param[item.field]"
17
- @change="(val:any) => (state.param[item.field] = val)"
18
- />
19
- <Input sz="s" v-else class="w-mm" :block="false" v-model="state.param[item.field]" />
20
- </div>
21
- </template>
22
- </div>
23
- <div ui-hide="<pad" class="mr-sl-sub my-sm-sub nowrap">
24
- <IFollowView tipBoxClass="nr-no">
25
- <button ui-btn="@a s case :border"><i class="icon icon-add2 fs-xs"></i>添加条件</button>
26
- <template v-if="state.limit.length" #tips>
27
- <div class="w-mm h-ls nr-sl" ui-scroll="x:hidden :y">
28
- <div v-for="(item, idx) in state.limit" class="item ux-hover nowrap r-ss" :key="idx">
29
- <label ui-form="@a type:checkbox" class="ny-xs nx-sm">
30
- <input type="checkbox" :checked="item._view" @change="item._view = item._view ? 0 : 1" />
31
- <span>{{ item.label }}</span>
32
- </label>
33
- </div>
34
- </div>
35
- </template>
36
- </IFollowView>
37
- <button ui-btn="@a s main" @click="fResetLimit">{{ words['common.reset'] || '重置' }}</button>
38
- </div>
39
- </div>
40
- <div ui-hide=">mob" class="mr-sl-sub my-sm-sub nowrap">
41
- <IFollowView tipBoxClass="nr-no">
42
- <button ui-btn="@a s case :border"><i class="icon icon-add2 fs-xs"></i>添加条件</button>
43
- <template v-if="state.limit.length" #tips>
44
- <div class="w-mm h-ls nr-sl" ui-scroll="x:hidden :y">
45
- <div v-for="(item, idx) in state.limit" class="item ux-hover nowrap r-ss" :key="idx">
46
- <label ui-form="@a type:checkbox" class="ny-xs nx-sm">
47
- <input type="checkbox" :checked="item._view" @change="item._view = item._view ? 0 : 1" />
48
- <span>{{ item.label }}</span>
49
- </label>
50
- </div>
51
- </div>
52
- </template>
53
- </IFollowView>
54
- <button ui-btn="@a s main" @click="fResetLimit">{{ words['common.reset'] || '重置' }}</button>
55
- </div>
56
- </template>
57
- <script setup lang="ts">
58
- import { computed, reactive, watch } from 'vue';
59
- import { useRoute } from 'vue-router';
60
- import { IFollowView } from '../../basic';
61
- import { Input, Select, MoreSelect, SearchMoreSelect, DatePicker, DateRangePicker, Cascader } from '../../form';
62
- const route = useRoute();
63
-
64
- // 外部数据
65
- const props: any = defineProps({
66
- words: {
67
- type: Object,
68
- default: () => ({})
69
- },
70
- limit: {
71
- type: Array as () => any[],
72
- default: () => []
73
- },
74
- param: {
75
- type: Object,
76
- default: () => ({})
77
- }
78
- });
79
-
80
- // 内部数据
81
- const state: any = reactive({
82
- name: computed(() => 'confs' + route.path?.replace(/\//g, '_')),
83
- limit: computed(() => {
84
- const _cache = JSON.parse(localStorage.getItem(`${state.name}_limit`) || '{}');
85
- return (props.limit || [])?.map((item: any) => {
86
- if (_cache[item.field] && Object.prototype.hasOwnProperty.call(_cache[item.field], '_view')) {
87
- item._view = _cache[item.field]?._view;
88
- } else {
89
- if (item.view === true || item.view === 1 || item.view === 'always') {
90
- item._view = 1;
91
- }
92
- }
93
- return item;
94
- });
95
- }),
96
- param: {}
97
- });
98
- watch(
99
- [() => state.limit],
100
- () => {
101
- const _limit: any = {};
102
- state.limit.forEach((item: any, idx: number) => {
103
- if (Object.prototype.hasOwnProperty.call(item, '_view')) {
104
- _limit[item.field] = { _view: item._view ? 1 : 0 };
105
- if (!item._view) {
106
- delete state.param[item.field];
107
- }
108
- }
109
- });
110
- localStorage.setItem(`${state.name}_limit`, JSON.stringify(_limit));
111
- },
112
- { deep: true }
113
- );
114
-
115
- watch(
116
- () => props.param,
117
- () => {
118
- state.param = props.param;
119
- },
120
- { deep: true, immediate: true }
121
- );
122
-
123
- // 重置筛选
124
- const fResetLimit = () => {
125
- for (const key in state.param) {
126
- if (key !== 'page' && key !== 'pageSize') {
127
- delete state.param[key];
128
- }
129
- }
130
- };
131
- </script>
@@ -1,174 +0,0 @@
1
- <template>
2
- <div class="full-x" ui-flex="row xt">
3
- <div ui-flex="row lm :wrap" class="mr-mm-sub my-sm-sub">
4
- <template v-for="(item, idx) in state.limit" :key="idx">
5
- <div v-if="item._view" ui-flex="row lm" v-bind="{ ...(item.attrs || {}) }">
6
- <span class="nr-sm flex-fixed o-ls">{{ item.label }}{{ item.label ? ':' : '' }}</span>
7
- <Select sz="s" v-if="item.model[0] === 'Select'" :options="item.enums" v-model="state.param[item.field]" v-bind="{ ...(item.model[1] || {}) }" />
8
- <Cascader sz="s" v-else-if="item.model[0] === 'Cascader'" :options="item.enums" v-model="state.param[item.field]" v-bind="{ ...(item.model[1] || {}) }" />
9
- <MoreSelect sz="s" v-else-if="item.model[0] === 'MoreSelect'" :options="item.enums" v-model="state.param[item.field]" v-bind="{ ...(item.model[1] || {}) }" />
10
- <SearchMoreSelect sz="s" v-else-if="item.model[0] === 'SearchMoreSelect'" :options="item.enums" v-model="state.param[item.field]" v-bind="{ ...(item.model[1] || {}) }" />
11
- <DatePicker
12
- v-else-if="item.model[0] === 'DatePicker'"
13
- sz="s"
14
- v-model="state.param[item.field]"
15
- @change="(val:any) => (state.param[item.field] = val)"
16
- v-bind="{ ...(item.model[1] || {}) }"
17
- />
18
- <DateRangePicker
19
- v-else-if="item.model[0] === 'DateRangePicker'"
20
- sz="s"
21
- v-model="state.param[item.field]"
22
- @change="(val:any) => (state.param[item.field] = val)"
23
- v-bind="{ ...(item.model[1] || {}) }"
24
- />
25
- <Input sz="s" v-else :block="false" v-model="state.param[item.field]" v-bind="{ ...(item.model[1] || {}) }" />
26
- </div>
27
- </template>
28
- </div>
29
- <div ui-hide="<pad" class="mr-sl-sub my-sm-sub nowrap">
30
- <IFollowView tipBoxClass="nr-no">
31
- <button ui-btn="@a s case :border"><i class="icon icon-add2 fs-xs"></i>添加条件</button>
32
- <template v-if="state.limit.length" #tips>
33
- <div class="w-mm h-ls nr-sl" ui-scroll="x:hidden :y">
34
- <div v-for="(item, idx) in state.limit" class="item ux-hover nowrap r-ss" :key="idx">
35
- <label ui-form="@a type:checkbox" class="ny-xs nx-sm">
36
- <input type="checkbox" :checked="item._view" @change="item._view = item._view ? 0 : 1" />
37
- <span>{{ item.label }}</span>
38
- </label>
39
- </div>
40
- </div>
41
- </template>
42
- </IFollowView>
43
- <button ui-btn="@a s main" @click="fResetLimit">{{ words['common.reset'] || '重置' }}</button>
44
- </div>
45
- </div>
46
- <div ui-hide=">mob" class="mr-sl-sub my-sm-sub nowrap">
47
- <IFollowView tipBoxClass="nr-no">
48
- <button ui-btn="@a s case :border"><i class="icon icon-add2 fs-xs"></i>添加条件</button>
49
- <template v-if="state.limit.length" #tips>
50
- <div class="w-mm h-ls nr-sl" ui-scroll="x:hidden :y">
51
- <div v-for="(item, idx) in state.limit" class="item ux-hover nowrap r-ss" :key="idx">
52
- <label ui-form="@a type:checkbox" class="ny-xs nx-sm">
53
- <input type="checkbox" :checked="item._view" @change="item._view = item._view ? 0 : 1" />
54
- <span>{{ item.label }}</span>
55
- </label>
56
- </div>
57
- </div>
58
- </template>
59
- </IFollowView>
60
- <button ui-btn="@a s main" @click="fResetLimit">{{ words['common.reset'] || '重置' }}</button>
61
- </div>
62
- </template>
63
- <script setup lang="ts">
64
- import { computed, reactive, watch } from 'vue';
65
- import { useRoute } from 'vue-router';
66
- import { isString } from '@fekit/utils';
67
- import { IFollowView } from '../../basic';
68
- import { Input, Select, MoreSelect, SearchMoreSelect, DatePicker, DateRangePicker, Cascader } from '../../form';
69
- const route = useRoute();
70
-
71
- /**
72
- * 入参说明
73
- *
74
- * words 语言包
75
- * limit 结构配置
76
- * param 数据
77
- */
78
-
79
- interface LimitProps {
80
- label?: string | (() => string);
81
- field: string | (() => string);
82
- model?: string | Array<any> | (() => string | Array<any>);
83
- enums?: Array<any> | (() => string | Array<any>);
84
- rules?: Array<any> | (() => string | Array<any>);
85
- event?: Array<any> | (() => string | Array<any>);
86
- attrs?: Array<any> | (() => string | Array<any>);
87
- value?: any | (() => any);
88
- clear?: boolean | (() => boolean);
89
- close?: boolean;
90
- }
91
-
92
- // 类型
93
- interface Props {
94
- words?: { [key: string | number]: any };
95
- limit: Array<LimitProps>;
96
- param: any;
97
- }
98
- const props: any = withDefaults(defineProps<Props>(), {
99
- words: () => ({}),
100
- limit: () => [],
101
- param: () => ({})
102
- });
103
-
104
- // 内部数据
105
- const state: any = reactive({
106
- name: computed(() => 'confs' + route.path?.replace(/\//g, '_')),
107
- limit: computed(() => {
108
- const _cache = JSON.parse(localStorage.getItem(`${state.name}_limit`) || '{}');
109
- return (props.limit || [])?.map((item: any) => {
110
- if (_cache[item.field] && Object.prototype.hasOwnProperty.call(_cache[item.field], '_view')) {
111
- item._view = _cache[item.field]?._view;
112
- } else {
113
- if (item.view === true || item.view === 1 || item.view === 'always') {
114
- item._view = 1;
115
- }
116
- }
117
-
118
- // 模型处理
119
- if (item.model) {
120
- if (isString(item.model)) {
121
- item.model = [item.model, { verify: false }];
122
- }
123
- } else {
124
- item.model = ['Input', { verify: false }];
125
- }
126
-
127
- // 属性处理
128
- if (item.model[1].class) {
129
- if (!/\bw-[sml]+/.test(item.model[1].class || '')) {
130
- item.model[1].class += ' w-mm';
131
- }
132
- } else {
133
- item.model[1].class = 'w-mm';
134
- }
135
-
136
- return item;
137
- });
138
- }),
139
- param: {}
140
- });
141
- watch(
142
- [() => state.limit],
143
- () => {
144
- const _limit: any = {};
145
- state.limit.forEach((item: any, idx: number) => {
146
- if (Object.prototype.hasOwnProperty.call(item, '_view')) {
147
- _limit[item.field] = { _view: item._view ? 1 : 0 };
148
- if (!item._view) {
149
- delete state.param[item.field];
150
- }
151
- }
152
- });
153
- localStorage.setItem(`${state.name}_limit`, JSON.stringify(_limit));
154
- },
155
- { deep: true }
156
- );
157
-
158
- watch(
159
- () => props.param,
160
- () => {
161
- state.param = props.param;
162
- },
163
- { deep: true, immediate: true }
164
- );
165
-
166
- // 重置筛选
167
- const fResetLimit = () => {
168
- for (const key in state.param) {
169
- if (key !== 'page' && key !== 'pageSize') {
170
- delete state.param[key];
171
- }
172
- }
173
- };
174
- </script>
@@ -1,115 +0,0 @@
1
- <template>
2
- <template v-if="isArray(json.child)">
3
- <div :class="json?.attrs?.class?.includes('wrap') ? 'wrap' : 'nowrap'" v-bind="json.attrs" v-on="event(json, data)">
4
- <TableColView v-for="(sub, idx) in col.child" :key="idx" :col="sub" :data="data" />
5
- </div>
6
- </template>
7
- <template v-else-if="json.popup">
8
- <IFollowView>
9
- <TableColView :col="{ ...col, popup: null }" :data="data" />
10
- <template #tips>
11
- <TableColView :col="isFunction(col.popup) ? col.popup(data) : col.popup" :data="data" />
12
- </template>
13
- </IFollowView>
14
- </template>
15
- <template v-else>
16
- <div v-if="json.model === 'Image'" :class="json?.attrs?.class?.includes('wrap') ? 'wrap' : 'nowrap'" ui-img="@a read :round" v-bind="json.attrs" v-on="event(json, data)">
17
- <img :src="json.value || data[json.field] || DefaultImage" alt="" />
18
- </div>
19
- <div
20
- v-else
21
- :class="json?.attrs?.class?.includes('wrap') ? 'wrap' : 'nowrap'"
22
- v-bind="json.attrs"
23
- v-on="event(json, data)"
24
- v-html="
25
- json.value !== null && json.value !== undefined
26
- ? isFunction(json.value)
27
- ? json.value(json)
28
- : json.value
29
- : findEnumName(json.enums, data[json.field]) !== null && findEnumName(json.enums, data[json.field]) !== undefined
30
- ? findEnumName(json.enums, data[json.field])
31
- : '‐‐'
32
- "
33
- ></div>
34
- </template>
35
- </template>
36
- <script lang="ts" setup>
37
- import { computed } from 'vue';
38
- import { isFunction, isArray, isObject, deepcopy } from '@fekit/utils';
39
- import { useRoute, useRouter } from 'vue-router';
40
- import TableColView from './TableColView.vue';
41
- import { IFollowView } from '../../basic';
42
-
43
- const DefaultImage =
44
- 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKYAAACmBAMAAACipulEAAAAHlBMVEXMzMz////z8/Pf39/Z2dnS0tLq6urk5OTu7u74+PjCLuPVAAABxUlEQVRo3u2YsUsDMRSHX9Wzupn22qObVxAd7SCuV1BwvGrVtQcqjlYQHFVEVzv575qklReE9urlFTL8vqUvQz+Se3m5yyMAAAAAAAAAAAAAsFIu7rvz+DiqprxSi7itotxQi8kqOHslzqbHNAUnul3q/PJYutzi01Jn47/KSBm+jxep8yopSojqgklaV5qRDor5zsMKTru4gazTJmEtfKcyQU3Waf/UE3bGXPb7p5fDRwmnuhkWyvJEhmt/JzOiKZtyzph+6Us5O1zY0UTI2TKy5+4nl5W/M9PpT00NmEDG2dbDgiMR5w7R1ix84brycz7oyfGU6yLO3HmIGUUSzoY9m3jxqYAzsRuIt9VYwBm7Z1OTB57Owt1XfQFn649zEOg8YzctiYyz6Wpizxzxcmtunb5K1JGtR65TkdrMiCazsMOHnZ9zlx9ozHXq5XTfyBnr/ZwdPTy30Z6OJr5OfhOf6d934tPZ15mQJjrJSVN4O3mi/NEg5GzkNCVKBZy8estYeTuZdmbuDYWScDIHd29KSTmZEJ26GsUvxpEqJw/gDrvMXTuInsASvYsgeizlvaBAelZlvTUAAAAAAAAAAAAAsEp+AEDOpCBEwOONAAAAAElFTkSuQmCC';
45
-
46
- // 通过枚举值查找枚举名
47
- const findEnumName = (enums: any, val: any, join: boolean | string = ' Ι ') => {
48
- // 转换核心
49
- const _core = (v: any) => {
50
- const { label = v }: any = enums.find(({ value = '' }: any) => value == v) || {};
51
- return label;
52
- };
53
- // 判断枚举字典是否可用
54
- if (enums && enums.find) {
55
- // 兼容多种入参类型
56
- if (isArray(val)) {
57
- // 数组
58
- const arr = val.map((i: any) => _core(i));
59
- return join ? arr.join(join) : arr;
60
- } else {
61
- return _core(val);
62
- }
63
- } else {
64
- return val;
65
- }
66
- };
67
-
68
- const route = useRoute();
69
- const router = useRouter();
70
-
71
- const props: any = defineProps({
72
- col: {
73
- type: Object,
74
- default: () => ({})
75
- },
76
- data: {
77
- type: [Object],
78
- default: () => ({})
79
- }
80
- });
81
-
82
- // 运行函数计算
83
- const runfun = (obj: any): any => {
84
- if (isArray(obj)) {
85
- obj = obj.map((i: any) => runfun(i));
86
- } else if (isObject(obj)) {
87
- for (const k in obj) {
88
- if (k !== 'event') {
89
- obj[k] = runfun(obj[k]);
90
- }
91
- }
92
- } else if (isFunction(obj)) {
93
- obj = obj(deepcopy(props.data));
94
- }
95
- return obj;
96
- };
97
-
98
- const json = computed(() => runfun(deepcopy(props.col)));
99
-
100
- // 事件处理
101
- const event: any = (col: any, data: any): object => {
102
- const _event: any = {};
103
- if (isObject(col.event)) {
104
- for (const key in col.event) {
105
- const fun = col.event[key];
106
- if (isFunction(fun)) {
107
- _event[key] = (...args: any) => {
108
- return fun({ data, route, router }, ...args);
109
- };
110
- }
111
- }
112
- }
113
- return { ..._event };
114
- };
115
- </script>